code: def split_data_cwl_items(items, default_keys=None):
      
      key_lens = set([])
      for data in items:
          key_lens.add(len(_get_all_cwlkeys([data], default_keys)))
      extra_key_len = min(list(key_lens)) if len(key_lens) > 1 else None
      data_out = []
      extra_out = []
      for data in items:
          if extra_key_len and len(_get_all_cwlkeys([data], default_keys)) == extra_key_len:
              extra_out.append(data)
          else:
              data_out.append(data)
      if len(extra_out) == 0:
          return data_out, {}
      else:
          cwl_keys = extra_out[0]["cwl_keys"]
          for extra in extra_out[1:]:
              cur_cwl_keys = extra["cwl_keys"]
              assert cur_cwl_keys == cwl_keys, pprint.pformat(extra_out)
          cwl_extras = collections.defaultdict(list)
          for data in items:
              for key in cwl_keys:
                  cwl_extras[key].append(data[key])
          data_final = []
          for data in data_out:
              for key in cwl_keys:
                  data.pop(key)
              data_final.append(data)
          return data_final, dict(cwl_extras)
docs: Split a set of CWL output dictionaries into data samples and CWL items.
  
      Handles cases where we're arrayed on multiple things, like a set of regional
      VCF calls and data objects.