docs: def parse(self, data):
          """
          populate instance with values and sub-sections
          :param data: UTF-8 encoded manifest
          :type data: bytes
          """
  
          data = data.decode('utf-8')
          self.linesep = detect_linesep(data)
  
          # the first section is the main one for the manifest. It's
          # also where we will check for our newline separator
          sections = parse_sections(data)
          self.load(next(sections))
  
          # and all following sections are considered sub-sections
          for section in sections:
              next_section = ManifestSection(None)
              next_section.load(section)
              self.sub_sections[next_section.primary()] = next_section