| Index: xfa/src/fxfa/src/parser/xfa_parser_imp.cpp
 | 
| diff --git a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp
 | 
| index 9e85c1f539c852461e24443a882adb910f5d899b..48547d7e9f3ec09e6b4a391402fa6a42d34cd6a7 100644
 | 
| --- a/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp
 | 
| +++ b/xfa/src/fxfa/src/parser/xfa_parser_imp.cpp
 | 
| @@ -386,12 +386,12 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|            pXMLDocumentNode, XFA_GetPacketByIndex(XFA_PACKET_XDP)->pName,
 | 
|            XFA_GetPacketByIndex(XFA_PACKET_XDP)->pURI,
 | 
|            XFA_GetPacketByIndex(XFA_PACKET_XDP)->eFlags)) {
 | 
| -    return NULL;
 | 
| +    return nullptr;
 | 
|    }
 | 
|    CXFA_Node* pXFARootNode =
 | 
|        m_pFactory->CreateNode(XFA_XDPPACKET_XDP, XFA_ELEMENT_Xfa);
 | 
|    if (!pXFARootNode) {
 | 
| -    return NULL;
 | 
| +    return nullptr;
 | 
|    }
 | 
|    m_pRootNode = pXFARootNode;
 | 
|    pXFARootNode->SetCData(XFA_ATTRIBUTE_Name, FX_WSTRC(L"xfa"));
 | 
| @@ -408,8 +408,8 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| -  IFDE_XMLNode* pXMLConfigDOMRoot = NULL;
 | 
| -  CXFA_Node* pXFAConfigDOMRoot = NULL;
 | 
| +  IFDE_XMLNode* pXMLConfigDOMRoot = nullptr;
 | 
| +  CXFA_Node* pXFAConfigDOMRoot = nullptr;
 | 
|    {
 | 
|      for (IFDE_XMLNode* pChildItem =
 | 
|               pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
 | 
| @@ -423,7 +423,7 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|        }
 | 
|        if (CXFA_Node* pChildNode =
 | 
|                pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
 | 
| -        return NULL;
 | 
| +        return nullptr;
 | 
|        }
 | 
|        pXMLConfigDOMRoot = pChildItem;
 | 
|        pXFAConfigDOMRoot =
 | 
| @@ -431,8 +431,9 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|        pXFARootNode->InsertChild(pXFAConfigDOMRoot, NULL);
 | 
|      }
 | 
|    }
 | 
| -  IFDE_XMLNode* pXMLDatasetsDOMRoot = NULL;
 | 
| -  IFDE_XMLNode* pXMLFormDOMRoot = NULL;
 | 
| +  IFDE_XMLNode* pXMLDatasetsDOMRoot = nullptr;
 | 
| +  IFDE_XMLNode* pXMLFormDOMRoot = nullptr;
 | 
| +  IFDE_XMLNode* pXMLTemplateDOMRoot = nullptr;
 | 
|    {
 | 
|      for (IFDE_XMLNode* pChildItem =
 | 
|               pXMLDocumentNode->GetNodeItem(IFDE_XMLNode::FirstChild);
 | 
| @@ -453,7 +454,7 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|          if (!XFA_FDEExtension_MatchNodeName(pElement, pPacketInfo->pName,
 | 
|                                              pPacketInfo->pURI,
 | 
|                                              pPacketInfo->eFlags)) {
 | 
| -          pPacketInfo = NULL;
 | 
| +          pPacketInfo = nullptr;
 | 
|          }
 | 
|        }
 | 
|        XFA_XDPPACKET ePacket =
 | 
| @@ -463,29 +464,41 @@ CXFA_Node* CXFA_SimpleParser::ParseAsXDPPacket_XDP(
 | 
|        }
 | 
|        if (ePacket == XFA_XDPPACKET_Datasets) {
 | 
|          if (pXMLDatasetsDOMRoot) {
 | 
| -          pXMLDatasetsDOMRoot = NULL;
 | 
| -          return NULL;
 | 
| +          return nullptr;
 | 
|          }
 | 
|          pXMLDatasetsDOMRoot = pElement;
 | 
|        } else if (ePacket == XFA_XDPPACKET_Form) {
 | 
|          if (pXMLFormDOMRoot) {
 | 
| -          pXMLFormDOMRoot = NULL;
 | 
| -          return NULL;
 | 
| +          return nullptr;
 | 
|          }
 | 
|          pXMLFormDOMRoot = pElement;
 | 
| +      } else if (ePacket == XFA_XDPPACKET_Template) {
 | 
| +        if (pXMLTemplateDOMRoot) {
 | 
| +          // Found a duplicate template packet.
 | 
| +          return nullptr;
 | 
| +        }
 | 
| +        CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
 | 
| +        if (pPacketNode) {
 | 
| +          pXMLTemplateDOMRoot = pElement;
 | 
| +          pXFARootNode->InsertChild(pPacketNode);
 | 
| +        }
 | 
|        } else {
 | 
|          CXFA_Node* pPacketNode = ParseAsXDPPacket(pElement, ePacket);
 | 
|          if (pPacketNode) {
 | 
|            if (pPacketInfo &&
 | 
|                (pPacketInfo->eFlags & XFA_XDPPACKET_FLAGS_SUPPORTONE) &&
 | 
|                pXFARootNode->GetFirstChildByName(pPacketInfo->uHash)) {
 | 
| -            return NULL;
 | 
| +            return nullptr;
 | 
|            }
 | 
|            pXFARootNode->InsertChild(pPacketNode);
 | 
|          }
 | 
|        }
 | 
|      }
 | 
|    }
 | 
| +  if (!pXMLTemplateDOMRoot) {
 | 
| +    // No template is found.
 | 
| +    return nullptr;
 | 
| +  }
 | 
|    if (pXMLDatasetsDOMRoot) {
 | 
|      CXFA_Node* pPacketNode =
 | 
|          ParseAsXDPPacket(pXMLDatasetsDOMRoot, XFA_XDPPACKET_Datasets);
 | 
| 
 |