code: def read_submissions_from_directory(dirname, use_gpu):
    
    result = []
    for sub_dir in os.listdir(dirname):
      submission_path = os.path.join(dirname, sub_dir)
      try:
        if not os.path.isdir(submission_path):
          continue
        if not os.path.exists(os.path.join(submission_path, 'metadata.json')):
          continue
        with open(os.path.join(submission_path, 'metadata.json')) as f:
          metadata = json.load(f)
        if use_gpu and ('container_gpu' in metadata):
          container = metadata['container_gpu']
        else:
          container = metadata['container']
        entry_point = metadata['entry_point']
        submission_type = metadata['type']
        if submission_type == 'attack' or submission_type == 'targeted_attack':
          submission = Attack(submission_path, container, entry_point, use_gpu)
        elif submission_type == 'defense':
          submission = Defense(submission_path, container, entry_point, use_gpu)
        else:
          raise ValueError('Invalid type of submission: %s' % submission_type)
        result.append(submission)
      except (IOError, KeyError, ValueError):
        print('Failed to read submission from directory ', submission_path)
    return result
docs: Scans directory and read all submissions.
  
    Args:
      dirname: directory to scan.
      use_gpu: whether submissions should use GPU. This argument is
        used to pick proper Docker container for each submission and create
        instance of Attack or Defense class.
  
    Returns:
      List with submissions (subclasses of Submission class).