'Parse a v3 network status document.
:param str raw_content: raw network status document data
:param bool validate: **True** if the document is to be validated, **False** otherwise
:param bool default_params: includes defaults in our params dict, otherwise
it just contains values from the document
:raises: **ValueError** if the document is invalid'

def __init__(self, raw_content, validate=False, default_params=True):

    super(NetworkStatusDocumentV3, self).__init__(raw_content, lazy_load=(not validate))
    document_file = io.BytesIO(raw_content)
    self._default_params = default_params
    self._header(document_file, validate)
    self.directory_authorities = tuple(stem.descriptor.router_status_entry._parse_file(document_file, validate, entry_class=DirectoryAuthority, entry_keyword=AUTH_START, section_end_keywords=(ROUTERS_START, FOOTER_START, V2_FOOTER_START), extra_args=(self.is_vote,)))
    if (validate and self.is_vote and (len(self.directory_authorities) != 1)):
        raise ValueError(('Votes    should    only    have    an    authority    entry    for    the    one    that    issued    it,    got    %i:    %s' % (len(self.directory_authorities), self.directory_authorities)))
    router_iter = stem.descriptor.router_status_entry._parse_file(document_file, validate, entry_class=(RouterStatusEntryMicroV3 if self.is_microdescriptor else RouterStatusEntryV3), entry_keyword=ROUTERS_START, section_end_keywords=(FOOTER_START, V2_FOOTER_START), extra_args=(self,))
    self.routers = dict(((desc.fingerprint, desc) for desc in router_iter))
    self._footer(document_file, validate)
