code: def flatten_stmts(stmts):
      
      total_stmts = set(stmts)
      for stmt in stmts:
          if stmt.supported_by:
              children = flatten_stmts(stmt.supported_by)
              total_stmts = total_stmts.union(children)
      return list(total_stmts)
docs: Return the full set of unique stms in a pre-assembled stmt graph.
  
      The flattened list of statements returned by this function can be
      compared to the original set of unique statements to make sure no
      statements have been lost during the preassembly process.
  
      Parameters
      ----------
      stmts : list of :py:class:`indra.statements.Statement`
          A list of top-level statements with associated supporting statements
          resulting from building a statement hierarchy with
          :py:meth:`combine_related`.
  
      Returns
      -------
      stmts : list of :py:class:`indra.statements.Statement`
          List of all statements contained in the hierarchical statement graph.
  
      Examples
      --------
      Calling :py:meth:`combine_related` on two statements results in one
      top-level statement; calling :py:func:`flatten_stmts` recovers both:
  
      >>> from indra.preassembler.hierarchy_manager import hierarchies
      >>> braf = Agent('BRAF')
      >>> map2k1 = Agent('MAP2K1')
      >>> st1 = Phosphorylation(braf, map2k1)
      >>> st2 = Phosphorylation(braf, map2k1, residue='S')
      >>> pa = Preassembler(hierarchies, [st1, st2])
      >>> pa.combine_related() # doctest:+ELLIPSIS
      [Phosphorylation(BRAF(), MAP2K1(), S)]
      >>> flattened = flatten_stmts(pa.related_stmts)
      >>> flattened.sort(key=lambda x: x.matches_key())
      >>> flattened
      [Phosphorylation(BRAF(), MAP2K1()), Phosphorylation(BRAF(), MAP2K1(), S)]