<?xml version="1.0" encoding="utf-8"?>
<!--
  <copyright file="util.xsd" company="Outercurve Foundation">
    Copyright (c) 2004, Outercurve Foundation.
    This software is released under Microsoft Reciprocal License (MS-RL).
    The license and further copyright text can be found in the file
    LICENSE.TXT at the root directory of the distribution.
  </copyright>
-->
<xs:schema xmlns:html="http://www.w3.org/1999/xhtml" xmlns:wix="http://schemas.microsoft.com/wix/2006/wi" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xse="http://schemas.microsoft.com/wix/2005/XmlSchemaExtension" targetNamespace="http://schemas.microsoft.com/wix/UtilExtension" xmlns="http://schemas.microsoft.com/wix/UtilExtension">
  <xs:annotation>
    <xs:documentation>
            The source code schema for the Windows Installer XML Toolset Utility Extension.
        </xs:documentation>
  </xs:annotation>
  <xs:import namespace="http://schemas.microsoft.com/wix/2006/wi" />
  <xs:element name="CloseApplication">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
      <xs:documentation>Closes applications or schedules a reboot if application cannot be closed.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:annotation>
            <xs:documentation>
                            Condition that determines if the application should be closed.  Must be blank or evaluate to true
                            for the application to be scheduled for closing.
                        </xs:documentation>
          </xs:annotation>
          <xs:attribute name="Id" type="xs:string" use="required">
            <xs:annotation>
              <xs:documentation>Identifier for the close application (primary key).</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Target" type="xs:string" use="required">
            <xs:annotation>
              <xs:documentation>Name of the exectuable to be closed.  This should only be file name.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Description" type="xs:string">
            <xs:annotation>
              <xs:documentation>Description to show if application is running and needs to be closed.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Sequence" type="xs:integer">
            <xs:annotation>
              <xs:documentation>Optionally orders the applications to be closed.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="CloseMessage" type="YesNoType">
            <xs:annotation>
              <xs:documentation>Optionally sends a close message to the application. Default is no.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="ElevatedCloseMessage" type="YesNoType">
            <xs:annotation>
              <xs:documentation>Optionally sends a close message to the application from deffered action without impersonation. Default is no.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="RebootPrompt" type="YesNoType">
            <xs:annotation>
              <xs:documentation>Optionally prompts for reboot if application is still running. Default is yes.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Property" type="xs:string">
            <xs:annotation>
              <xs:documentation>Property to be set if application is still running. Useful for launch conditions or to conditionalize custom UI to ask user to shut down apps.</xs:documentation>
            </xs:annotation>
          </xs:attribute>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="ComponentSearch">
    <xs:annotation>
      <xs:documentation>Describes a component search.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="SearchCommonAttributes" />
      <xs:attribute name="Guid" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Component to search for.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ProductCode" type="xs:string">
        <xs:annotation>
          <xs:documentation>Optional ProductCode to determine if the component is installed.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Result">
        <xs:annotation>
          <xs:documentation>
                        Rather than saving the matching key path into the variable, a ComponentSearch can save an attribute of the component instead.
                    </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="directory">
              <xs:annotation>
                <xs:documentation>Saves the parent directory for the component's file key path; other types of key path are returned unmodified.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="state">
              <xs:annotation>
                <xs:documentation>Saves the state of the component: absent (2), locally installed (3), will run from source (4), or installed in default location (either local or from source) (5)</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="keyPath">
              <xs:annotation>
                <xs:documentation>Saves the key path of the component if installed. This is the default.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="ComponentSearchRef">
    <xs:annotation>
      <xs:documentation>References a ComponentSearch.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="DirectorySearch">
    <xs:annotation>
      <xs:documentation>Describes a directory search.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="SearchCommonAttributes" />
      <xs:attribute name="Path" type="xs:string">
        <xs:annotation>
          <xs:documentation>Directory path to search for.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Result">
        <xs:annotation>
          <xs:documentation>
            Rather than saving the matching directory path into the variable, a DirectorySearch can save an
            attribute of the matching directory instead.
          </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="exists">
              <xs:annotation>
                <xs:documentation>Saves true if a matching directory is found; false otherwise.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="DirectorySearchRef">
    <xs:annotation>
      <xs:documentation>References a DirectorySearch.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="EventSource">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
      </xs:appinfo>
      <xs:documentation>Creates an event source.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="CategoryCount" type="xs:integer">
        <xs:annotation>
          <xs:documentation>
                        The number of categories in CategoryMessageFile. CategoryMessageFile
                        must be specified too.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="CategoryMessageFile" type="xs:string">
        <xs:annotation>
          <xs:documentation>
                        Name of the category message file. CategoryCount must be specified too.
                        Note that this is a formatted field, so you can use [#fileId] syntax to
                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
                        string, so you can use %environment_variable% syntax to refer to a file
                        already present on the user's machine.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="EventMessageFile" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
                        Name of the event message file.
                        Note that this is a formatted field, so you can use [#fileId] syntax to
                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
                        string, so you can use %environment_variable% syntax to refer to a file
                        already present on the user's machine.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="KeyPath" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Marks the EventSource registry as the key path of the component it belongs to.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Log" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Name of the event source's log.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Name of the event source.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ParameterMessageFile" type="xs:string">
        <xs:annotation>
          <xs:documentation>
                        Name of the parameter message file.
                        Note that this is a formatted field, so you can use [#fileId] syntax to
                        refer to a file being installed. It is also written as a REG_EXPAND_SZ
                        string, so you can use %environment_variable% syntax to refer to a file
                        already present on the user's machine.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SupportsErrors" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Equivalent to EVENTLOG_ERROR_TYPE.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SupportsFailureAudits" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Equivalent to EVENTLOG_AUDIT_FAILURE.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SupportsInformationals" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Equivalent to EVENTLOG_INFORMATION_TYPE.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SupportsSuccessAudits" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Equivalent to EVENTLOG_AUDIT_SUCCESS.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SupportsWarnings" type="YesNoType">
        <xs:annotation>
          <xs:documentation>
                        Equivalent to EVENTLOG_WARNING_TYPE.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="FileSearch">
    <xs:annotation>
      <xs:documentation>Describes a file search.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="SearchCommonAttributes" />
      <xs:attribute name="Path" type="xs:string">
        <xs:annotation>
          <xs:documentation>File path to search for.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Result">
        <xs:annotation>
          <xs:documentation>
                        Rather than saving the matching file path into the variable, a FileSearch can save an attribute of the matching file instead.
                    </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="exists">
              <xs:annotation>
                <xs:documentation>Saves true if a matching file is found; false otherwise.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="version">
              <xs:annotation>
                <xs:documentation>Saves the version information for files that have it (.exe, .dll); zero-version (0.0.0.0) otherwise.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="FileSearchRef">
    <xs:annotation>
      <xs:documentation>References a FileSearch.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="FileShare">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
      </xs:appinfo>
      <xs:documentation>Creates a file share out of the component's directory.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="FileSharePermission" minOccurs="1" maxOccurs="unbounded">
          <xs:annotation>
            <xs:documentation>ACL permission</xs:documentation>
          </xs:annotation>
        </xs:element>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Identifier for the file share (primary key).</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Name of the file share.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Description" type="xs:string">
        <xs:annotation>
          <xs:documentation>Description of the file share.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="FileSharePermission">
    <xs:annotation>
      <xs:documentation>
                Sets ACLs on a FileShare.  This element has no Id attribute.
                The table and key are taken from the parent element.
            </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="User" use="required" type="xs:string"></xs:attribute>
      <!-- Common ACLs -->
      <xs:attribute name="Read" type="YesNoType"></xs:attribute>
      <xs:attribute name="Delete" type="YesNoType"></xs:attribute>
      <xs:attribute name="ReadPermission" type="YesNoType"></xs:attribute>
      <xs:attribute name="ChangePermission" type="YesNoType"></xs:attribute>
      <xs:attribute name="TakeOwnership" type="YesNoType"></xs:attribute>
      <!-- Folder and File ACLs -->
      <xs:attribute name="ReadAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="WriteAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="ReadExtendedAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="WriteExtendedAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="Synchronize" type="YesNoType"></xs:attribute>
      <!-- Folder only ACLs -->
      <xs:attribute name="CreateFile" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="CreateChild" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="DeleteChild" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Traverse" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <!-- Generic ACLs, mapped by system to appropriate permissions -->
      <xs:attribute name="GenericAll" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericExecute" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericWrite" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericRead" type="YesNoType">
        <xs:annotation>
          <xs:documentation>specifying this will fail to grant read access</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="Group">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
      </xs:appinfo>
      <xs:documentation>
                Finds user groups on the local machine or specified Active Directory domain. The local machine will be
                searched for the group first then fallback to looking in Active Directory. This element is not capable
                of creating new groups but can be used to add new or existing users to an existing group.
            </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Unique identifier in your installation package for this group.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>A <html:a href="http://msdn.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</html:a> string that contains the name of the group to be found.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Domain" type="xs:string">
        <xs:annotation>
          <xs:documentation>An optional <html:a href="http://msdn.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</html:a> string that specifies the domain for the group.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="GroupRef">
    <xs:annotation>
      <xs:documentation>Used to join a user to a group</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="InternetShortcut">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
        <xse:howtoRef href="create_internet_shortcut.htm">How To: Create a shortcut to a webpage</xse:howtoRef>
      </xs:appinfo>
      <xs:documentation>Creates a shortcut to a URL.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Unique identifier in your installation package for this Internet shortcut.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Directory" type="xs:string">
        <xs:annotation>
          <xs:documentation>Identifier reference to Directory element where shortcut is to be created. This attribute's value defaults to the parent Component directory.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
                        The name of the shortcut file, which is visible to the user. (The .lnk 
                        extension is added automatically and by default, is not shown to the user.)
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Target" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>
                        URL that should be opened when the user selects the shortcut. Windows
                        opens the URL in the appropriate handler for the protocol specified 
                        in the URL. Note that this is a formatted field, so you can use 
                        [#fileId] syntax to refer to a file being installed (using the file: 
                        protocol).
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Type">
        <xs:annotation>
          <xs:documentation>Which type of shortcut should be created.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="url">
              <xs:annotation>
                <xs:documentation>Creates .url files using IUniformResourceLocatorW.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="link">
              <xs:annotation>
                <xs:documentation>Creates .lnk files using IShellLinkW (default).</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="PerformanceCategory">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
      </xs:appinfo>
      <xs:documentation>Used to create performance categories and configure performance counters.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="PerformanceCounter" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="Id" type="xs:string">
        <xs:annotation>
          <xs:documentation>Unique identifier in your installation package for this performance counter category.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Name for the performance counter category.  If this attribute is not provided the Id attribute is used as the name of the performance counter category.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Help" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Optional help text for the performance counter category.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="MultiInstance" type="YesNoType" use="optional">
        <xs:annotation>
          <xs:documentation>Flag that specifies whether the performance counter category is multi or single instanced.  Default is single instance.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Library" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>DLL that contains the performance counter.  The default is "netfxperf.dll" which should be used for all managed code performance counters.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Open" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Function entry point in to the Library DLL called when opening the performance counter.  The default is "OpenPerformanceData" which should be used for all managed code performance counters.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Close" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Function entry point in to the Library DLL called when closing the performance counter.  The default is "ClosePerformanceData" which should be used for all managed code performance counters.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Collect" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Function entry point in to the Library DLL called when collecting data from the performance counter.  The default is "CollectPerformanceData" which should be used for all managed code performance counters.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="DefaultLanguage" type="PerformanceCounterLanguageType">
        <xs:annotation>
          <xs:documentation>Default language for the performance category and contained counters' names and help text.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="PerformanceCounter">
    <xs:annotation>
      <xs:documentation>Creates a performance counter in a performance category.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Name" type="xs:string">
        <xs:annotation>
          <xs:documentation>Name for the performance counter.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Help" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>Optional help text for the performance counter.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Type" type="PerformanceCounterTypesType">
        <xs:annotation>
          <xs:documentation>Type of the performance counter.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Language" type="PerformanceCounterLanguageType" use="optional">
        <xs:annotation>
          <xs:documentation>Language for the peformance counter name and help.  The default is to use the parent PerformanceCategory element's DefaultLanguage attribute.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="PerfCounter">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
        <xse:deprecated ref="PerformanceCounter" />
      </xs:appinfo>
      <xs:documentation>Used to install Perfmon counters.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Name" type="xs:string" />
    </xs:complexType>
  </xs:element>
  <xs:element name="PerfCounterManifest">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
      </xs:appinfo>
      <xs:documentation>Used to install Perfmon Counter Manifests.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="ResourceFileDirectory" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>The directory that holds the resource file of the providers in the perfmon counter manifest. Often the resource file path cannot be determined until setup time. Put the directory here and during perfmon manifest registrtion the path will be updated in the registry. If not specified, Perfmon will look for the resource file in the same directory of the perfmon counter manifest file.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="EventManifest">
    <xs:annotation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
      </xs:appinfo>
      <xs:documentation>Used to install Event Manifests.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="MessageFile" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>The message file (including path) of all the providers in the event manifest. Often the message file path cannot be determined until setup time. Put your MessageFile here and the messageFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ParameterFile" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>The parameter file (including path) of all the providers in the event manifest. Often the parameter file path cannot be determined until setup time. Put your ParameterFile here and the parameterFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ResourceFile" type="xs:string" use="optional">
        <xs:annotation>
          <xs:documentation>The resource file (including path) of all the providers in the event manifest. Often the resource file path cannot be determined until setup time. Put your ResourceFile here and the resourceFileName attribute of the all the providers in the manifest will be updated with the path before it is registered. </xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="PermissionEx">
    <xs:annotation>
      <xs:documentation>
                Sets ACLs on File, Registry, CreateFolder, or ServiceInstall.  When under a Registry element, this cannot be used
                if the Action attribute's value is remove or removeKeyOnInstall.  This element has no Id attribute.
                The table and key are taken from the parent element. To use PermissionEx with an IA-64 MSI, you must
                compile all of your source files with the "-arch ia64" switch, to ensure the IA-64 custom action is used, and not
                the x64 custom action.
            </xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="CreateFolder" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="File" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Registry" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="RegistryKey" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="RegistryValue" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Domain" type="xs:string"></xs:attribute>
      <xs:attribute name="User" use="required" type="xs:string"></xs:attribute>
      <!-- Common ACLs -->
      <xs:attribute name="Read" type="YesNoType"></xs:attribute>
      <xs:attribute name="Delete" type="YesNoType"></xs:attribute>
      <xs:attribute name="ReadPermission" type="YesNoType"></xs:attribute>
      <xs:attribute name="ChangePermission" type="YesNoType"></xs:attribute>
      <xs:attribute name="TakeOwnership" type="YesNoType"></xs:attribute>
      <!-- Folder and File ACLs -->
      <xs:attribute name="ReadAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="WriteAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="ReadExtendedAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="WriteExtendedAttributes" type="YesNoType"></xs:attribute>
      <xs:attribute name="Synchronize" type="YesNoType"></xs:attribute>
      <!-- Folder only ACLs -->
      <xs:attribute name="CreateFile" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to create a file in the directory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="CreateChild" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to create a subdirectory.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="DeleteChild" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to delete a directory and all the files it contains, including read-only files.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Traverse" type="YesNoType">
        <xs:annotation>
          <xs:documentation>For a directory, the right to traverse the directory.  By default, users are assigned the BYPASS_TRAVERSE_CHECKING privilege, which ignores the FILE_TRAVERSE access right.  Only valid under a 'CreateFolder' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <!-- File only ACLs -->
      <xs:attribute name="Append" type="YesNoType"></xs:attribute>
      <xs:attribute name="Execute" type="YesNoType"></xs:attribute>
      <!-- File and Registry ACLs -->
      <xs:attribute name="Write" type="YesNoType"></xs:attribute>
      <!-- Registry only ACLs -->
      <xs:attribute name="CreateSubkeys" type="YesNoType"></xs:attribute>
      <xs:attribute name="EnumerateSubkeys" type="YesNoType"></xs:attribute>
      <xs:attribute name="Notify" type="YesNoType"></xs:attribute>
      <xs:attribute name="CreateLink" type="YesNoType"></xs:attribute>
      <!-- Generic ACLs, mapped by system to appropriate permissions -->
      <xs:attribute name="GenericAll" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericExecute" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericWrite" type="YesNoType"></xs:attribute>
      <xs:attribute name="GenericRead" type="YesNoType">
        <xs:annotation>
          <xs:documentation>specifying this will fail to grant read access</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <!-- Service only ACLs -->
      <xs:attribute name="ServiceQueryConfig" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the QueryServiceConfig and QueryServiceConfig2 functions to query the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceChangeConfig" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the ChangeServiceConfig or ChangeServiceConfig2 function to change the service configuration.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceQueryStatus" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the QueryServiceStatus function to ask the service control manager about the status of the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceEnumerateDependents" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the EnumDependentServices function to enumerate all the services dependent on the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceStart" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the StartService function to start the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceStop" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the ControlService function to stop the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServicePauseContinue" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the ControlService function to pause or continue the service.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceInterrogate" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the ControlService function to ask the service to report its status immediately.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceUserDefinedControl" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Required to call the ControlService function to specify a user-defined control code.  Only valid under a 'ServiceInstall' parent.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="ProductSearch">
    <xs:annotation>
      <xs:documentation>Describes a product search.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="SearchCommonAttributes" />
      <xs:attribute name="Guid" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>ProductCode to search for.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Result">
        <xs:annotation>
          <xs:documentation>
                        Rather than saving the product version into the variable, a ProductSearch can save another attribute of the matching product instead.
                    </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="version">
              <xs:annotation>
                <xs:documentation>Saves the version of a matching product if found; 0.0.0.0 otherwise. This is the default.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="language">
              <xs:annotation>
                <xs:documentation>Saves the language of a matching product if found; empty otherwise.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="state">
              <xs:annotation>
                <xs:documentation>Saves the state of the product: advertised (1), absent (2), or locally installed (3).</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="assignment">
              <xs:annotation>
                <xs:documentation>Saves the assignment type of the product: per-user (0), or per-machine (1).</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="ProductSearchRef">
    <xs:annotation>
      <xs:documentation>References a ProductSearch.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="RemoveFolderEx">
      <xs:annotation>
          <xs:appinfo>
              <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
              <xse:msiRef table="RemoveFile" href="http://msdn.microsoft.com/library/aa371201.aspx"/>
              <xse:remarks>
                <html:p>The custom action that implements RemoveFolderEx does so by writing temporary rows to the RemoveFile table
                for each subfolder of the root folder you specify. Because it might dramatically affect Windows Installer's
                <html:a href="http://msdn.microsoft.com/en-us/library/aa368593.aspx">File Costing</html:a>, 
                the temporary rows must be written before the CostInitialize standard action. Unfortunately, MSI doesn't
                create properties for the Directory hierarchy in your package until later, in the CostFinalize action.</html:p>
                <html:p>An easy workaround for a typical use case of removing a folder during uninstall is to write the directory
                path to the registry and to load it during uninstall. See 
                <html:a href="http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern">The WiX toolset's "Remember Property" pattern</html:a>
                for an example.</html:p>
                <html:p>If you use custom actions to set properties, ensure that they are scheduled before the WixRemoveFoldersEx custom action.</html:p>
              </xse:remarks>
          </xs:appinfo>
          <xs:documentation>
              Remove a folder and all contained files and folders if the parent component is selected for installation or removal.
              The folder must be specified in the Property attribute as the name of a property that will have a value that resolves 
              to the full path of the folder before the CostInitialize action. Note that Directory ids cannot be used. 
              For more details, see the Remarks.
          </xs:documentation>
      </xs:annotation>
      <xs:complexType>
          <xs:attribute name="Id" type="xs:string">
              <xs:annotation>
                  <xs:documentation>Primary key used to identify this particular entry. If this is not specified, a stable identifier
                  will be generated at compile time based on the other attributes.</xs:documentation>
              </xs:annotation>
          </xs:attribute>
          <xs:attribute name="Property" type="xs:string">
              <xs:annotation>
                  <xs:documentation>
                      The id of a property that resolves to the full path of the source directory.  The property does not have
                      to exist in the installer database at creation time; it could be created at installation time by a custom
                      action, on the command line, etc. The property value can contain environment variables surrounded by 
                      percent signs such as from a REG_EXPAND_SZ registry value; environment variables will be expanded before 
                      being evaluated for a full path.
                  </xs:documentation>
              </xs:annotation>
          </xs:attribute>
          <xs:attribute name="On">
              <xs:annotation>
                  <xs:documentation>
                      This value determines when the folder may be removed.
                  </xs:documentation>
              </xs:annotation>
              <xs:simpleType>
                  <xs:restriction base="xs:NMTOKEN">
                      <xs:enumeration value="install">
                          <xs:annotation>
                              <xs:documentation>
                                  Removes the folder only when the parent component is being installed (msiInstallStateLocal or msiInstallStateSource).
                              </xs:documentation>
                          </xs:annotation>
                      </xs:enumeration>
                      <xs:enumeration value="uninstall">
                          <xs:annotation>
                              <xs:documentation>
                                  Default: Removes the folder only when the parent component is being removed (msiInstallStateAbsent).
                              </xs:documentation>
                          </xs:annotation>
                      </xs:enumeration>
                      <xs:enumeration value="both">
                          <xs:annotation>
                              <xs:documentation>
                                  Removes the folder when the parent component is being installed or removed.
                              </xs:documentation>
                          </xs:annotation>
                      </xs:enumeration>
                  </xs:restriction>
              </xs:simpleType>
          </xs:attribute>
      </xs:complexType>
  </xs:element>
  <xs:element name="RestartResource">
    <xs:annotation>
      <xs:documentation>Registers a resource with the Restart Manager.</xs:documentation>
      <xs:appinfo>
          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
          <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string">
        <xs:annotation>
          <xs:documentation>The unique identifier for this resource. A unique identifier will
                    be generated automatically if not specified.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Path" type="xs:string">
        <xs:annotation>
          <xs:documentation>The full path to the process module to register with the Restart Manager.
                    This can be a formatted value that resolves to a full path.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ProcessName" type="xs:string">
        <xs:annotation>
          <xs:documentation>The name of a process to register with the Restart Manager.
                    This can be a formatted value that resolves to a process name.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ServiceName" type="xs:string">
        <xs:annotation>
          <xs:documentation>The name of a Windows service to register with the Restart Manager.
                    This can be a formatted value that resolves to a service name.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="RegistrySearch">
    <xs:annotation>
      <xs:documentation>Describes a registry search.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attributeGroup ref="SearchCommonAttributes" />
      <xs:attribute name="Root" use="required">
        <xs:annotation>
          <xs:documentation>Registry root hive to search under.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="HKLM">
              <xs:annotation>
                <xs:documentation>HKEY_LOCAL_MACHINE</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="HKCU">
              <xs:annotation>
                <xs:documentation>HKEY_CURRENT_USER</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="HKCR">
              <xs:annotation>
                <xs:documentation>HKEY_CLASSES_ROOT</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="HKU">
              <xs:annotation>
                <xs:documentation>HKEY_USERS</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="Key" type="xs:string" use="required">
        <xs:annotation>
          <xs:documentation>Key to search for.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Value" type="xs:string">
        <xs:annotation>
          <xs:documentation>Optional value to search for under the given Key.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Format">
        <xs:annotation>
          <xs:documentation>What format to return the value in.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="raw">
              <xs:annotation>
                <xs:documentation>Returns the unformatted value directly from the registry. For example, a REG_DWORD value of '1' is returned as '1', not '#1'.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="compatible">
              <xs:annotation>
                <xs:documentation>Returns the value formatted as Windows Installer would. For example, a REG_DWORD value of '1' is returned as '#1', not '1'.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ExpandEnvironmentVariables" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Whether to expand any environment variables in REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ values.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Result">
        <xs:annotation>
          <xs:documentation>
                        Rather than saving the matching registry value into the variable, a RegistrySearch can save an attribute of the matching entry instead.
                    </xs:documentation>
                </xs:annotation>
                <xs:simpleType>
                    <xs:restriction base="xs:NMTOKEN">
                        <xs:enumeration value="exists">
                            <xs:annotation>
                                <xs:documentation>Saves true if a matching registry entry is found; false otherwise.</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                        <xs:enumeration value="value">
                            <xs:annotation>
                                <xs:documentation>Saves the value of the registry key in the variable. This is the default.</xs:documentation>
                            </xs:annotation>
                        </xs:enumeration>
                    </xs:restriction>
                </xs:simpleType>
            </xs:attribute>
            <xs:attribute name="Win64" type="YesNoType">
                <xs:annotation>
                    <xs:documentation>Instructs the search to look in the 64-bit registry when the value is 'yes'. When the value is 'no', the search looks in the 32-bit registry. The default value is 'no'.</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
  <xs:element name="RegistrySearchRef">
    <xs:annotation>
      <xs:documentation>References a RegistrySearch.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Bundle" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" type="xs:string" use="required" />
    </xs:complexType>
  </xs:element>
  <xs:element name="ServiceConfig">
    <xs:annotation>
      <xs:documentation>Service configuration information for failure actions.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="ServiceInstall" />
        <xse:remarks>
          <html:dl>
            <html:dd>Nesting a ServiceConfig element under a ServiceInstall element will result in the service being installed to be configured.</html:dd>
            <html:dd>Nesting a ServiceConfig element under a component element will result in an already installed service to be configured.  If the service does not exist prior to the install of the MSI package, the install will fail.</html:dd>
          </html:dl>
        </xse:remarks>
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="ServiceName" type="xs:string">
        <xs:annotation>
          <xs:documentation>Required if not under a ServiceInstall element.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="FirstFailureActionType" use="required">
        <xs:annotation>
          <xs:documentation>Action to take on the first failure of the service.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="none" />
            <xs:enumeration value="reboot" />
            <xs:enumeration value="restart" />
            <xs:enumeration value="runCommand" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="SecondFailureActionType" use="required">
        <xs:annotation>
          <xs:documentation>Action to take on the second failure of the service.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="none" />
            <xs:enumeration value="reboot" />
            <xs:enumeration value="restart" />
            <xs:enumeration value="runCommand" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ThirdFailureActionType" use="required">
        <xs:annotation>
          <xs:documentation>Action to take on the third failure of the service.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="none" />
            <xs:enumeration value="reboot" />
            <xs:enumeration value="restart" />
            <xs:enumeration value="runCommand" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ResetPeriodInDays" type="xs:integer">
        <xs:annotation>
          <xs:documentation>Number of days after which to reset the failure count to zero if there are no failures.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="RestartServiceDelayInSeconds" type="xs:integer">
        <xs:annotation>
          <xs:documentation>If any of the three *ActionType attributes is "restart", this specifies the number of seconds to wait before doing so.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ProgramCommandLine" type="xs:string">
        <xs:annotation>
          <xs:documentation>If any of the three *ActionType attributes is "runCommand", this specifies the command to run when doing so.  This value is formatted.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="RebootMessage" type="xs:string">
        <xs:annotation>
          <xs:documentation>If any of the three *ActionType attributes is "reboot", this specifies the message to broadcast to server users before doing so.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="User">
    <xs:annotation>
      <xs:documentation>User for all kinds of things.  When it is not nested under a component it is included in the MSI so it can be referenced by other elements such as the User attribute in the AppPool element.  When it is nested under a Component element, the User will be created on install and can also be used for reference.</xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Fragment" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Module" />
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Product" />
        <xse:seeAlso ref="Group" />
        <xse:seeAlso ref="GroupRef" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="GroupRef" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="Id" type="xs:string" use="required" />
      <xs:attribute name="Name" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>A <a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</a> string that contains the name of the user account.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Domain" type="xs:string">
        <xs:annotation>
          <xs:documentation>A <a href="http://msdn2.microsoft.com/library/aa368609.aspx" target="_blank">Formatted</a> string that contains the local machine or Active Directory domain for the user.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Password" type="xs:string">
        <xs:annotation>
          <xs:documentation>Usually a Property that is passed in on the command-line to keep it more secure.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="PasswordNeverExpires" type="YesNoType">
        <xs:annotation>
          <xs:documentation>The account's password never expires. Equivalent to UF_DONT_EXPIRE_PASSWD.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="CanNotChangePassword" type="YesNoType">
        <xs:annotation>
          <xs:documentation>The user cannot change the account's password. Equivalent to UF_PASSWD_CANT_CHANGE.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="RemoveOnUninstall" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates whether the user account should be removed or left behind on uninstall.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="FailIfExists" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates if the install should fail if the user already exists.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="LogonAsService" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates whether or not the user can logon as a serivce.  User creation can be skipped if all that is desired is to set this access right on the user.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="UpdateIfExists" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates if the user account properties should be updated if the user already exists.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="PasswordExpired" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates whether the user must change their password on their first login.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Disabled" type="YesNoType">
        <xs:annotation>
          <xs:documentation>The account is disabled. Equivalent to UF_ACCOUNTDISABLE.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="CreateUser" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Indicates whether or not to create the user.  User creation can be skipped if all that is desired is to join a user to groups.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="XmlFile">
    <xs:annotation>
      <xs:documentation>
                Adds or removes .xml file entries.  If you use the XmlFile element you must reference WixUtilExtension.dll as it contains the XmlFile custom actions.
            </xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType>
      <xs:attribute name="Id" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>Identifier for xml file modification.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ElementPath" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>The XPath of the element to be modified.  Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="File" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>Path of the .xml file to configure.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string">
        <xs:annotation>
          <xs:documentation>Name of XML node to set/add to the specified element.  Not setting this attribute causes the element's text value to be set.  Otherwise this specified the attribute name that is set.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Value" type="xs:string">
        <xs:annotation>
          <xs:documentation>
                        The value to be written.  See the <html:a href="http://msdn.microsoft.com/library/aa368609(VS.85).aspx" target="_blank">Formatted topic</html:a> for information how to escape square brackets in the value.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Action" use="required">
        <xs:annotation>
          <xs:documentation>The type of modification to be made to the XML file when the component is installed.</xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="createElement">
              <xs:annotation>
                <xs:documentation>Creates a new element under the element specified in ElementPath.  The Name attribute is required in this case and specifies the name of the new element.  The Value attribute is not necessary when createElement is specified as the action.  If the Value attribute is set, it will cause the new element's text value to be set.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="deleteValue">
              <xs:annotation>
                <xs:documentation>Deletes a value from the element specified in the ElementPath.  If Name is specified, the attribute with that name is deleted.  If Name is not specified, the text value of the element specified in the ElementPath is deleted.  The Value attribute is ignored if deleteValue is the action specified.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="setValue">
              <xs:annotation>
                <xs:documentation>Sets a value in the element specified in the ElementPath.  If Name is specified, and attribute with that name is set to the value specified in Value.  If Name is not specified, the text value of the element is set.  Value is a required attribute if setValue is the action specified.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="bulkSetValue">
              <xs:annotation>
                <xs:documentation>Sets all the values in the elements that match the ElementPath.  If Name is specified, attributes with that name are set to the same value specified in Value.  If Name is not specified, the text values of the elements are set.  Value is a required attribute if setBulkValue is the action specified.</xs:documentation>
              </xs:annotation>
            </xs:enumeration>
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="Permanent" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Specifies whether or not the modification should be removed on uninstall.  This has no effect on uninstall if the action was deleteValue.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="PreserveModifiedDate" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Specifies wheter or not the modification should preserve the modified date.  Preserving the modified date will allow the file to be patched if no other modifications have been made.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Sequence" use="optional" type="xs:integer">
        <xs:annotation>
          <xs:documentation>Specifies the order in which the modification is to be attempted on the XML file.  It is important to ensure that new elements are created before you attempt to add an attribute to them.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="SelectionLanguage">
        <xs:annotation>
          <xs:documentation>
                        Specify whether the DOM object should use XPath language or the old XSLPattern language (default) as the query language.                        
                    </xs:documentation>
        </xs:annotation>
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="XPath" />
            <xs:enumeration value="XSLPattern" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:element name="XmlConfig">
    <xs:annotation>
      <xs:documentation>
                Adds or removes .xml file entries.  If you use the XmlConfig element you must reference WixUtilExtension.dll as it contains the XmlConfig custom actions.
            </xs:documentation>
      <xs:appinfo>
        <xse:parent namespace="http://schemas.microsoft.com/wix/2006/wi" ref="Component" />
      </xs:appinfo>
    </xs:annotation>
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element ref="XmlConfig" minOccurs="0" maxOccurs="unbounded" />
      </xs:sequence>
      <xs:attribute name="Id" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>Identifier for xml file modification.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Action">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="create" />
            <xs:enumeration value="delete" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="ElementId" type="xs:string">
        <xs:annotation>
          <xs:documentation>The Id of another XmlConfig to add attributes to.  In this case, the 'ElementPath', 'Action', 'Node', and 'On' attributes must be omitted.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="ElementPath" type="xs:string">
        <xs:annotation>
          <xs:documentation>The XPath of the parent element being modified.  Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="File" use="required" type="xs:string">
        <xs:annotation>
          <xs:documentation>Path of the .xml file to configure.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Name" type="xs:string">
        <xs:annotation>
          <xs:documentation>Name of XML node to set/add to the specified element.  Not setting this attribute causes the element's text value to be set.  Otherwise this specified the attribute name that is set.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Node">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="element" />
            <xs:enumeration value="value" />
            <xs:enumeration value="document" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="On">
        <xs:simpleType>
          <xs:restriction base="xs:NMTOKEN">
            <xs:enumeration value="install" />
            <xs:enumeration value="uninstall" />
          </xs:restriction>
        </xs:simpleType>
      </xs:attribute>
      <xs:attribute name="PreserveModifiedDate" type="YesNoType">
        <xs:annotation>
          <xs:documentation>Specifies wheter or not the modification should preserve the modified date.  Preserving the modified date will allow the file to be patched if no other modifications have been made.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Sequence" use="optional" type="xs:integer">
        <xs:annotation>
          <xs:documentation>Specifies the order in which the modification is to be attempted on the XML file.  It is important to ensure that new elements are created before you attempt to add an attribute to them.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="Value" type="xs:string">
        <xs:annotation>
          <xs:documentation>
                        The value to be written.  See the <html:a href="http://msdn.microsoft.com/library/aa368609(VS.85).aspx" target="_blank">Formatted topic</html:a> for information how to escape square brackets in the value.
                    </xs:documentation>
        </xs:annotation>
      </xs:attribute>
      <xs:attribute name="VerifyPath" type="xs:string">
        <xs:annotation>
          <xs:documentation>The XPath to the element being modified.  This is required for 'delete' actions.  For 'create' actions, VerifyPath is used to decide if the element already exists. Note that this is a formatted field and therefore, square brackets in the XPath must be escaped. In addition, XPaths allow backslashes to be used to escape characters, so if you intend to include literal backslashes, you must escape them as well by doubling them in this attribute. The string is formatted by MSI first, and the result is consumed as the XPath.</xs:documentation>
        </xs:annotation>
      </xs:attribute>
    </xs:complexType>
  </xs:element>
  <xs:attributeGroup name="SearchCommonAttributes">
    <xs:attribute name="Id" type="xs:string">
      <xs:annotation>
        <xs:documentation>Id of the search for ordering and dependency.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="Variable" type="xs:string" use="required">
      <xs:annotation>
        <xs:documentation>Name of the variable in which to place the result of the search.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="Condition" type="xs:string">
      <xs:annotation>
        <xs:documentation>Condition for evaluating the search. If this evaluates to false, the search is not executed at all.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
    <xs:attribute name="After" type="xs:string">
      <xs:annotation>
        <xs:documentation>Id of the search that this one should come after.</xs:documentation>
      </xs:annotation>
    </xs:attribute>
  </xs:attributeGroup>
  <xs:simpleType name="YesNoType">
    <xs:annotation>
      <xs:documentation>Values of this type will either be "yes" or "no".</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="no" />
      <xs:enumeration value="yes" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="PerformanceCounterLanguageType">
    <xs:annotation>
      <xs:documentation>Enumeration of valid languages for performance counters.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="afrikaans" />
      <xs:enumeration value="albanian" />
      <xs:enumeration value="arabic" />
      <xs:enumeration value="armenian" />
      <xs:enumeration value="assamese" />
      <xs:enumeration value="azeri" />
      <xs:enumeration value="basque" />
      <xs:enumeration value="belarusian" />
      <xs:enumeration value="bengali" />
      <xs:enumeration value="bulgarian" />
      <xs:enumeration value="catalan" />
      <xs:enumeration value="chinese" />
      <xs:enumeration value="croatian" />
      <xs:enumeration value="czech" />
      <xs:enumeration value="danish" />
      <xs:enumeration value="divehi" />
      <xs:enumeration value="dutch" />
      <xs:enumeration value="english" />
      <xs:enumeration value="estonian" />
      <xs:enumeration value="faeroese" />
      <xs:enumeration value="farsi" />
      <xs:enumeration value="finnish" />
      <xs:enumeration value="french" />
      <xs:enumeration value="galician" />
      <xs:enumeration value="georgian" />
      <xs:enumeration value="german" />
      <xs:enumeration value="greek" />
      <xs:enumeration value="gujarati" />
      <xs:enumeration value="hebrew" />
      <xs:enumeration value="hindi" />
      <xs:enumeration value="hungarian" />
      <xs:enumeration value="icelandic" />
      <xs:enumeration value="indonesian" />
      <xs:enumeration value="italian" />
      <xs:enumeration value="japanese" />
      <xs:enumeration value="kannada" />
      <xs:enumeration value="kashmiri" />
      <xs:enumeration value="kazak" />
      <xs:enumeration value="konkani" />
      <xs:enumeration value="korean" />
      <xs:enumeration value="kyrgyz" />
      <xs:enumeration value="latvian" />
      <xs:enumeration value="lithuanian" />
      <xs:enumeration value="macedonian" />
      <xs:enumeration value="malay" />
      <xs:enumeration value="malayalam" />
      <xs:enumeration value="manipuri" />
      <xs:enumeration value="marathi" />
      <xs:enumeration value="mongolian" />
      <xs:enumeration value="nepali" />
      <xs:enumeration value="norwegian" />
      <xs:enumeration value="oriya" />
      <xs:enumeration value="polish" />
      <xs:enumeration value="portuguese" />
      <xs:enumeration value="punjabi" />
      <xs:enumeration value="romanian" />
      <xs:enumeration value="russian" />
      <xs:enumeration value="sanskrit" />
      <xs:enumeration value="serbian" />
      <xs:enumeration value="sindhi" />
      <xs:enumeration value="slovak" />
      <xs:enumeration value="slovenian" />
      <xs:enumeration value="spanish" />
      <xs:enumeration value="swahili" />
      <xs:enumeration value="swedish" />
      <xs:enumeration value="syriac" />
      <xs:enumeration value="tamil" />
      <xs:enumeration value="tatar" />
      <xs:enumeration value="telugu" />
      <xs:enumeration value="thai" />
      <xs:enumeration value="turkish" />
      <xs:enumeration value="ukrainian" />
      <xs:enumeration value="urdu" />
      <xs:enumeration value="uzbek" />
      <xs:enumeration value="vietnamese" />
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="PerformanceCounterTypesType">
    <xs:annotation>
      <xs:documentation>Enumeration of valid types for performance counters.</xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:NMTOKEN">
      <xs:enumeration value="averageBase" />
      <xs:enumeration value="averageCount64" />
      <xs:enumeration value="averageTimer32" />
      <xs:enumeration value="counterDelta32" />
      <xs:enumeration value="counterTimerInverse" />
      <xs:enumeration value="sampleFraction" />
      <xs:enumeration value="timer100Ns" />
      <xs:enumeration value="counterTimer" />
      <xs:enumeration value="rawFraction" />
      <xs:enumeration value="timer100NsInverse" />
      <xs:enumeration value="counterMultiTimer" />
      <xs:enumeration value="counterMultiTimer100Ns" />
      <xs:enumeration value="counterMultiTimerInverse" />
      <xs:enumeration value="counterMultiTimer100NsInverse" />
      <xs:enumeration value="elapsedTime" />
      <xs:enumeration value="sampleBase" />
      <xs:enumeration value="rawBase" />
      <xs:enumeration value="counterMultiBase" />
      <xs:enumeration value="rateOfCountsPerSecond64" />
      <xs:enumeration value="rateOfCountsPerSecond32" />
      <xs:enumeration value="countPerTimeInterval64" />
      <xs:enumeration value="countPerTimeInterval32" />
      <xs:enumeration value="sampleCounter" />
      <xs:enumeration value="counterDelta64" />
      <xs:enumeration value="numberOfItems64" />
      <xs:enumeration value="numberOfItems32" />
      <xs:enumeration value="numberOfItemsHEX64" />
      <xs:enumeration value="numberOfItemsHEX32" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>