code: def to_lines(s):
      
      lines = s.splitlines(True)
      if not lines:
          return ['']
      if lines[-1].splitlines() != [lines[-1]]:
          lines.append('')
      for i,l in enumerate(lines):
          l2 = l.splitlines()
          assert len(l2) in (0,1)
          lines[i] = l2[0] if l2 else ''
      if PY2 and isinstance(s, str):
          # Manually split on \f and \v
          lines = [
              lf for l in lines
                 for lv in l.split('\v')
                 for lf in lv.split('\f')
          ]
      return lines
docs: Like `str.splitlines()`, except that an empty string results in a
      one-element list and a trailing newline results in a trailing empty string
      (and all without re-implementing Python's changing line-splitting
      algorithm).
  
      >>> to_lines('')
      ['']
      >>> to_lines('\\n')
      ['', '']
      >>> to_lines('foo')
      ['foo']
      >>> to_lines('foo\\n')
      ['foo', '']
      >>> to_lines('foo\\nbar')
      ['foo', 'bar']
      >>> to_lines('foo\\fbar')
      ['foo', 'bar']
      >>> to_lines('foo\\vbar')
      ['foo', 'bar']