/*** Autogenerated by WIDL 9.18 from include/windows.data.xml.dom.idl - Do not edit ***/

#ifdef _WIN32
#ifndef __REQUIRED_RPCNDR_H_VERSION__
#define __REQUIRED_RPCNDR_H_VERSION__ 475
#endif
#include <rpc.h>
#include <rpcndr.h>
#endif

#ifndef COM_NO_WINDOWS_H
#include <windows.h>
#include <ole2.h>
#endif

#ifndef __windows_data_xml_dom_h__
#define __windows_data_xml_dom_h__

#ifndef __WIDL_INLINE
#if defined(__cplusplus) || defined(_MSC_VER)
#define __WIDL_INLINE inline
#elif defined(__GNUC__)
#define __WIDL_INLINE __inline__
#endif
#endif

/* Forward declarations */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdEntity;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdNotation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlAttribute;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCDataSection;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCharacterData;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlComment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocument;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentFragment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentType;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDomImplementation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlElement;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlEntityReference;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlLoadSettings;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNamedNodeMap;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNode;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeList;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSelector;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSerializer;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlProcessingInstruction;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlText;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class DtdEntity;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CDtdEntity;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdEntity_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class DtdNotation;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CDtdNotation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CDtdNotation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlAttribute;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlAttribute_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlCDataSection;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlCDataSection_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlComment;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlComment __x_ABI_CWindows_CData_CXml_CDom_CXmlComment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlComment_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocument;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CXmlDocument;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocument_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocumentFragment;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentFragment_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDocumentType;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDocumentType_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlDomImplementation;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlDomImplementation_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlElement;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlElement __x_ABI_CWindows_CData_CXml_CDom_CXmlElement;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlElement_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlEntityReference;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlEntityReference_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlLoadSettings;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlLoadSettings_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlNamedNodeMap;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNamedNodeMap_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlNodeList;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlNodeList_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlProcessingInstruction;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlProcessingInstruction_FWD_DEFINED__ */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__
#ifdef __cplusplus
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    class XmlText;
                }
            }
        }
    }
}
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CXmlText __x_ABI_CWindows_CData_CXml_CDom_CXmlText;
#endif /* defined __cplusplus */
#endif /* defined ____x_ABI_CWindows_CData_CXml_CDom_CXmlText_FWD_DEFINED__ */

#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

/* Headers for imported files */

#include <inspectable.h>
#include <asyncinfo.h>
#include <eventtoken.h>
#include <windowscontracts.h>
#include <windows.foundation.h>
#include <windows.storage.h>
#include <windows.storage.streams.h>

#ifdef __cplusplus
extern "C" {
#endif

#ifndef __cplusplus
typedef enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType;
#endif /* __cplusplus */

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity ABI::Windows::Data::Xml::Dom::IDtdEntity
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdEntity;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation ABI::Windows::Data::Xml::Dom::IDtdNotation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IDtdNotation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute ABI::Windows::Data::Xml::Dom::IXmlAttribute
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlAttribute;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection ABI::Windows::Data::Xml::Dom::IXmlCDataSection
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCDataSection;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData ABI::Windows::Data::Xml::Dom::IXmlCharacterData
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlCharacterData;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment ABI::Windows::Data::Xml::Dom::IXmlComment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlComment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument ABI::Windows::Data::Xml::Dom::IXmlDocument
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocument;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentFragment;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO ABI::Windows::Data::Xml::Dom::IXmlDocumentIO
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 ABI::Windows::Data::Xml::Dom::IXmlDocumentIO2
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentIO2;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics ABI::Windows::Data::Xml::Dom::IXmlDocumentStatics
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentStatics;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType ABI::Windows::Data::Xml::Dom::IXmlDocumentType
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDocumentType;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation ABI::Windows::Data::Xml::Dom::IXmlDomImplementation
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlDomImplementation;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement ABI::Windows::Data::Xml::Dom::IXmlElement
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlElement;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference ABI::Windows::Data::Xml::Dom::IXmlEntityReference
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlEntityReference;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings ABI::Windows::Data::Xml::Dom::IXmlLoadSettings
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlLoadSettings;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNamedNodeMap;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode ABI::Windows::Data::Xml::Dom::IXmlNode
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNode;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList ABI::Windows::Data::Xml::Dom::IXmlNodeList
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeList;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector ABI::Windows::Data::Xml::Dom::IXmlNodeSelector
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSelector;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer ABI::Windows::Data::Xml::Dom::IXmlNodeSerializer
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlNodeSerializer;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlProcessingInstruction;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_FWD_DEFINED__
typedef interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText;
#ifdef __cplusplus
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText ABI::Windows::Data::Xml::Dom::IXmlText
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    interface IXmlText;
                }
            }
        }
    }
}
#endif /* __cplusplus */
#endif

#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_FWD_DEFINED__
typedef interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode;
#ifdef __cplusplus
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode ABI::Windows::Foundation::Collections::IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* >
#endif /* __cplusplus */
#endif

#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_FWD_DEFINED__
typedef interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument;
#ifdef __cplusplus
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* >
#endif /* __cplusplus */
#endif

