docs: def ReadFlowResults(self,
                        client_id,
                        flow_id,
                        offset,
                        count,
                        with_tag=None,
                        with_type=None,
                        with_substring=None):
      """Reads flow results of a given flow using given query options."""
      results = sorted(
          [x.Copy() for x in self.flow_results.get((client_id, flow_id), [])],
          key=lambda r: r.timestamp)
  
      # This is done in order to pass the tests that try to deserialize
      # value of an unrecognized type.
      for r in results:
        cls_name = compatibility.GetName(r.payload.__class__)
        if cls_name not in rdfvalue.RDFValue.classes:
          r.payload = rdf_objects.SerializedValueOfUnrecognizedType(
              type_name=cls_name, value=r.payload.SerializeToString())
  
      if with_tag is not None:
        results = [i for i in results if i.tag == with_tag]
  
      if with_type is not None:
        results = [
            i for i in results
            if compatibility.GetName(i.payload.__class__) == with_type
        ]
  
      if with_substring is not None:
        encoded_substring = with_substring.encode("utf8")
        results = [
            i for i in results
            if encoded_substring in i.payload.SerializeToString()
        ]
  
      return results[offset:offset + count]