<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns="http://www.TianoCore.org/2006/Edk2.0" targetNamespace="http://www.TianoCore.org/2006/Edk2.0">
  <!--
    Filename: FrameworkDataElements.xsd
    
    Copyright (c) 2006, Intel Corp.
    All rights reserved. This program and the accompanying materials
    are licensed and made available under the terms and conditions of the BSD License
    which may be found at http://opensource.org/licenses/bsd-license.php
    
    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
    
  -->
  <xs:annotation>
    <xs:documentation xml:lang="en"> This schema defines EFI and Framework Data Elements </xs:documentation>
  </xs:annotation>
  <xs:include schemaLocation="NamingConvention.xsd"/>
  <xs:include schemaLocation="FrameworkDataTypes.xsd"/>
  <xs:include schemaLocation="FrameworkPlatformDataTypes.xsd"/>
  <xs:include schemaLocation="FrameworkDataAttributes.xsd"/>
  <xs:element name="Abstract" type="Sentence">
    <xs:annotation>
      <xs:documentation xml:lang="en">Abstract is valid for all Description Files</xs:documentation>
      <xs:documentation xml:lang="en">This section is required. This is a single sentence to describe the module and will be used in sample files as the abstract data in the header comment section.</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="AntTask">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a sub-element of UserDefinedAntTasks</xs:documentation>
      <xs:documentation xml:lang="en">Define a file that contains one or more ant tasks that are to be added into or replacing of sequences of build steps. These files will be called using the ant-call task on a file name. These files must be valid apache-ant formatted task files.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="AntCmdOptions" type="xs:normalizedString"/>
        <xs:element minOccurs="0" maxOccurs="1" name="Filename" type="PathAndFilename"/>
      </xs:sequence>
      <xs:attribute name="Id" type="xs:int" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="BootModes">
    <xs:annotation>
      <xs:documentation xml:lang="en">BootModes is valid for all Description Files</xs:documentation>
      <xs:documentation xml:lang="en">This is a list of BootModes Supported by the Module</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="BootMode">
          <xs:complexType>
            <xs:sequence minOccurs="0">
              <xs:element name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="BootModeAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="BuildOptions">
    <xs:annotation>
      <xs:documentation xml:lang="en">BuildOptions is valid for FPD files.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" ref="UserDefinedAntTasks"/>
        <xs:element minOccurs="0" maxOccurs="1" ref="Options"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="UserExtensions"/>
        <!-- The following sections are legacy and will be removed -->
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Ffs">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="0" maxOccurs="unbounded" name="Attribute">
                <xs:complexType>
                  <xs:attribute name="Name" type="C_NameType"/>
                  <xs:attribute name="Value" type="C_NameType"/>
                </xs:complexType>
              </xs:element>
              <xs:element minOccurs="0" maxOccurs="1" name="Sections">
                <xs:complexType>
                  <xs:sequence minOccurs="1">
                    <xs:element name="Section" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence>
                          <xs:element ref=" Filenames " minOccurs="0"/>
                          <xs:element name="Args" type=" ArgsType " minOccurs="0"/>
                          <xs:element name="OutFile" type=" FileNameConvention " minOccurs="0"/>
                          <xs:element name="OutputFileExtension" type=" xs:string " minOccurs="0"/>
                          <xs:element name="ToolName" type=" ToolType " minOccurs="0"/>
                        </xs:sequence>
                        <xs:attributeGroup ref=" SectionsAttributes "/>
                      </xs:complexType>
                    </xs:element>
                    <xs:element name="Sections" minOccurs="0" maxOccurs="unbounded">
                      <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="unbounded">
                          <xs:element name="Section">
                            <xs:complexType>
                              <xs:sequence>
                                <xs:element ref=" Filenames " minOccurs="0"/>
                                <xs:element name="Args" type=" ArgsType " minOccurs="0"/>
                                <xs:element name="OutFile" type=" FileNameConvention " minOccurs="0"/>
                                <xs:element name="OutputFileExtension" type=" xs:string " minOccurs="0"/>
                                <xs:element name="ToolName" type=" ToolType " minOccurs="0"/>
                              </xs:sequence>
                              <xs:attributeGroup ref="SectionsAttributes"/>
                            </xs:complexType>
                          </xs:element>
                        </xs:sequence>
                        <xs:attributeGroup ref=" SectionsAttributes "/>
                      </xs:complexType>
                    </xs:element>
                  </xs:sequence>
                  <xs:attributeGroup ref=" SectionsAttributes "/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="FfsKey" type="KeywordType" use="optional"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Copyright" type="Paragraph"/>
  <xs:element name="DataHubs">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a list of DataHubRecord elements.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="DataHubRecord">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="DataHubCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="DataHubAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="DefaultValue">
    <xs:annotation>
      <xs:documentation xml:lang="en">The default setting of a PCD entry.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:normalizedString"/>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="Description" type="Paragraph">
    <xs:annotation>
      <xs:documentation xml:lang="en">This section is required for new modules and libraries and must contain more information than the Abstract.</xs:documentation>
    </xs:annotation>
  </xs:element>
  <xs:element name="DynamicPcdBuildDefinitions">
    <xs:annotation>
      <xs:documentation xml:lang="en">Child of Framework Platform Description (FPD)</xs:documentation>
      <xs:documentation xml:lang="en">FPD uses this PCD information for Dynamic PCDs Only</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="PcdBuildData">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="Token" type="TokenDataType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="TokenSpaceGuidCName" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="DatumType" type="PcdDataTypes"/>
              <xs:element minOccurs="0" maxOccurs="1" name="MaxDatumSize" type="DatumSizeLimitation"/>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="SkuInfo">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="1" maxOccurs="1" name="SkuId" type="xs:nonNegativeInteger"/>
                    <xs:choice>
                      <xs:group minOccurs="0" maxOccurs="1" ref="HiiEnable"/>
                      <xs:group minOccurs="0" maxOccurs="1" ref="VpdEnable"/>
                      <xs:group minOccurs="0" maxOccurs="1" ref="DefaultGroup"/>
                    </xs:choice>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attributeGroup ref="DynamicBuildPcdAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Events">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a list of MSA Events</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="CreateEvents">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="EventTypes">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="1" maxOccurs="1" name="EventType" type="EventTypes"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
                  </xs:sequence>
                  <xs:attributeGroup ref="EventAttributes"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" maxOccurs="1" name="SignalEvents">
          <xs:annotation>
            <xs:documentation xml:lang="en">Module has an event that is waiting to be signaled. Event is named by GUID.</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="EventTypes">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="1" maxOccurs="1" name="EventType" type="EventTypes"/>
                    <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
                  </xs:sequence>
                  <xs:attributeGroup ref="EventAttributes"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Externs">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a child of MSA files.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence minOccurs="1">
        <xs:element minOccurs="0" maxOccurs="1" name="PcdIsDriver" type="PcdDriverTypes"/>
        <xs:element minOccurs="0" maxOccurs="1" name="TianoR8FlashMap_h" type="xs:boolean" default="false"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Specification" type="Sentence"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Extern">
          <xs:complexType>
            <xs:choice minOccurs="1">
              <xs:sequence>
                <xs:annotation>
                  <xs:documentation xml:lang="en">Driver Module</xs:documentation>
                </xs:annotation>
                <xs:element minOccurs="0" maxOccurs="1" name="ModuleEntryPoint" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="ModuleUnloadImage" type="C_NameType"/>
              </xs:sequence>
              <xs:sequence>
                <xs:annotation>
                  <xs:documentation xml:lang="en">Library Module</xs:documentation>
                </xs:annotation>
                <xs:element minOccurs="0" maxOccurs="1" name="Constructor" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="Destructor" type="C_NameType"/>
              </xs:sequence>
              <xs:sequence>
                <xs:annotation>
                  <xs:documentation xml:lang="en">Allow multiple entries for DriverBinding, ComponentName, DriverConfig and DriverDiag elements. For ComponentName, DriverConfig and/or DriverDiag - you must have a 1:1 mapping to DriverBinding if the element is defined.</xs:documentation>
                  <xs:documentation xml:lang="en">Permit User Defined Extern Tags</xs:documentation>
                </xs:annotation>
                <xs:element minOccurs="0" maxOccurs="1" name="DriverBinding" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="ComponentName" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="DriverConfig" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="DriverDiag" type="C_NameType"/>
              </xs:sequence>
              <xs:sequence>
                <xs:annotation>
                  <xs:documentation xml:lang="en"> Module Call Backs</xs:documentation>
                </xs:annotation>
                <xs:element minOccurs="0" maxOccurs="1" name="SetVirtualAddressMapCallBack" type="C_NameType"/>
                <xs:element minOccurs="0" maxOccurs="1" name="ExitBootServicesCallBack" type="C_NameType"/>
              </xs:sequence>
            </xs:choice>
            <xs:attributeGroup ref="ExternAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Filename">
    <xs:annotation>
      <xs:documentation xml:lang="en">Describe the valid content of a filename This should extend PathAndFilename - Variable names not allowed here!</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="PathAndFilename">
          <xs:attributeGroup ref="FilenameAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="Filenames">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a list of Filenames</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence minOccurs="1">
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="Filename"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="GuidDeclarations">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a child of PackageSurfaceArea (SPD) </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Entry">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="GuidValue" type="GuidType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="GuidDeclarationAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Guids">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="GuidCNames">
          <xs:annotation>
            <xs:documentation xml:lang="en">Describe the valid content of a GUID element in and MSA file.</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="GuidCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="GuidAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="HiiPackages">
    <xs:annotation>
      <xs:documentation xml:lang="en">Describe the list of a HiiPackage elements</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="HiiPackage">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="HiiCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="HiiPackageAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Hobs">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="HobTypes">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="HobType" type="HobTypes"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="HobAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="IncludeHeader">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="PathAndFilename">
          <xs:attributeGroup ref="IncludeHeaderAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="IndustryStdIncludes">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="IndustryStdHeader"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="IndustryStdHeader">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="IncludeHeader" type="PathAndFilename"/>
        <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
      </xs:sequence>
      <xs:attributeGroup ref="IndustryStdHeaderAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Libraries">
    <xs:annotation>
      <xs:documentation xml:lang="en">Different (Module) Instances of Libraries used ONLY in FPD Files.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Instance">
          <xs:complexType>
            <xs:attributeGroup ref="LibraryAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="LibraryClass">
    <xs:annotation>
      <xs:documentation xml:lang="en">Used in MSA files. This defines what class of library is being supported = produced (library module) or consumed by a module.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="Keyword" type="KeywordType"/>
        <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
      </xs:sequence>
      <xs:attributeGroup ref="LibraryClassAttributes"/>
    </xs:complexType>
  </xs:element>
  <!-- LAH This is SPD LibraryClassDeclarations FINAL version -->
  <xs:element name="LibraryClassDeclarations">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="LibraryClass">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="IncludeHeader" type="PathAndFilename"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="LibraryClassDeclarationAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="LibraryClassDefinitions">
    <xs:annotation>
      <xs:documentation xml:lang="en">This section defines what Classes of Library that this library supports. A Library may belong to multiple different library classes.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="LibraryClass"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="License">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="Paragraph">
          <xs:attribute name="URL" type="xs:anyURI" use="optional"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="ModuleBuildOptions">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ModuleSaBuildOptions">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="1" name="FvBinding" type="KeywordList"/>
        <!-- The FfsFileNameGuid allows the Platform Integrator to specify a GUID for the FFS File Name GUID -->
        <xs:element minOccurs="0" maxOccurs="1" name="FfsFileNameGuid" type="GuidType"/>
        <!-- If binding is specified, you MUST specify the FfsFormatKey -->
        <xs:element minOccurs="0" maxOccurs="1" name="FfsFormatKey" type="KeywordType"/>
        <xs:element minOccurs="0" maxOccurs="1" ref="Options"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ModuleDefinitions">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="SupportedArchitectures" type="ArchListType"/>
        <xs:element minOccurs="1" maxOccurs="1" name="BinaryModule" type="xs:boolean" default="false"/>
        <xs:element minOccurs="1" maxOccurs="1" name="OutputFileBasename" type="FileNameConvention"/>
        <xs:element minOccurs="0" maxOccurs="1" name="ClonedFrom">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="Cloned">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="1" maxOccurs="1" name="PackageGuid" type="GuidType"/>
                    <xs:element minOccurs="1" maxOccurs="1" name="PackageVersion" type="VersionDataType"/>
                    <xs:element minOccurs="1" maxOccurs="1" name="ModuleGuid" type="GuidType"/>
                    <xs:element minOccurs="1" maxOccurs="1" name="ModuleVersion" type="VersionDataType"/>
                  </xs:sequence>
                  <!-- The Id is a number used to track heritage  the first entry will be 0 and increment from then on. -->
                  <xs:attribute name="Id" type="xs:nonNegativeInteger" use="required"/>
                  <!-- If the original module was installed from a FAR, track the FAR it came from. -->
                  <xs:attribute name="FarGuid" type="GuidType" use="optional"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ModuleType" type="ModuleTypeDef">
    <xs:annotation>
      <xs:documentation xml:lang="en">Describe the valid EFI Phase that the Module is designed to execute under.</xs:documentation>
    </xs:annotation>
  </xs:element>
  <!-- Use in Final -->
  <xs:element name="MsaFiles">
    <xs:annotation>
      <xs:documentation xml:lang="en">MsaFiles is a child of Surface Area Package Description (SPD) files</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Filename" type="PathAndFilename"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Options">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="Option"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Option">
    <!-- This element is used to store flags from the Tools -->
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:normalizedString">
          <xs:attributeGroup ref="OptionAttributes"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="PackageDefinitions">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="1" name="ReadOnly" type="xs:boolean" default="false"/>
        <xs:element minOccurs="1" maxOccurs="1" name="RePackage" type="xs:boolean" default="false"/>
        <xs:element minOccurs="0" maxOccurs="1" name="ClonedFrom">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" name="Cloned">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element minOccurs="1" maxOccurs="1" name="PackageGuid" type="GuidType"/>
                    <xs:element minOccurs="1" maxOccurs="1" name="PackageVersion" type="VersionDataType"/>
                  </xs:sequence>
                  <!-- The Id is a number used to track heritage  the first entry will be 0 and increment from then on. -->
                  <xs:attribute name="Id" type="xs:nonNegativeInteger" use="required"/>
                  <!-- If the original Package was installed from a FAR, track the FAR it came from. -->
                  <xs:attribute name="FarGuid" type="GuidType" use="optional"/>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="PackageDependencies">
    <xs:annotation>
      <xs:documentation xml:lang="en">This tag is used in the Module Surface Area Description File (MSA) to track package dependencies for a module.</xs:documentation>
      <xs:documentation xml:lang="en">Attributes to PackageName include Required: Usage PackageGuid PackageVesion, Optional: FeatureFlag</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Package">
          <xs:complexType>
            <xs:attributeGroup ref="PackageAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="PackageHeaders">
    <xs:annotation>
      <xs:documentation xml:lang="en">PackageHeaders is a child of PackageSurfaceArea (SPD) </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="IncludePkgHeader">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="PathAndFilename">
                <xs:attributeGroup ref="PackageHeaderAttributes"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="PackageList">
    <!-- Valid for DB usage only! -->
    <xs:annotation>
      <xs:documentation xml:lang="en">This tag is used in the Framework Package Database File to track all packages (SPD files) installed in a workspace. (Database)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Filename" type="DbPathAndFilename"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <!-- PcdBuildDefinition is a child of FPD ModuleSA element for FIXED_AT_BUILD, PATCHABLE_IN_MODULE, and FEATURE_FLAG PCDS Only! -->
  <xs:element name="PcdBuildDefinition">
    <xs:annotation>
      <xs:documentation xml:lang="en">Child of FPD ModuleSA element for FIXED_AT_BUILD, PATCHABLE_IN_MODULE, and FEATURE_FLAG PCDS Only!</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="PcdData">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="Token" type="TokenDataType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="TokenSpaceGuidCName" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="DatumType" type="PcdDataTypes"/>
              <!-- MaxDatumSize is only required if the DatumType is VOID* -->
              <xs:element minOccurs="0" maxOccurs="1" name="MaxDatumSize" type="DatumSizeLimitation"/>
              <xs:element minOccurs="0" maxOccurs="1" name="Value" type="DefaultValueType"/>
            </xs:sequence>
            <xs:attributeGroup ref="PcdBuildDefinitionAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:group name="DefaultGroup">
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="Value" type="DefaultValueType"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="HiiEnable">
    <xs:annotation>
      <xs:documentation xml:lang="en">If HiiEnable group is specified, then HiiEnable is default true</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="VariableName" type="HexWordArrayType"/>
      <xs:element minOccurs="1" maxOccurs="1" name="VariableGuid" type="C_NameType"/>
      <xs:element minOccurs="1" maxOccurs="1" name="VariableOffset" type="Hex64BitDataType"/>
      <xs:element minOccurs="1" maxOccurs="1" name="HiiDefaultValue" type="DefaultValueType"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="VpdEnable">
    <xs:annotation>
      <xs:documentation xml:lang="en">If VpdEnable group is specified, then VpdEnable is default true</xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element minOccurs="1" maxOccurs="1" name="VpdOffset" type="Hex64BitDataType"/>
    </xs:sequence>
  </xs:group>
  <xs:element name="PcdCoded">
    <xs:annotation>
      <xs:documentation xml:lang="en">Child of Module Surface Area Description (MSA)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="PcdEntry">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="TokenSpaceGuidCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="DefaultValue" type="DefaultValueType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <!-- MSA file declares a single usage, and must match one of the entries in what the SPD file declares as the set of possible Item Types. -->
            <xs:attributeGroup ref="PcdCodedAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <!-- LAH This is PcdDeclarations FINAL version -->
  <xs:element name="PcdDeclarations">
    <xs:annotation>
      <xs:documentation xml:lang="en">PcdDeclaratins is a child of Package Surface Area Description (SPD)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence minOccurs="1">
        <xs:element maxOccurs="unbounded" name="PcdEntry">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="Token" type="TokenDataType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="TokenSpaceGuidCName" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="DatumType" type="PcdDataTypes"/>
              <xs:element minOccurs="1" maxOccurs="1" name="ValidUsage" type="PcdListType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="DefaultValue" type="DefaultValueType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="PcdDeclarationAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="FarList">
    <!-- Valid for DB usage only! -->
    <xs:annotation>
      <xs:documentation xml:lang="en">This tag is used in the Framework Package Database File to track all DISTRIBUTION packages (FAR files) installed in a workspace. (Database)</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Filename" type="DbPathAndFilename"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="FfsFormatDeclarations">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="FfsFormatDeclaration">
          <!-- Required Attributes are the FfsFormatKeyword and SupModuleList -->
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="unbounded" ref="ProcessStep"/>
            </xs:sequence>
            <xs:attributeGroup ref="FfsAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="PpiDeclarations">
    <xs:annotation>
      <xs:documentation xml:lang="en">PpiDeclarations is a child of PackageSurfaceArea (SPD) </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Entry">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="GuidValue" type="GuidType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="PpiDeclarationAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="PPIs">
    <xs:annotation>
      <xs:documentation xml:lang="en">Provide for one or more Ppi or PpiNotify sections. </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence minOccurs="1">
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Ppi">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="PpiCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="PpiAttributes"/>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="PpiNotify">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="PpiNotifyCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="PpiNotifyAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ProtocolDeclarations">
    <xs:annotation>
      <xs:documentation xml:lang="en">ProtocolDeclarations is a child of PackageSurfaceArea (SPD) </xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Entry">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="C_Name" type="C_NameType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="GuidValue" type="GuidType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="ProtocolDeclarationAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Protocols">
    <xs:annotation>
      <xs:documentation xml:lang="en">If either Protocol or ProtocolNotify sections are needed, one or more of them should be specified within this section</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="Protocol">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="ProtocolCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="ProtocolAttributes"/>
          </xs:complexType>
        </xs:element>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="ProtocolNotify">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="ProtocolNotifyCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="ProtocolNotifyAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="ProcessStep">
    <xs:complexType>
      <xs:sequence>
        <!-- The following is a macro for Apache ANT -->
        <xs:element minOccurs="0" maxOccurs="1" name="MacroDefFile">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="PathAndFilename">
                <xs:attribute name="MacroName" type="KeywordType" use="required"/>    
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
        <!-- The following is for System Executables -->
        <xs:element minOccurs="0" maxOccurs="1" name="ToolName" type="xs:NCName"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="ToolArgs" type="xs:normalizedString"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" name="InputPattern" type="xs:normalizedString"/>
        <xs:element minOccurs="0" maxOccurs="1" name="OutputPattern" type="xs:normalizedString"/>
      </xs:sequence>
      <xs:attributeGroup ref="ProcessStepAttributes"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="SourceFiles">
    <xs:annotation>
      <xs:documentation xml:lang="en">Multiple Filenames may be specified, and they may also be scoped to a specific Architecture.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="Filename"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="SkuInfo">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="UiSkuName">
          <xs:complexType>
            <xs:simpleContent>
              <xs:extension base="UiNameType">
                <xs:attribute name="SkuID" type="xs:nonNegativeInteger" use="required"/>
              </xs:extension>
            </xs:simpleContent>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="SystemTables">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is list of System Table elements.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="SystemTableCNames">
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="SystemTableCName" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="SystemTableAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="UserDefinedAntTasks">
    <xs:annotation>
      <xs:documentation xml:lang="en">This is a sub-element of BuildOptions</xs:documentation>
      <xs:documentation xml:lang="en">Permit Users to define their own custom ANT tasks.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" ref="AntTask"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="UserExtensions">
    <xs:complexType>
      <xs:sequence>
        <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
      </xs:sequence>
      <xs:attribute name="UserID" type="xs:NCName" use="required"/>
      <xs:attribute name="Identifier" type="xs:nonNegativeInteger" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="Variables">
    <xs:annotation>
      <xs:documentation xml:lang="en">An MSA FILE list of EFI Variables described by string pair.</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="1" maxOccurs="unbounded" name="Variable">
          <xs:annotation>
            <xs:documentation xml:lang="en">This is an EFI Variable Entry</xs:documentation>
          </xs:annotation>
          <xs:complexType>
            <xs:sequence>
              <xs:element minOccurs="1" maxOccurs="1" name="VariableName" type="HexWordArrayType"/>
              <xs:element minOccurs="1" maxOccurs="1" name="GuidC_Name" type="C_NameType"/>
              <xs:element minOccurs="0" maxOccurs="1" name="HelpText" type="Paragraph"/>
            </xs:sequence>
            <xs:attributeGroup ref="VariableAttributes"/>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="Version" type="VersionDataType"/>
</xs:schema>