#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifdef __cplusplus
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    enum NodeType {
                        NodeType_Invalid = 0,
                        NodeType_ElementNode = 1,
                        NodeType_AttributeNode = 2,
                        NodeType_TextNode = 3,
                        NodeType_DataSectionNode = 4,
                        NodeType_EntityReferenceNode = 5,
                        NodeType_EntityNode = 6,
                        NodeType_ProcessingInstructionNode = 7,
                        NodeType_CommentNode = 8,
                        NodeType_DocumentNode = 9,
                        NodeType_DocumentTypeNode = 10,
                        NodeType_DocumentFragmentNode = 11,
                        NodeType_NotationNode = 12
                    };
                }
            }
        }
    }
}
extern "C" {
#else
enum __x_ABI_CWindows_CData_CXml_CDom_CNodeType {
    NodeType_Invalid = 0,
    NodeType_ElementNode = 1,
    NodeType_AttributeNode = 2,
    NodeType_TextNode = 3,
    NodeType_DataSectionNode = 4,
    NodeType_EntityReferenceNode = 5,
    NodeType_EntityNode = 6,
    NodeType_ProcessingInstructionNode = 7,
    NodeType_CommentNode = 8,
    NodeType_DocumentNode = 9,
    NodeType_DocumentTypeNode = 10,
    NodeType_DocumentFragmentNode = 11,
    NodeType_NotationNode = 12
};
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define NodeType __x_ABI_CWindows_CData_CXml_CDom_CNodeType
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */
/*****************************************************************************
 * IDtdEntity interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6a0b5ffc-63b4-480f-9e6a-8a92816aade4")
                    IDtdEntity : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NotationName(
                            IInspectable **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity, 0x6a0b5ffc, 0x63b4, 0x480f, 0x9e,0x6a, 0x8a,0x92,0x81,0x6a,0xad,0xe4)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        TrustLevel *trustLevel);

    /*** IDtdEntity methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_NotationName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity *This,
        IInspectable **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDtdEntity methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(This,value) (This)->lpVtbl->get_NotationName(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDtdEntity methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_PublicId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_SystemId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity* This,IInspectable **value) {
    return This->lpVtbl->get_NotationName(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IDtdEntity IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
#define IDtdEntityVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntityVtbl
#define IDtdEntity __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity
#define IDtdEntity_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_QueryInterface
#define IDtdEntity_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_AddRef
#define IDtdEntity_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_Release
#define IDtdEntity_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetIids
#define IDtdEntity_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetRuntimeClassName
#define IDtdEntity_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_GetTrustLevel
#define IDtdEntity_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_PublicId
#define IDtdEntity_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_SystemId
#define IDtdEntity_get_NotationName __x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_get_NotationName
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdEntity_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IDtdNotation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("8cb4e04d-6d46-4edb-ab73-df83c51ad397")
                    IDtdNotation : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_PublicId(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_SystemId(
                            IInspectable **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation, 0x8cb4e04d, 0x6d46, 0x4edb, 0xab,0x73, 0xdf,0x83,0xc5,0x1a,0xd3,0x97)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        TrustLevel *trustLevel);

    /*** IDtdNotation methods ***/
    HRESULT (STDMETHODCALLTYPE *get_PublicId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_SystemId)(
        __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation *This,
        IInspectable **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IDtdNotation methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(This,value) (This)->lpVtbl->get_PublicId(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(This,value) (This)->lpVtbl->get_SystemId(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IDtdNotation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
    return This->lpVtbl->get_PublicId(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId(__x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation* This,IInspectable **value) {
    return This->lpVtbl->get_SystemId(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IDtdNotation IID___x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
#define IDtdNotationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotationVtbl
#define IDtdNotation __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation
#define IDtdNotation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_QueryInterface
#define IDtdNotation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_AddRef
#define IDtdNotation_Release __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_Release
#define IDtdNotation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetIids
#define IDtdNotation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetRuntimeClassName
#define IDtdNotation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_GetTrustLevel
#define IDtdNotation_get_PublicId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_PublicId
#define IDtdNotation_get_SystemId __x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_get_SystemId
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIDtdNotation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlAttribute interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("ac144aa4-b4f1-4db6-b206-8a22c308db0a")
                    IXmlAttribute : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Name(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Specified(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Value(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Value(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute, 0xac144aa4, 0xb4f1, 0x4db6, 0xb2,0x06, 0x8a,0x22,0xc3,0x08,0xdb,0x0a)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        TrustLevel *trustLevel);

    /*** IXmlAttribute methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Specified)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_Value)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Value)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlAttribute methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(This,value) (This)->lpVtbl->get_Specified(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(This,value) (This)->lpVtbl->get_Value(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(This,value) (This)->lpVtbl->put_Value(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlAttribute methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,boolean *value) {
    return This->lpVtbl->get_Specified(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING *value) {
    return This->lpVtbl->get_Value(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value(__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute* This,HSTRING value) {
    return This->lpVtbl->put_Value(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlAttribute IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
#define IXmlAttributeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttributeVtbl
#define IXmlAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute
#define IXmlAttribute_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_QueryInterface
#define IXmlAttribute_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_AddRef
#define IXmlAttribute_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_Release
#define IXmlAttribute_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetIids
#define IXmlAttribute_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetRuntimeClassName
#define IXmlAttribute_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_GetTrustLevel
#define IXmlAttribute_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Name
#define IXmlAttribute_get_Specified __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Specified
#define IXmlAttribute_get_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_get_Value
#define IXmlAttribute_put_Value __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_put_Value
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlCDataSection interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("4d04b46f-c8bd-45b4-8899-0400d7c2c60f")
                    IXmlCDataSection : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection, 0x4d04b46f, 0xc8bd, 0x45b4, 0x88,0x99, 0x04,0x00,0xd7,0xc2,0xc6,0x0f)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlCDataSection IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
#define IXmlCDataSectionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSectionVtbl
#define IXmlCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection
#define IXmlCDataSection_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_QueryInterface
#define IXmlCDataSection_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_AddRef
#define IXmlCDataSection_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_Release
#define IXmlCDataSection_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetIids
#define IXmlCDataSection_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetRuntimeClassName
#define IXmlCDataSection_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlCharacterData interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("132e42ab-4e36-4df6-b1c8-0ce62fd88b26")
                    IXmlCharacterData : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Data(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Data(
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SubstringData(
                            UINT32 offset,
                            UINT32 count,
                            HSTRING *data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE AppendData(
                            HSTRING data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE InsertData(
                            UINT32 offset,
                            HSTRING data) = 0;

                        virtual HRESULT STDMETHODCALLTYPE DeleteData(
                            UINT32 offset,
                            UINT32 count) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ReplaceData(
                            UINT32 offset,
                            UINT32 count,
                            HSTRING data) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData, 0x132e42ab, 0x4e36, 0x4df6, 0xb1,0xc8, 0x0c,0xe6,0x2f,0xd8,0x8b,0x26)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        TrustLevel *trustLevel);

    /*** IXmlCharacterData methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *SubstringData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count,
        HSTRING *data);

    HRESULT (STDMETHODCALLTYPE *AppendData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        HSTRING data);

    HRESULT (STDMETHODCALLTYPE *InsertData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        HSTRING data);

    HRESULT (STDMETHODCALLTYPE *DeleteData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count);

    HRESULT (STDMETHODCALLTYPE *ReplaceData)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData *This,
        UINT32 offset,
        UINT32 count,
        HSTRING data);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlCharacterData methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(This,offset,count,data) (This)->lpVtbl->SubstringData(This,offset,count,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(This,data) (This)->lpVtbl->AppendData(This,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(This,offset,data) (This)->lpVtbl->InsertData(This,offset,data)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(This,offset,count) (This)->lpVtbl->DeleteData(This,offset,count)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(This,offset,count,data) (This)->lpVtbl->ReplaceData(This,offset,count,data)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlCharacterData methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING *value) {
    return This->lpVtbl->get_Data(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING value) {
    return This->lpVtbl->put_Data(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING *data) {
    return This->lpVtbl->SubstringData(This,offset,count,data);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,HSTRING data) {
    return This->lpVtbl->AppendData(This,data);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,HSTRING data) {
    return This->lpVtbl->InsertData(This,offset,data);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count) {
    return This->lpVtbl->DeleteData(This,offset,count);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData(__x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData* This,UINT32 offset,UINT32 count,HSTRING data) {
    return This->lpVtbl->ReplaceData(This,offset,count,data);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlCharacterData IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
#define IXmlCharacterDataVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterDataVtbl
#define IXmlCharacterData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData
#define IXmlCharacterData_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_QueryInterface
#define IXmlCharacterData_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AddRef
#define IXmlCharacterData_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_Release
#define IXmlCharacterData_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetIids
#define IXmlCharacterData_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetRuntimeClassName
#define IXmlCharacterData_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_GetTrustLevel
#define IXmlCharacterData_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Data
#define IXmlCharacterData_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_put_Data
#define IXmlCharacterData_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_get_Length
#define IXmlCharacterData_SubstringData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_SubstringData
#define IXmlCharacterData_AppendData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_AppendData
#define IXmlCharacterData_InsertData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_InsertData
#define IXmlCharacterData_DeleteData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_DeleteData
#define IXmlCharacterData_ReplaceData __x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_ReplaceData
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlCharacterData_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlComment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("bca474d5-b61f-4611-9cac-2e92e3476d47")
                    IXmlComment : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment, 0xbca474d5, 0xb61f, 0x4611, 0x9c,0xac, 0x2e,0x92,0xe3,0x47,0x6d,0x47)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlComment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
#define IXmlCommentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlCommentVtbl
#define IXmlComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment
#define IXmlComment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_QueryInterface
#define IXmlComment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_AddRef
#define IXmlComment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_Release
#define IXmlComment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetIids
#define IXmlComment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetRuntimeClassName
#define IXmlComment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlComment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocument interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f7f3a506-1e87-42d6-bcfb-b8c809fa5494")
                    IXmlDocument : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Doctype(
                            ABI::Windows::Data::Xml::Dom::IXmlDocumentType **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Implementation(
                            ABI::Windows::Data::Xml::Dom::IXmlDomImplementation **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_DocumentElement(
                            ABI::Windows::Data::Xml::Dom::IXmlElement **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateElement(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateDocumentFragment(
                            ABI::Windows::Data::Xml::Dom::IXmlDocumentFragment **new_document_fragment) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateTextNode(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlText **new_text_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateComment(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlComment **new_comment) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateProcessingInstruction(
                            HSTRING target,
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlProcessingInstruction **new_processing_instruction) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateAttribute(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateEntityReference(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlEntityReference **new_entity_reference) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateCDataSection(
                            HSTRING data,
                            ABI::Windows::Data::Xml::Dom::IXmlCDataSection **new_cdata_section) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_DocumentUri(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **new_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CreateElementNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **new_element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementById(
                            HSTRING element_id,
                            ABI::Windows::Data::Xml::Dom::IXmlElement **element) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ImportNode(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            boolean deep,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument, 0xf7f3a506, 0x1e87, 0x42d6, 0xbc,0xfb, 0xb8,0xc8,0x09,0xfa,0x54,0x94)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        TrustLevel *trustLevel);

    /*** IXmlDocument methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Doctype)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value);

    HRESULT (STDMETHODCALLTYPE *get_Implementation)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value);

    HRESULT (STDMETHODCALLTYPE *get_DocumentElement)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value);

    HRESULT (STDMETHODCALLTYPE *CreateElement)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);

    HRESULT (STDMETHODCALLTYPE *CreateDocumentFragment)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment);

    HRESULT (STDMETHODCALLTYPE *CreateTextNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node);

    HRESULT (STDMETHODCALLTYPE *CreateComment)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment);

    HRESULT (STDMETHODCALLTYPE *CreateProcessingInstruction)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING target,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction);

    HRESULT (STDMETHODCALLTYPE *CreateAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);

    HRESULT (STDMETHODCALLTYPE *CreateEntityReference)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference);

    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);

    HRESULT (STDMETHODCALLTYPE *CreateCDataSection)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING data,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section);

    HRESULT (STDMETHODCALLTYPE *get_DocumentUri)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *CreateAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute);

    HRESULT (STDMETHODCALLTYPE *CreateElementNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element);

    HRESULT (STDMETHODCALLTYPE *GetElementById)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        HSTRING element_id,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element);

    HRESULT (STDMETHODCALLTYPE *ImportNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        boolean deep,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocument methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(This,value) (This)->lpVtbl->get_Doctype(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(This,value) (This)->lpVtbl->get_Implementation(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(This,value) (This)->lpVtbl->get_DocumentElement(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(This,tag_name,new_element) (This)->lpVtbl->CreateElement(This,tag_name,new_element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(This,new_document_fragment) (This)->lpVtbl->CreateDocumentFragment(This,new_document_fragment)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(This,data,new_text_node) (This)->lpVtbl->CreateTextNode(This,data,new_text_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(This,data,new_comment) (This)->lpVtbl->CreateComment(This,data,new_comment)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(This,target,data,new_processing_instruction) (This)->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(This,name,new_attribute) (This)->lpVtbl->CreateAttribute(This,name,new_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(This,name,new_entity_reference) (This)->lpVtbl->CreateEntityReference(This,name,new_entity_reference)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(This,data,new_cdata_section) (This)->lpVtbl->CreateCDataSection(This,data,new_cdata_section)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(This,value) (This)->lpVtbl->get_DocumentUri(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute) (This)->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(This,namespace_uri,qualified_name,new_element) (This)->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(This,element_id,element) (This)->lpVtbl->GetElementById(This,element_id,element)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(This,node,deep,new_node) (This)->lpVtbl->ImportNode(This,node,deep,new_node)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocument methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType **value) {
    return This->lpVtbl->get_Doctype(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation **value) {
    return This->lpVtbl->get_Implementation(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **value) {
    return This->lpVtbl->get_DocumentElement(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
    return This->lpVtbl->CreateElement(This,tag_name,new_element);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment **new_document_fragment) {
    return This->lpVtbl->CreateDocumentFragment(This,new_document_fragment);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **new_text_node) {
    return This->lpVtbl->CreateTextNode(This,data,new_text_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlComment **new_comment) {
    return This->lpVtbl->CreateComment(This,data,new_comment);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING target,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction **new_processing_instruction) {
    return This->lpVtbl->CreateProcessingInstruction(This,target,data,new_processing_instruction);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
    return This->lpVtbl->CreateAttribute(This,name,new_attribute);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference **new_entity_reference) {
    return This->lpVtbl->CreateEntityReference(This,name,new_entity_reference);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING data,__x_ABI_CWindows_CData_CXml_CDom_CIXmlCDataSection **new_cdata_section) {
    return This->lpVtbl->CreateCDataSection(This,data,new_cdata_section);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING *value) {
    return This->lpVtbl->get_DocumentUri(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **new_attribute) {
    return This->lpVtbl->CreateAttributeNS(This,namespace_uri,qualified_name,new_attribute);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,IInspectable *namespace_uri,HSTRING qualified_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **new_element) {
    return This->lpVtbl->CreateElementNS(This,namespace_uri,qualified_name,new_element);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,HSTRING element_id,__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement **element) {
    return This->lpVtbl->GetElementById(This,element_id,element);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
    return This->lpVtbl->ImportNode(This,node,deep,new_node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocument IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
#define IXmlDocumentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentVtbl
#define IXmlDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument
#define IXmlDocument_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_QueryInterface
#define IXmlDocument_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_AddRef
#define IXmlDocument_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_Release
#define IXmlDocument_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetIids
#define IXmlDocument_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetRuntimeClassName
#define IXmlDocument_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetTrustLevel
#define IXmlDocument_get_Doctype __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Doctype
#define IXmlDocument_get_Implementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_Implementation
#define IXmlDocument_get_DocumentElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentElement
#define IXmlDocument_CreateElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElement
#define IXmlDocument_CreateDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateDocumentFragment
#define IXmlDocument_CreateTextNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateTextNode
#define IXmlDocument_CreateComment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateComment
#define IXmlDocument_CreateProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateProcessingInstruction
#define IXmlDocument_CreateAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttribute
#define IXmlDocument_CreateEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateEntityReference
#define IXmlDocument_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementsByTagName
#define IXmlDocument_CreateCDataSection __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateCDataSection
#define IXmlDocument_get_DocumentUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_get_DocumentUri
#define IXmlDocument_CreateAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateAttributeNS
#define IXmlDocument_CreateElementNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_CreateElementNS
#define IXmlDocument_GetElementById __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_GetElementById
#define IXmlDocument_ImportNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_ImportNode
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentFragment interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("e2ea6a96-0c21-44a5-8bc9-9e4a262708ec")
                    IXmlDocumentFragment : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment, 0xe2ea6a96, 0x0c21, 0x44a5, 0x8b,0xc9, 0x9e,0x4a,0x26,0x27,0x08,0xec)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentFragment IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
#define IXmlDocumentFragmentVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragmentVtbl
#define IXmlDocumentFragment __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment
#define IXmlDocumentFragment_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_QueryInterface
#define IXmlDocumentFragment_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_AddRef
#define IXmlDocumentFragment_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_Release
#define IXmlDocumentFragment_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetIids
#define IXmlDocumentFragment_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetRuntimeClassName
#define IXmlDocumentFragment_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentFragment_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentIO interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6cd0e74e-ee65-4489-9ebf-ca43e87ba637")
                    IXmlDocumentIO : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadXml(
                            HSTRING xml) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadXmlWithSettings(
                            HSTRING xml,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SaveToFileAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Foundation::IAsyncAction **async_info) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO, 0x6cd0e74e, 0xee65, 0x4489, 0x9e,0xbf, 0xca,0x43,0xe8,0x7b,0xa6,0x37)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentIO methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadXml)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING xml);

    HRESULT (STDMETHODCALLTYPE *LoadXmlWithSettings)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        HSTRING xml,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);

    HRESULT (STDMETHODCALLTYPE *SaveToFileAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __x_ABI_CWindows_CFoundation_CIAsyncAction **async_info);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentIO methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(This,xml) (This)->lpVtbl->LoadXml(This,xml)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(This,xml,load_settings) (This)->lpVtbl->LoadXmlWithSettings(This,xml,load_settings)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(This,file,async_info) (This)->lpVtbl->SaveToFileAsync(This,file,async_info)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentIO methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml) {
    return This->lpVtbl->LoadXml(This,xml);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,HSTRING xml,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
    return This->lpVtbl->LoadXmlWithSettings(This,xml,load_settings);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CFoundation_CIAsyncAction **async_info) {
    return This->lpVtbl->SaveToFileAsync(This,file,async_info);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentIO IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
#define IXmlDocumentIOVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIOVtbl
#define IXmlDocumentIO __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO
#define IXmlDocumentIO_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_QueryInterface
#define IXmlDocumentIO_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_AddRef
#define IXmlDocumentIO_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_Release
#define IXmlDocumentIO_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetIids
#define IXmlDocumentIO_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetRuntimeClassName
#define IXmlDocumentIO_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_GetTrustLevel
#define IXmlDocumentIO_LoadXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXml
#define IXmlDocumentIO_LoadXmlWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_LoadXmlWithSettings
#define IXmlDocumentIO_SaveToFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_SaveToFileAsync
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentIO2 interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5d034661-7bd8-4ad5-9ebf-81e6347263b1")
                    IXmlDocumentIO2 : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBuffer(
                            ABI::Windows::Storage::Streams::IBuffer *buffer) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadXmlFromBufferWithSettings(
                            ABI::Windows::Storage::Streams::IBuffer *buffer,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2, 0x5d034661, 0x7bd8, 0x4ad5, 0x9e,0xbf, 0x81,0xe6,0x34,0x72,0x63,0xb1)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentIO2 methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBuffer)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer);

    HRESULT (STDMETHODCALLTYPE *LoadXmlFromBufferWithSettings)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 *This,
        __x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2 {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentIO2 methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(This,buffer) (This)->lpVtbl->LoadXmlFromBuffer(This,buffer)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(This,buffer,load_settings) (This)->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentIO2 methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer) {
    return This->lpVtbl->LoadXmlFromBuffer(This,buffer);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2* This,__x_ABI_CWindows_CStorage_CStreams_CIBuffer *buffer,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings) {
    return This->lpVtbl->LoadXmlFromBufferWithSettings(This,buffer,load_settings);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentIO2 IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
#define IXmlDocumentIO2Vtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2Vtbl
#define IXmlDocumentIO2 __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2
#define IXmlDocumentIO2_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_QueryInterface
#define IXmlDocumentIO2_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_AddRef
#define IXmlDocumentIO2_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_Release
#define IXmlDocumentIO2_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetIids
#define IXmlDocumentIO2_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetRuntimeClassName
#define IXmlDocumentIO2_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_GetTrustLevel
#define IXmlDocumentIO2_LoadXmlFromBuffer __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBuffer
#define IXmlDocumentIO2_LoadXmlFromBufferWithSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_LoadXmlFromBufferWithSettings
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentIO2_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentStatics interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5543d254-d757-4b79-9539-232b18f50bf1")
                    IXmlDocumentStatics : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriAsync(
                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromUriWithSettingsAsync(
                            ABI::Windows::Foundation::IUriRuntimeClass *uri,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                        virtual HRESULT STDMETHODCALLTYPE LoadFromFileWithSettingsAsync(
                            ABI::Windows::Storage::IStorageFile *file,
                            ABI::Windows::Data::Xml::Dom::IXmlLoadSettings *load_settings,
                            ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > **async_info) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics, 0x5543d254, 0xd757, 0x4b79, 0x95,0x39, 0x23,0x2b,0x18,0xf5,0x0b,0xf1)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentStatics methods ***/
    HRESULT (STDMETHODCALLTYPE *LoadFromUriAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromUriWithSettingsAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromFileAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    HRESULT (STDMETHODCALLTYPE *LoadFromFileWithSettingsAsync)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics *This,
        __x_ABI_CWindows_CStorage_CIStorageFile *file,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentStatics methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(This,uri,async_info) (This)->lpVtbl->LoadFromUriAsync(This,uri,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info) (This)->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(This,file,async_info) (This)->lpVtbl->LoadFromFileAsync(This,file,async_info)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(This,file,load_settings,async_info) (This)->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentStatics methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromUriAsync(This,uri,async_info);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CFoundation_CIUriRuntimeClass *uri,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromUriWithSettingsAsync(This,uri,load_settings,async_info);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromFileAsync(This,file,async_info);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics* This,__x_ABI_CWindows_CStorage_CIStorageFile *file,__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *load_settings,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument **async_info) {
    return This->lpVtbl->LoadFromFileWithSettingsAsync(This,file,load_settings,async_info);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentStatics IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
#define IXmlDocumentStaticsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStaticsVtbl
#define IXmlDocumentStatics __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics
#define IXmlDocumentStatics_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_QueryInterface
#define IXmlDocumentStatics_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_AddRef
#define IXmlDocumentStatics_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_Release
#define IXmlDocumentStatics_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetIids
#define IXmlDocumentStatics_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetRuntimeClassName
#define IXmlDocumentStatics_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_GetTrustLevel
#define IXmlDocumentStatics_LoadFromUriAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriAsync
#define IXmlDocumentStatics_LoadFromUriWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromUriWithSettingsAsync
#define IXmlDocumentStatics_LoadFromFileAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileAsync
#define IXmlDocumentStatics_LoadFromFileWithSettingsAsync __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_LoadFromFileWithSettingsAsync
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentStatics_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDocumentType interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f7342425-9781-4964-8e94-9b1c6dfc9bc7")
                    IXmlDocumentType : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Name(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Entities(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Notations(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType, 0xf7342425, 0x9781, 0x4964, 0x8e,0x94, 0x9b,0x1c,0x6d,0xfc,0x9b,0xc7)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        TrustLevel *trustLevel);

    /*** IXmlDocumentType methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Name)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Entities)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    HRESULT (STDMETHODCALLTYPE *get_Notations)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDocumentType methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(This,value) (This)->lpVtbl->get_Name(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(This,value) (This)->lpVtbl->get_Entities(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(This,value) (This)->lpVtbl->get_Notations(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDocumentType methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,HSTRING *value) {
    return This->lpVtbl->get_Name(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Entities(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Notations(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDocumentType IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
#define IXmlDocumentTypeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentTypeVtbl
#define IXmlDocumentType __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType
#define IXmlDocumentType_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_QueryInterface
#define IXmlDocumentType_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_AddRef
#define IXmlDocumentType_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_Release
#define IXmlDocumentType_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetIids
#define IXmlDocumentType_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetRuntimeClassName
#define IXmlDocumentType_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_GetTrustLevel
#define IXmlDocumentType_get_Name __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Name
#define IXmlDocumentType_get_Entities __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Entities
#define IXmlDocumentType_get_Notations __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_get_Notations
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDocumentType_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlDomImplementation interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("6de58132-f11d-4fbb-8cc6-583cba93112f")
                    IXmlDomImplementation : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE HasFeature(
                            HSTRING feature,
                            IInspectable *version,
                            boolean *feature_supported) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation, 0x6de58132, 0xf11d, 0x4fbb, 0x8c,0xc6, 0x58,0x3c,0xba,0x93,0x11,0x2f)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        TrustLevel *trustLevel);

    /*** IXmlDomImplementation methods ***/
    HRESULT (STDMETHODCALLTYPE *HasFeature)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation *This,
        HSTRING feature,
        IInspectable *version,
        boolean *feature_supported);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlDomImplementation methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(This,feature,version,feature_supported) (This)->lpVtbl->HasFeature(This,feature,version,feature_supported)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlDomImplementation methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature(__x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation* This,HSTRING feature,IInspectable *version,boolean *feature_supported) {
    return This->lpVtbl->HasFeature(This,feature,version,feature_supported);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlDomImplementation IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
#define IXmlDomImplementationVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementationVtbl
#define IXmlDomImplementation __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation
#define IXmlDomImplementation_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_QueryInterface
#define IXmlDomImplementation_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_AddRef
#define IXmlDomImplementation_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_Release
#define IXmlDomImplementation_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetIids
#define IXmlDomImplementation_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetRuntimeClassName
#define IXmlDomImplementation_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_GetTrustLevel
#define IXmlDomImplementation_HasFeature __x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_HasFeature
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlDomImplementation_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlElement interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2dfb8a1f-6b10-4ef8-9f83-efcce8faec37")
                    IXmlElement : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_TagName(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttribute(
                            HSTRING attribute_name,
                            HSTRING *attribute_value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttribute(
                            HSTRING attribute_name,
                            HSTRING attribute_value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttribute(
                            HSTRING attribute_name) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNode(
                            HSTRING attribute_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **attribute_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNode(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNode(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *attribute_node,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **removed_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetElementsByTagName(
                            HSTRING tag_name,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **elements) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING qualified_name,
                            HSTRING value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name,
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveAttributeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetAttributeNodeNS(
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute *new_attribute,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetAttributeNodeNS(
                            IInspectable *namespace_uri,
                            HSTRING local_name,
                            ABI::Windows::Data::Xml::Dom::IXmlAttribute **previous_attribute) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement, 0x2dfb8a1f, 0x6b10, 0x4ef8, 0x9f,0x83, 0xef,0xcc,0xe8,0xfa,0xec,0x37)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        TrustLevel *trustLevel);

    /*** IXmlElement methods ***/
    HRESULT (STDMETHODCALLTYPE *get_TagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *GetAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        HSTRING *attribute_value);

    HRESULT (STDMETHODCALLTYPE *SetAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        HSTRING attribute_value);

    HRESULT (STDMETHODCALLTYPE *RemoveAttribute)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING attribute_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute);

    HRESULT (STDMETHODCALLTYPE *GetElementsByTagName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        HSTRING tag_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING qualified_name,
        HSTRING value);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *RemoveAttributeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name);

    HRESULT (STDMETHODCALLTYPE *SetAttributeNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    HRESULT (STDMETHODCALLTYPE *GetAttributeNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement *This,
        IInspectable *namespace_uri,
        HSTRING local_name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlElement methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(This,value) (This)->lpVtbl->get_TagName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->GetAttribute(This,attribute_name,attribute_value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(This,attribute_name,attribute_value) (This)->lpVtbl->SetAttribute(This,attribute_name,attribute_value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(This,attribute_name) (This)->lpVtbl->RemoveAttribute(This,attribute_name)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(This,attribute_name,attribute_node) (This)->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(This,attribute_node,removed_attribute) (This)->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(This,tag_name,elements) (This)->lpVtbl->GetElementsByTagName(This,tag_name,elements)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(This,namespace_uri,qualified_name,value) (This)->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(This,namespace_uri,local_name,value) (This)->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(This,namespace_uri,local_name) (This)->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(This,new_attribute,previous_attribute) (This)->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute) (This)->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlElement methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING *value) {
    return This->lpVtbl->get_TagName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING *attribute_value) {
    return This->lpVtbl->GetAttribute(This,attribute_name,attribute_value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,HSTRING attribute_value) {
    return This->lpVtbl->SetAttribute(This,attribute_name,attribute_value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name) {
    return This->lpVtbl->RemoveAttribute(This,attribute_name);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING attribute_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **attribute_node) {
    return This->lpVtbl->GetAttributeNode(This,attribute_name,attribute_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->SetAttributeNode(This,new_attribute,previous_attribute);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *attribute_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **removed_attribute) {
    return This->lpVtbl->RemoveAttributeNode(This,attribute_node,removed_attribute);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,HSTRING tag_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **elements) {
    return This->lpVtbl->GetElementsByTagName(This,tag_name,elements);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING qualified_name,HSTRING value) {
    return This->lpVtbl->SetAttributeNS(This,namespace_uri,qualified_name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,HSTRING *value) {
    return This->lpVtbl->GetAttributeNS(This,namespace_uri,local_name,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name) {
    return This->lpVtbl->RemoveAttributeNS(This,namespace_uri,local_name);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute *new_attribute,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->SetAttributeNodeNS(This,new_attribute,previous_attribute);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlElement* This,IInspectable *namespace_uri,HSTRING local_name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlAttribute **previous_attribute) {
    return This->lpVtbl->GetAttributeNodeNS(This,namespace_uri,local_name,previous_attribute);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlElement IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
#define IXmlElementVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlElementVtbl
#define IXmlElement __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement
#define IXmlElement_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_QueryInterface
#define IXmlElement_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_AddRef
#define IXmlElement_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_Release
#define IXmlElement_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetIids
#define IXmlElement_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetRuntimeClassName
#define IXmlElement_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetTrustLevel
#define IXmlElement_get_TagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_get_TagName
#define IXmlElement_GetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttribute
#define IXmlElement_SetAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttribute
#define IXmlElement_RemoveAttribute __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttribute
#define IXmlElement_GetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNode
#define IXmlElement_SetAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNode
#define IXmlElement_RemoveAttributeNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNode
#define IXmlElement_GetElementsByTagName __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetElementsByTagName
#define IXmlElement_SetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNS
#define IXmlElement_GetAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNS
#define IXmlElement_RemoveAttributeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_RemoveAttributeNS
#define IXmlElement_SetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_SetAttributeNodeNS
#define IXmlElement_GetAttributeNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_GetAttributeNodeNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlElement_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlEntityReference interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2e2f47bc-c3d0-4ccf-bb86-0ab8c36a61cf")
                    IXmlEntityReference : public IInspectable
                    {
                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference, 0x2e2f47bc, 0xc3d0, 0x4ccf, 0xbb,0x86, 0x0a,0xb8,0xc3,0x6a,0x61,0xcf)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference *This,
        TrustLevel *trustLevel);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlEntityReference IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
#define IXmlEntityReferenceVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReferenceVtbl
#define IXmlEntityReference __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference
#define IXmlEntityReference_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_QueryInterface
#define IXmlEntityReference_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_AddRef
#define IXmlEntityReference_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_Release
#define IXmlEntityReference_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetIids
#define IXmlEntityReference_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetRuntimeClassName
#define IXmlEntityReference_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_GetTrustLevel
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlEntityReference_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlLoadSettings interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("58aa07a8-fed6-46f7-b4c5-fb1ba72108d6")
                    IXmlLoadSettings : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_MaxElementDepth(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_MaxElementDepth(
                            UINT32 value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ProhibitDtd(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ProhibitDtd(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ResolveExternals(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ResolveExternals(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ValidateOnParse(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ValidateOnParse(
                            boolean value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ElementContentWhiteSpace(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_ElementContentWhiteSpace(
                            boolean value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings, 0x58aa07a8, 0xfed6, 0x46f7, 0xb4,0xc5, 0xfb,0x1b,0xa7,0x21,0x08,0xd6)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        TrustLevel *trustLevel);

    /*** IXmlLoadSettings methods ***/
    HRESULT (STDMETHODCALLTYPE *get_MaxElementDepth)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *put_MaxElementDepth)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        UINT32 value);

    HRESULT (STDMETHODCALLTYPE *get_ProhibitDtd)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ProhibitDtd)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ResolveExternals)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ResolveExternals)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ValidateOnParse)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ValidateOnParse)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    HRESULT (STDMETHODCALLTYPE *get_ElementContentWhiteSpace)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *put_ElementContentWhiteSpace)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings *This,
        boolean value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlLoadSettings methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(This,value) (This)->lpVtbl->get_MaxElementDepth(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(This,value) (This)->lpVtbl->put_MaxElementDepth(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(This,value) (This)->lpVtbl->get_ProhibitDtd(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(This,value) (This)->lpVtbl->put_ProhibitDtd(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(This,value) (This)->lpVtbl->get_ResolveExternals(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(This,value) (This)->lpVtbl->put_ResolveExternals(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(This,value) (This)->lpVtbl->get_ValidateOnParse(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(This,value) (This)->lpVtbl->put_ValidateOnParse(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(This,value) (This)->lpVtbl->get_ElementContentWhiteSpace(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(This,value) (This)->lpVtbl->put_ElementContentWhiteSpace(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlLoadSettings methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 *value) {
    return This->lpVtbl->get_MaxElementDepth(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,UINT32 value) {
    return This->lpVtbl->put_MaxElementDepth(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ProhibitDtd(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ProhibitDtd(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ResolveExternals(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ResolveExternals(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ValidateOnParse(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ValidateOnParse(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean *value) {
    return This->lpVtbl->get_ElementContentWhiteSpace(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace(__x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings* This,boolean value) {
    return This->lpVtbl->put_ElementContentWhiteSpace(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlLoadSettings IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
#define IXmlLoadSettingsVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettingsVtbl
#define IXmlLoadSettings __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings
#define IXmlLoadSettings_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_QueryInterface
#define IXmlLoadSettings_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_AddRef
#define IXmlLoadSettings_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_Release
#define IXmlLoadSettings_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetIids
#define IXmlLoadSettings_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetRuntimeClassName
#define IXmlLoadSettings_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_GetTrustLevel
#define IXmlLoadSettings_get_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_MaxElementDepth
#define IXmlLoadSettings_put_MaxElementDepth __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_MaxElementDepth
#define IXmlLoadSettings_get_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ProhibitDtd
#define IXmlLoadSettings_put_ProhibitDtd __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ProhibitDtd
#define IXmlLoadSettings_get_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ResolveExternals
#define IXmlLoadSettings_put_ResolveExternals __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ResolveExternals
#define IXmlLoadSettings_get_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ValidateOnParse
#define IXmlLoadSettings_put_ValidateOnParse __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ValidateOnParse
#define IXmlLoadSettings_get_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_get_ElementContentWhiteSpace
#define IXmlLoadSettings_put_ElementContentWhiteSpace __x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_put_ElementContentWhiteSpace
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlLoadSettings_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNamedNodeMap interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("b3a69eb0-aab0-4b82-a6fa-b1453f7c021b")
                    IXmlNamedNodeMap : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Item(
                            UINT32 index,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetNamedItem(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetNamedItem(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItem(
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE GetNamedItemNS(
                            IInspectable *namespace_uri,
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveNamedItemNS(
                            IInspectable *namespace_uri,
                            HSTRING name,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SetNamedItemNS(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap, 0xb3a69eb0, 0xaab0, 0x4b82, 0xa6,0xfa, 0xb1,0x45,0x3f,0x7c,0x02,0x1b)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        TrustLevel *trustLevel);

    /*** IXmlNamedNodeMap methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *Item)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *GetNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SetNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *RemoveNamedItem)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *GetNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        IInspectable *namespace_uri,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *RemoveNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        IInspectable *namespace_uri,
        HSTRING name,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    HRESULT (STDMETHODCALLTYPE *SetNamedItemNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNamedNodeMap methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(This,name,node) (This)->lpVtbl->GetNamedItem(This,name,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(This,node,previous_node) (This)->lpVtbl->SetNamedItem(This,node,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(This,name,previous_node) (This)->lpVtbl->RemoveNamedItem(This,name,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(This,namespace_uri,name,node) (This)->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(This,namespace_uri,name,previous_node) (This)->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(This,node,previous_node) (This)->lpVtbl->SetNamedItemNS(This,node,previous_node)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNamedNodeMap methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->Item(This,index,node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->GetNamedItem(This,name,node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->SetNamedItem(This,node,previous_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->RemoveNamedItem(This,name,previous_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->GetNamedItemNS(This,namespace_uri,name,node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,IInspectable *namespace_uri,HSTRING name,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->RemoveNamedItemNS(This,namespace_uri,name,previous_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_node) {
    return This->lpVtbl->SetNamedItemNS(This,node,previous_node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNamedNodeMap IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
#define IXmlNamedNodeMapVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMapVtbl
#define IXmlNamedNodeMap __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap
#define IXmlNamedNodeMap_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_QueryInterface
#define IXmlNamedNodeMap_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_AddRef
#define IXmlNamedNodeMap_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Release
#define IXmlNamedNodeMap_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetIids
#define IXmlNamedNodeMap_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetRuntimeClassName
#define IXmlNamedNodeMap_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetTrustLevel
#define IXmlNamedNodeMap_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_get_Length
#define IXmlNamedNodeMap_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_Item
#define IXmlNamedNodeMap_GetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItem
#define IXmlNamedNodeMap_SetNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItem
#define IXmlNamedNodeMap_RemoveNamedItem __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItem
#define IXmlNamedNodeMap_GetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_GetNamedItemNS
#define IXmlNamedNodeMap_RemoveNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_RemoveNamedItemNS
#define IXmlNamedNodeMap_SetNamedItemNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_SetNamedItemNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNode interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("1c741d59-2122-47d5-a856-83f3d4214875")
                    IXmlNode : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_NodeValue(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_NodeValue(
                            IInspectable *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NodeType(
                            ABI::Windows::Data::Xml::Dom::NodeType *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NodeName(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ParentNode(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_ChildNodes(
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_FirstChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_LastChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_PreviousSibling(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NextSibling(
                            ABI::Windows::Data::Xml::Dom::IXmlNode **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Attributes(
                            ABI::Windows::Data::Xml::Dom::IXmlNamedNodeMap **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE HasChildNodes(
                            boolean *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_OwnerDocument(
                            ABI::Windows::Data::Xml::Dom::IXmlDocument **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE InsertBefore(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **inserted_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE ReplaceChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode *reference_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **previous_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE RemoveChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *child_node,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **removed_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE AppendChild(
                            ABI::Windows::Data::Xml::Dom::IXmlNode *new_child,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **appended_child) = 0;

                        virtual HRESULT STDMETHODCALLTYPE CloneNode(
                            boolean deep,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **new_node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_NamespaceUri(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_LocalName(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Prefix(
                            IInspectable **value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Normalize(
                            ) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Prefix(
                            IInspectable *value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode, 0x1c741d59, 0x2122, 0x47d5, 0xa8,0x56, 0x83,0xf3,0xd4,0x21,0x48,0x75)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IXmlNode methods ***/
    HRESULT (STDMETHODCALLTYPE *get_NodeValue)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *put_NodeValue)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable *value);

    HRESULT (STDMETHODCALLTYPE *get_NodeType)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CNodeType *value);

    HRESULT (STDMETHODCALLTYPE *get_NodeName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_ParentNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_ChildNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value);

    HRESULT (STDMETHODCALLTYPE *get_FirstChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_LastChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_PreviousSibling)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_NextSibling)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_Attributes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value);

    HRESULT (STDMETHODCALLTYPE *HasChildNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *get_OwnerDocument)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value);

    HRESULT (STDMETHODCALLTYPE *InsertBefore)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child);

    HRESULT (STDMETHODCALLTYPE *ReplaceChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child);

    HRESULT (STDMETHODCALLTYPE *RemoveChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child);

    HRESULT (STDMETHODCALLTYPE *AppendChild)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child);

    HRESULT (STDMETHODCALLTYPE *CloneNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        boolean deep,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node);

    HRESULT (STDMETHODCALLTYPE *get_NamespaceUri)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_LocalName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *get_Prefix)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable **value);

    HRESULT (STDMETHODCALLTYPE *Normalize)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This);

    HRESULT (STDMETHODCALLTYPE *put_Prefix)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *This,
        IInspectable *value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNode methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(This,value) (This)->lpVtbl->get_NodeValue(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(This,value) (This)->lpVtbl->put_NodeValue(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(This,value) (This)->lpVtbl->get_NodeType(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(This,value) (This)->lpVtbl->get_NodeName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(This,value) (This)->lpVtbl->get_ParentNode(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(This,value) (This)->lpVtbl->get_ChildNodes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(This,value) (This)->lpVtbl->get_FirstChild(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(This,value) (This)->lpVtbl->get_LastChild(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(This,value) (This)->lpVtbl->get_PreviousSibling(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(This,value) (This)->lpVtbl->get_NextSibling(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(This,value) (This)->lpVtbl->get_Attributes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(This,value) (This)->lpVtbl->HasChildNodes(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(This,value) (This)->lpVtbl->get_OwnerDocument(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(This,new_child,reference_child,inserted_child) (This)->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(This,new_child,reference_child,previous_child) (This)->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(This,child_node,removed_child) (This)->lpVtbl->RemoveChild(This,child_node,removed_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(This,new_child,appended_child) (This)->lpVtbl->AppendChild(This,new_child,appended_child)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(This,deep,new_node) (This)->lpVtbl->CloneNode(This,deep,new_node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(This,value) (This)->lpVtbl->get_NamespaceUri(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(This,value) (This)->lpVtbl->get_LocalName(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(This,value) (This)->lpVtbl->get_Prefix(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(This) (This)->lpVtbl->Normalize(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(This,value) (This)->lpVtbl->put_Prefix(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNode methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_NodeValue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
    return This->lpVtbl->put_NodeValue(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CNodeType *value) {
    return This->lpVtbl->get_NodeType(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,HSTRING *value) {
    return This->lpVtbl->get_NodeName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_ParentNode(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **value) {
    return This->lpVtbl->get_ChildNodes(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_FirstChild(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_LastChild(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_PreviousSibling(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_NextSibling(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNamedNodeMap **value) {
    return This->lpVtbl->get_Attributes(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean *value) {
    return This->lpVtbl->HasChildNodes(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **value) {
    return This->lpVtbl->get_OwnerDocument(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **inserted_child) {
    return This->lpVtbl->InsertBefore(This,new_child,reference_child,inserted_child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *reference_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **previous_child) {
    return This->lpVtbl->ReplaceChild(This,new_child,reference_child,previous_child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *child_node,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **removed_child) {
    return This->lpVtbl->RemoveChild(This,child_node,removed_child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *new_child,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **appended_child) {
    return This->lpVtbl->AppendChild(This,new_child,appended_child);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,boolean deep,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **new_node) {
    return This->lpVtbl->CloneNode(This,deep,new_node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_NamespaceUri(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_LocalName(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable **value) {
    return This->lpVtbl->get_Prefix(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This) {
    return This->lpVtbl->Normalize(This);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode* This,IInspectable *value) {
    return This->lpVtbl->put_Prefix(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNode IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
#define IXmlNodeVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeVtbl
#define IXmlNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode
#define IXmlNode_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_QueryInterface
#define IXmlNode_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AddRef
#define IXmlNode_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Release
#define IXmlNode_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetIids
#define IXmlNode_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetRuntimeClassName
#define IXmlNode_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_GetTrustLevel
#define IXmlNode_get_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeValue
#define IXmlNode_put_NodeValue __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_NodeValue
#define IXmlNode_get_NodeType __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeType
#define IXmlNode_get_NodeName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NodeName
#define IXmlNode_get_ParentNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ParentNode
#define IXmlNode_get_ChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_ChildNodes
#define IXmlNode_get_FirstChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_FirstChild
#define IXmlNode_get_LastChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LastChild
#define IXmlNode_get_PreviousSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_PreviousSibling
#define IXmlNode_get_NextSibling __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NextSibling
#define IXmlNode_get_Attributes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Attributes
#define IXmlNode_HasChildNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_HasChildNodes
#define IXmlNode_get_OwnerDocument __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_OwnerDocument
#define IXmlNode_InsertBefore __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_InsertBefore
#define IXmlNode_ReplaceChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_ReplaceChild
#define IXmlNode_RemoveChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_RemoveChild
#define IXmlNode_AppendChild __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_AppendChild
#define IXmlNode_CloneNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_CloneNode
#define IXmlNode_get_NamespaceUri __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_NamespaceUri
#define IXmlNode_get_LocalName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_LocalName
#define IXmlNode_get_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_get_Prefix
#define IXmlNode_Normalize __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_Normalize
#define IXmlNode_put_Prefix __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_put_Prefix
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNode_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeList interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("8c60ad77-83a4-4ec1-9c54-7ba429e13da6")
                    IXmlNodeList : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Length(
                            UINT32 *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE Item(
                            UINT32 index,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList, 0x8c60ad77, 0x83a4, 0x4ec1, 0x9c,0x54, 0x7b,0xa4,0x29,0xe1,0x3d,0xa6)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeList methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Length)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *Item)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeList methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(This,value) (This)->lpVtbl->get_Length(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(This,index,node) (This)->lpVtbl->Item(This,index,node)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeList methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 *value) {
    return This->lpVtbl->get_Length(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->Item(This,index,node);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeList IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
#define IXmlNodeListVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeListVtbl
#define IXmlNodeList __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList
#define IXmlNodeList_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_QueryInterface
#define IXmlNodeList_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_AddRef
#define IXmlNodeList_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Release
#define IXmlNodeList_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetIids
#define IXmlNodeList_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetRuntimeClassName
#define IXmlNodeList_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_GetTrustLevel
#define IXmlNodeList_get_Length __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_get_Length
#define IXmlNodeList_Item __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_Item
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeSelector interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("63dbba8b-d0db-4fe1-b745-f9433afdc25b")
                    IXmlNodeSelector : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNode(
                            HSTRING xpath,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectNodes(
                            HSTRING xpath,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectSingleNodeNS(
                            HSTRING xpath,
                            IInspectable *namespaces,
                            ABI::Windows::Data::Xml::Dom::IXmlNode **node) = 0;

                        virtual HRESULT STDMETHODCALLTYPE SelectNodesNS(
                            HSTRING xpath,
                            IInspectable *namespaces,
                            ABI::Windows::Data::Xml::Dom::IXmlNodeList **node_list) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector, 0x63dbba8b, 0xd0db, 0x4fe1, 0xb7,0x45, 0xf9,0x43,0x3a,0xfd,0xc2,0x5b)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeSelector methods ***/
    HRESULT (STDMETHODCALLTYPE *SelectSingleNode)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SelectNodes)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);

    HRESULT (STDMETHODCALLTYPE *SelectSingleNodeNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        IInspectable *namespaces,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node);

    HRESULT (STDMETHODCALLTYPE *SelectNodesNS)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector *This,
        HSTRING xpath,
        IInspectable *namespaces,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeSelector methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(This,xpath,node) (This)->lpVtbl->SelectSingleNode(This,xpath,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(This,xpath,node_list) (This)->lpVtbl->SelectNodes(This,xpath,node_list)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(This,xpath,namespaces,node) (This)->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(This,xpath,namespaces,node_list) (This)->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeSelector methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->SelectSingleNode(This,xpath,node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
    return This->lpVtbl->SelectNodes(This,xpath,node_list);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **node) {
    return This->lpVtbl->SelectSingleNodeNS(This,xpath,namespaces,node);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector* This,HSTRING xpath,IInspectable *namespaces,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeList **node_list) {
    return This->lpVtbl->SelectNodesNS(This,xpath,namespaces,node_list);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeSelector IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
#define IXmlNodeSelectorVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelectorVtbl
#define IXmlNodeSelector __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector
#define IXmlNodeSelector_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_QueryInterface
#define IXmlNodeSelector_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_AddRef
#define IXmlNodeSelector_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_Release
#define IXmlNodeSelector_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetIids
#define IXmlNodeSelector_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetRuntimeClassName
#define IXmlNodeSelector_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_GetTrustLevel
#define IXmlNodeSelector_SelectSingleNode __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNode
#define IXmlNodeSelector_SelectNodes __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodes
#define IXmlNodeSelector_SelectSingleNodeNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectSingleNodeNS
#define IXmlNodeSelector_SelectNodesNS __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_SelectNodesNS
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSelector_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlNodeSerializer interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("5cc5b382-e6dd-4991-abef-06d8d2e7bd0c")
                    IXmlNodeSerializer : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE GetXml(
                            HSTRING *outer_xml) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_InnerText(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_InnerText(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer, 0x5cc5b382, 0xe6dd, 0x4991, 0xab,0xef, 0x06,0xd8,0xd2,0xe7,0xbd,0x0c)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        TrustLevel *trustLevel);

    /*** IXmlNodeSerializer methods ***/
    HRESULT (STDMETHODCALLTYPE *GetXml)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *outer_xml);

    HRESULT (STDMETHODCALLTYPE *get_InnerText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_InnerText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlNodeSerializer methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(This,outer_xml) (This)->lpVtbl->GetXml(This,outer_xml)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(This,value) (This)->lpVtbl->get_InnerText(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(This,value) (This)->lpVtbl->put_InnerText(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlNodeSerializer methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *outer_xml) {
    return This->lpVtbl->GetXml(This,outer_xml);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING *value) {
    return This->lpVtbl->get_InnerText(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer* This,HSTRING value) {
    return This->lpVtbl->put_InnerText(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlNodeSerializer IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
#define IXmlNodeSerializerVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializerVtbl
#define IXmlNodeSerializer __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer
#define IXmlNodeSerializer_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_QueryInterface
#define IXmlNodeSerializer_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_AddRef
#define IXmlNodeSerializer_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_Release
#define IXmlNodeSerializer_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetIids
#define IXmlNodeSerializer_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetRuntimeClassName
#define IXmlNodeSerializer_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetTrustLevel
#define IXmlNodeSerializer_GetXml __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_GetXml
#define IXmlNodeSerializer_get_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_get_InnerText
#define IXmlNodeSerializer_put_InnerText __x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_put_InnerText
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlNodeSerializer_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlProcessingInstruction interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("2707fd1e-1e92-4ece-b6f4-26f069078ddc")
                    IXmlProcessingInstruction : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE get_Target(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE get_Data(
                            HSTRING *value) = 0;

                        virtual HRESULT STDMETHODCALLTYPE put_Data(
                            HSTRING value) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction, 0x2707fd1e, 0x1e92, 0x4ece, 0xb6,0xf4, 0x26,0xf0,0x69,0x07,0x8d,0xdc)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        TrustLevel *trustLevel);

    /*** IXmlProcessingInstruction methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Target)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *get_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING *value);

    HRESULT (STDMETHODCALLTYPE *put_Data)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction *This,
        HSTRING value);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlProcessingInstruction methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(This,value) (This)->lpVtbl->get_Target(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(This,value) (This)->lpVtbl->get_Data(This,value)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(This,value) (This)->lpVtbl->put_Data(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlProcessingInstruction methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
    return This->lpVtbl->get_Target(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING *value) {
    return This->lpVtbl->get_Data(This,value);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data(__x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction* This,HSTRING value) {
    return This->lpVtbl->put_Data(This,value);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlProcessingInstruction IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
#define IXmlProcessingInstructionVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstructionVtbl
#define IXmlProcessingInstruction __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction
#define IXmlProcessingInstruction_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_QueryInterface
#define IXmlProcessingInstruction_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_AddRef
#define IXmlProcessingInstruction_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_Release
#define IXmlProcessingInstruction_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetIids
#define IXmlProcessingInstruction_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetRuntimeClassName
#define IXmlProcessingInstruction_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_GetTrustLevel
#define IXmlProcessingInstruction_get_Target __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Target
#define IXmlProcessingInstruction_get_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_get_Data
#define IXmlProcessingInstruction_put_Data __x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_put_Data
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlProcessingInstruction_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IXmlText interface
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__
#define ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__

DEFINE_GUID(IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Data {
            namespace Xml {
                namespace Dom {
                    MIDL_INTERFACE("f931a4cb-308d-4760-a1d5-43b67450ac7e")
                    IXmlText : public IInspectable
                    {
                        virtual HRESULT STDMETHODCALLTYPE SplitText(
                            UINT32 offset,
                            ABI::Windows::Data::Xml::Dom::IXmlText **second_part) = 0;

                    };
                }
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText, 0xf931a4cb, 0x308d, 0x4760, 0xa1,0xd5, 0x43,0xb6,0x74,0x50,0xac,0x7e)
#endif
#else
typedef struct __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        TrustLevel *trustLevel);

    /*** IXmlText methods ***/
    HRESULT (STDMETHODCALLTYPE *SplitText)(
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText *This,
        UINT32 offset,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part);

    END_INTERFACE
} __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl;

interface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText {
    CONST_VTBL __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IXmlText methods ***/
#define __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(This,offset,second_part) (This)->lpVtbl->SplitText(This,offset,second_part)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IXmlText methods ***/
static __WIDL_INLINE HRESULT __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText(__x_ABI_CWindows_CData_CXml_CDom_CIXmlText* This,UINT32 offset,__x_ABI_CWindows_CData_CXml_CDom_CIXmlText **second_part) {
    return This->lpVtbl->SplitText(This,offset,second_part);
}
#endif
#ifdef WIDL_using_Windows_Data_Xml_Dom
#define IID_IXmlText IID___x_ABI_CWindows_CData_CXml_CDom_CIXmlText
#define IXmlTextVtbl __x_ABI_CWindows_CData_CXml_CDom_CIXmlTextVtbl
#define IXmlText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText
#define IXmlText_QueryInterface __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_QueryInterface
#define IXmlText_AddRef __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_AddRef
#define IXmlText_Release __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_Release
#define IXmlText_GetIids __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetIids
#define IXmlText_GetRuntimeClassName __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetRuntimeClassName
#define IXmlText_GetTrustLevel __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_GetTrustLevel
#define IXmlText_SplitText __x_ABI_CWindows_CData_CXml_CDom_CIXmlText_SplitText
#endif /* WIDL_using_Windows_Data_Xml_Dom */
#endif

#endif

#endif  /* ____x_ABI_CWindows_CData_CXml_CDom_CIXmlText_INTERFACE_DEFINED__ */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.DtdEntity
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = L"Windows.Data.Xml.Dom.DtdEntity";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdEntity[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','E','n','t','i','t','y',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdEntity_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.DtdNotation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = L"Windows.Data.Xml.Dom.DtdNotation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_DtdNotation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','D','t','d','N','o','t','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_DtdNotation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlAttribute
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = L"Windows.Data.Xml.Dom.XmlAttribute";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlAttribute[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','A','t','t','r','i','b','u','t','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlAttribute_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlCDataSection
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = L"Windows.Data.Xml.Dom.XmlCDataSection";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlCDataSection[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','D','a','t','a','S','e','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlCDataSection_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlComment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = L"Windows.Data.Xml.Dom.XmlComment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlComment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','C','o','m','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlComment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocument
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = L"Windows.Data.Xml.Dom.XmlDocument";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocument[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocument_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocumentFragment
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = L"Windows.Data.Xml.Dom.XmlDocumentFragment";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentFragment[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','F','r','a','g','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentFragment_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDocumentType
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = L"Windows.Data.Xml.Dom.XmlDocumentType";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDocumentType[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','c','u','m','e','n','t','T','y','p','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDocumentType_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlDomImplementation
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = L"Windows.Data.Xml.Dom.XmlDomImplementation";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlDomImplementation[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','D','o','m','I','m','p','l','e','m','e','n','t','a','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlDomImplementation_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlElement
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = L"Windows.Data.Xml.Dom.XmlElement";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlElement[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','l','e','m','e','n','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlElement_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlEntityReference
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = L"Windows.Data.Xml.Dom.XmlEntityReference";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlEntityReference[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','E','n','t','i','t','y','R','e','f','e','r','e','n','c','e',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlEntityReference_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlLoadSettings
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = L"Windows.Data.Xml.Dom.XmlLoadSettings";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlLoadSettings[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','L','o','a','d','S','e','t','t','i','n','g','s',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlLoadSettings_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlNamedNodeMap
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = L"Windows.Data.Xml.Dom.XmlNamedNodeMap";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNamedNodeMap[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','a','m','e','d','N','o','d','e','M','a','p',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNamedNodeMap_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlNodeList
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = L"Windows.Data.Xml.Dom.XmlNodeList";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlNodeList[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','N','o','d','e','L','i','s','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlNodeList_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlProcessingInstruction
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = L"Windows.Data.Xml.Dom.XmlProcessingInstruction";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlProcessingInstruction[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','P','r','o','c','e','s','s','i','n','g','I','n','s','t','r','u','c','t','i','o','n',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlProcessingInstruction_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*
 * Class Windows.Data.Xml.Dom.XmlText
 */
#if WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000
#ifndef RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
#define RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED
#if !defined(_MSC_VER) && !defined(__MINGW32__)
static const WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
#elif defined(__GNUC__) && !defined(__cplusplus)
const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = L"Windows.Data.Xml.Dom.XmlText";
#else
extern const DECLSPEC_SELECTANY WCHAR RuntimeClass_Windows_Data_Xml_Dom_XmlText[] = {'W','i','n','d','o','w','s','.','D','a','t','a','.','X','m','l','.','D','o','m','.','X','m','l','T','e','x','t',0};
#endif
#endif /* RUNTIMECLASS_Windows_Data_Xml_Dom_XmlText_DEFINED */
#endif /* WINDOWS_FOUNDATION_UNIVERSALAPICONTRACT_VERSION >= 0x10000 */

/*****************************************************************************
 * IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("f1146ffc-8c92-56e8-93f1-711f86722633")
                IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterable_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode, 0xf1146ffc, 0x8c92, 0x56e8, 0x93,0xf1, 0x71,0x1f,0x86,0x72,0x26,0x33)
#endif
#else
typedef struct __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *First)(
        __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value);

    END_INTERFACE
} __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(This,value) (This)->lpVtbl->First(This,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterable<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static __WIDL_INLINE HRESULT __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First(__FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode* This,__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode **value) {
    return This->lpVtbl->First(This,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterable_IXmlNode IID___FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterable_IXmlNodeVtbl __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IIterable_IXmlNode __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterable_IXmlNode_QueryInterface __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IIterable_IXmlNode_AddRef __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IIterable_IXmlNode_Release __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IIterable_IXmlNode_GetIids __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IIterable_IXmlNode_GetRuntimeClassName __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IIterable_IXmlNode_GetTrustLevel __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IIterable_IXmlNode_First __FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_First
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterable_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("3833a35e-2c61-56bd-b093-3694165f8898")
                IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IIterator_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode, 0x3833a35e, 0x2c61, 0x56bd, 0xb0,0x93, 0x36,0x94,0x16,0x5f,0x88,0x98)
#endif
#else
typedef struct __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *get_Current)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_HasCurrent)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *MoveNext)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        boolean *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 items_size,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
        UINT32 *value);

    END_INTERFACE
} __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(This,value) (This)->lpVtbl->get_Current(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(This,value) (This)->lpVtbl->get_HasCurrent(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(This,value) (This)->lpVtbl->MoveNext(This,value)
#define __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(This,items_size,items,value) (This)->lpVtbl->GetMany(This,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IIterator<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->get_Current(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
    return This->lpVtbl->get_HasCurrent(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,boolean *value) {
    return This->lpVtbl->MoveNext(This,value);
}
static __WIDL_INLINE HRESULT __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IIterator_IXmlNode IID___FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterator_IXmlNodeVtbl __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IIterator_IXmlNode __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode
#define IIterator_IXmlNode_QueryInterface __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IIterator_IXmlNode_AddRef __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IIterator_IXmlNode_Release __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IIterator_IXmlNode_GetIids __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IIterator_IXmlNode_GetRuntimeClassName __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IIterator_IXmlNode_GetTrustLevel __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IIterator_IXmlNode_get_Current __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_Current
#define IIterator_IXmlNode_get_HasCurrent __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_get_HasCurrent
#define IIterator_IXmlNode_MoveNext __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_MoveNext
#define IIterator_IXmlNode_GetMany __FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIIterator_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > interface
 */
#ifndef ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__
#define ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            namespace Collections {
                template<>
                MIDL_INTERFACE("139d959e-e7b5-5cb6-a596-4b544478da9b")
                IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > : IVectorView_impl<ABI::Windows::Data::Xml::Dom::IXmlNode* >
                {
                };
            }
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode, 0x139d959e, 0xe7b5, 0x5cb6, 0xa5,0x96, 0x4b,0x54,0x44,0x78,0xda,0x9b)
#endif
#else
typedef struct __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        TrustLevel *trustLevel);

    /*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
    HRESULT (STDMETHODCALLTYPE *GetAt)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 index,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value);

    HRESULT (STDMETHODCALLTYPE *get_Size)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 *value);

    HRESULT (STDMETHODCALLTYPE *IndexOf)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,
        UINT32 *index,
        BOOLEAN *value);

    HRESULT (STDMETHODCALLTYPE *GetMany)(
        __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode *This,
        UINT32 start_index,
        UINT32 items_size,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,
        UINT32 *value);

    END_INTERFACE
} __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl;

interface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode {
    CONST_VTBL __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(This,index,value) (This)->lpVtbl->GetAt(This,index,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(This,value) (This)->lpVtbl->get_Size(This,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(This,element,index,value) (This)->lpVtbl->IndexOf(This,element,index,value)
#define __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(This,start_index,items_size,items,value) (This)->lpVtbl->GetMany(This,start_index,items_size,items,value)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IVectorView<ABI::Windows::Data::Xml::Dom::IXmlNode* > methods ***/
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 index,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **value) {
    return This->lpVtbl->GetAt(This,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 *value) {
    return This->lpVtbl->get_Size(This,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode *element,UINT32 *index,BOOLEAN *value) {
    return This->lpVtbl->IndexOf(This,element,index,value);
}
static __WIDL_INLINE HRESULT __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany(__FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode* This,UINT32 start_index,UINT32 items_size,__x_ABI_CWindows_CData_CXml_CDom_CIXmlNode **items,UINT32 *value) {
    return This->lpVtbl->GetMany(This,start_index,items_size,items,value);
}
#endif
#ifdef WIDL_using_Windows_Foundation_Collections
#define IID_IVectorView_IXmlNode IID___FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
#define IVectorView_IXmlNodeVtbl __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNodeVtbl
#define IVectorView_IXmlNode __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode
#define IVectorView_IXmlNode_QueryInterface __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_QueryInterface
#define IVectorView_IXmlNode_AddRef __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_AddRef
#define IVectorView_IXmlNode_Release __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_Release
#define IVectorView_IXmlNode_GetIids __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetIids
#define IVectorView_IXmlNode_GetRuntimeClassName __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetRuntimeClassName
#define IVectorView_IXmlNode_GetTrustLevel __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetTrustLevel
#define IVectorView_IXmlNode_GetAt __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetAt
#define IVectorView_IXmlNode_get_Size __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_get_Size
#define IVectorView_IXmlNode_IndexOf __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_IndexOf
#define IVectorView_IXmlNode_GetMany __FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_GetMany
#endif /* WIDL_using_Windows_Foundation_Collections */
#endif

#endif

#endif  /* ____FIVectorView_1_Windows__CData__CXml__CDom__CIXmlNode_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
 */
#ifndef ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
#define ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("f858e239-1896-5982-8495-143168478eb8")
            IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperation_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument, 0xf858e239, 0x1896, 0x5982, 0x84,0x95, 0x14,0x31,0x68,0x47,0x8e,0xb8)
#endif
#else
typedef struct __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    /*** IInspectable methods ***/
    HRESULT (STDMETHODCALLTYPE *GetIids)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        ULONG *iidCount,
        IID **iids);

    HRESULT (STDMETHODCALLTYPE *GetRuntimeClassName)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        HSTRING *className);

    HRESULT (STDMETHODCALLTYPE *GetTrustLevel)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        TrustLevel *trustLevel);

    /*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
    HRESULT (STDMETHODCALLTYPE *put_Completed)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler);

    HRESULT (STDMETHODCALLTYPE *get_Completed)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler);

    HRESULT (STDMETHODCALLTYPE *GetResults)(
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results);

    END_INTERFACE
} __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;

interface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument {
    CONST_VTBL __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IInspectable methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(This,iidCount,iids) (This)->lpVtbl->GetIids(This,iidCount,iids)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(This,className) (This)->lpVtbl->GetRuntimeClassName(This,className)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(This,trustLevel) (This)->lpVtbl->GetTrustLevel(This,trustLevel)
/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(This,handler) (This)->lpVtbl->put_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(This,handler) (This)->lpVtbl->get_Completed(This,handler)
#define __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(This,results) (This)->lpVtbl->GetResults(This,results)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IInspectable methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,ULONG *iidCount,IID **iids) {
    return This->lpVtbl->GetIids(This,iidCount,iids);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,HSTRING *className) {
    return This->lpVtbl->GetRuntimeClassName(This,className);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,TrustLevel *trustLevel) {
    return This->lpVtbl->GetTrustLevel(This,trustLevel);
}
/*** IAsyncOperation<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *handler) {
    return This->lpVtbl->put_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument **handler) {
    return This->lpVtbl->get_Completed(This,handler);
}
static __WIDL_INLINE HRESULT __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults(__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument* This,__x_ABI_CWindows_CData_CXml_CDom_CIXmlDocument **results) {
    return This->lpVtbl->GetResults(This,results);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperation_XmlDocument IID___FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperation_XmlDocumentVtbl __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
#define IAsyncOperation_XmlDocument __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperation_XmlDocument_QueryInterface __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
#define IAsyncOperation_XmlDocument_AddRef __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
#define IAsyncOperation_XmlDocument_Release __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_Release
#define IAsyncOperation_XmlDocument_GetIids __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetIids
#define IAsyncOperation_XmlDocument_GetRuntimeClassName __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetRuntimeClassName
#define IAsyncOperation_XmlDocument_GetTrustLevel __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetTrustLevel
#define IAsyncOperation_XmlDocument_put_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_put_Completed
#define IAsyncOperation_XmlDocument_get_Completed __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_get_Completed
#define IAsyncOperation_XmlDocument_GetResults __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_GetResults
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__ */

/*****************************************************************************
 * IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > interface
 */
#ifndef ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__
#define ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__

DEFINE_GUID(IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9);
#if defined(__cplusplus) && !defined(CINTERFACE)
} /* extern "C" */
namespace ABI {
    namespace Windows {
        namespace Foundation {
            template<>
            MIDL_INTERFACE("5eef7817-93dd-5c0b-9e5a-eb490408f3a9")
            IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > : IAsyncOperationCompletedHandler_impl<ABI::Windows::Foundation::Internal::AggregateType<ABI::Windows::Data::Xml::Dom::XmlDocument*, ABI::Windows::Data::Xml::Dom::IXmlDocument* > >
            {
            };
        }
    }
}
extern "C" {
#ifdef __CRT_UUID_DECL
__CRT_UUID_DECL(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument, 0x5eef7817, 0x93dd, 0x5c0b, 0x9e,0x5a, 0xeb,0x49,0x04,0x08,0xf3,0xa9)
#endif
#else
typedef struct __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl {
    BEGIN_INTERFACE

    /*** IUnknown methods ***/
    HRESULT (STDMETHODCALLTYPE *QueryInterface)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        REFIID riid,
        void **ppvObject);

    ULONG (STDMETHODCALLTYPE *AddRef)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    ULONG (STDMETHODCALLTYPE *Release)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This);

    /*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
    HRESULT (STDMETHODCALLTYPE *Invoke)(
        __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument *This,
        __FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,
        AsyncStatus status);

    END_INTERFACE
} __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl;

interface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument {
    CONST_VTBL __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl* lpVtbl;
};

#ifdef COBJMACROS
#ifndef WIDL_C_INLINE_WRAPPERS
/*** IUnknown methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(This,riid,ppvObject) (This)->lpVtbl->QueryInterface(This,riid,ppvObject)
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(This) (This)->lpVtbl->AddRef(This)
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(This) (This)->lpVtbl->Release(This)
/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
#define __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(This,info,status) (This)->lpVtbl->Invoke(This,info,status)
#else
/*** IUnknown methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,REFIID riid,void **ppvObject) {
    return This->lpVtbl->QueryInterface(This,riid,ppvObject);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->AddRef(This);
}
static __WIDL_INLINE ULONG __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This) {
    return This->lpVtbl->Release(This);
}
/*** IAsyncOperationCompletedHandler<ABI::Windows::Data::Xml::Dom::XmlDocument* > methods ***/
static __WIDL_INLINE HRESULT __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke(__FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument* This,__FIAsyncOperation_1_Windows__CData__CXml__CDom__CXmlDocument *info,AsyncStatus status) {
    return This->lpVtbl->Invoke(This,info,status);
}
#endif
#ifdef WIDL_using_Windows_Foundation
#define IID_IAsyncOperationCompletedHandler_XmlDocument IID___FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperationCompletedHandler_XmlDocumentVtbl __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocumentVtbl
#define IAsyncOperationCompletedHandler_XmlDocument __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument
#define IAsyncOperationCompletedHandler_XmlDocument_QueryInterface __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_QueryInterface
#define IAsyncOperationCompletedHandler_XmlDocument_AddRef __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_AddRef
#define IAsyncOperationCompletedHandler_XmlDocument_Release __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Release
#define IAsyncOperationCompletedHandler_XmlDocument_Invoke __FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_Invoke
#endif /* WIDL_using_Windows_Foundation */
#endif

#endif

#endif  /* ____FIAsyncOperationCompletedHandler_1_Windows__CData__CXml__CDom__CXmlDocument_INTERFACE_DEFINED__ */

/* Begin additional prototypes for all interfaces */

ULONG           __RPC_USER HSTRING_UserSize     (ULONG *, ULONG, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserMarshal  (ULONG *, unsigned char *, HSTRING *);
unsigned char * __RPC_USER HSTRING_UserUnmarshal(ULONG *, unsigned char *, HSTRING *);
void            __RPC_USER HSTRING_UserFree     (ULONG *, HSTRING *);

/* End additional prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __windows_data_xml_dom_h__ */
