<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           attributeFormDefault="unqualified"
           elementFormDefault="qualified"
           version="1.0.0.0">
    <!-- Global elements (top level manifests) -->
    <xs:element name="Deployment">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Identity">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Name" type="xs:string">
                                <xs:annotation>
                                    <xs:documentation>Deployment name</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="UPI2" type="GUID">
                                <xs:annotation>
                                    <xs:documentation>A new upi2 for the multie-product deployment</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="DeploymentImagePath" type="xs:string">
                                <xs:annotation>
                                    <xs:documentation>Deployment image path</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="Languages" type="TypeLanguages" />
                            <xs:element name="ImageType">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration value="Uncompressed">
                                            <xs:annotation>
                                                <xs:documentation>Default to uncompressed</xs:documentation>
                                            </xs:annotation>
                                        </xs:enumeration>
                                        <xs:enumeration value="Compressed" />
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Configuration">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="InstallPath" type="TypeFilePath" minOccurs="0">
                                <xs:annotation>
                                    <xs:documentation>(Optional) Default installation path for all Autodesk products in this deployment</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="Eula">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Status">
                                <xs:simpleType>
                                    <xs:restriction base="xs:string">
                                        <xs:enumeration value="Reject">
                                            <xs:annotation>
                                                <xs:documentation>Default to Reject</xs:documentation>
                                            </xs:annotation>
                                        </xs:enumeration>
                                        <xs:enumeration value="Accept" />
                                    </xs:restriction>
                                </xs:simpleType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="LoggingSettings">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Logging" type="xs:boolean" default="true">
                                <xs:annotation>
                                    <xs:documentation>Specify the logging on/off</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                            <xs:element name="Path" type="TypeFilePath">
                                <xs:annotation>
                                    <xs:documentation>Specify the network log path</xs:documentation>
                                </xs:annotation>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
                <xs:element name="License" type="TypeLicense" minOccurs="0">
                </xs:element>
                <xs:element name="URLRoot" type="xs:anyURI">
                </xs:element>
                <xs:element name="InstallerURL" type="xs:anyURI">
                </xs:element>
                <xs:element name="Bundles">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="Bundle" minOccurs="1" maxOccurs="unbounded">
                                <xs:complexType>
                                    <xs:sequence>
                                        <xs:element name="UPI2" type="GUID" />
                                        <xs:element name="Platforms" type="TypePlatforms" />
                                        <xs:element name="SerialNumber" type="TypeSerialNumber" minOccurs="0">
                                            <xs:annotation>
                                                <xs:documentation>Specify the serial number</xs:documentation>
                                            </xs:annotation>
                                        </xs:element>
                                        <xs:element name="ProductKey" type="TypeProductKey">
                                            <xs:annotation>
                                                <xs:documentation>Specify the product key</xs:documentation>
                                            </xs:annotation>
                                        </xs:element>
                                        <xs:element name="CustomProperties" minOccurs="0" maxOccurs="1">
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="Property" minOccurs="1" maxOccurs="unbounded">
                                                        <xs:complexType>
                                                            <xs:attribute name="name" type="xs:string" use="required" />
                                                            <xs:attribute name="value" type="xs:string" use="required" />
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                        <xs:element name="Applications">
                                            <xs:annotation>
                                                <xs:documentation>Specify all the applications to be installed, including core</xs:documentation>
                                            </xs:annotation>
                                            <xs:complexType>
                                                <xs:sequence>
                                                    <xs:element name="Application" minOccurs="1" maxOccurs="unbounded">
                                                        <xs:complexType>
                                                            <xs:sequence>
                                                                <xs:element name="UPI2" type="GUID">
                                                                    <xs:annotation>
                                                                        <xs:documentation>Specify the application UPI2</xs:documentation>
                                                                    </xs:annotation>
                                                                </xs:element>
                                                                <xs:element name="LicenseRegistrationInfo" minOccurs="0">
                                                                    <xs:complexType>
                                                                        <xs:sequence>
                                                                            <xs:element name="AdlmPitFile" type="xs:string" />
                                                                            <xs:element name="AdlmVersion" type="xs:string" />
                                                                        </xs:sequence>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                                <xs:element name="CustomProperties" minOccurs="0" maxOccurs="1">
                                                                    <xs:complexType>
                                                                        <xs:sequence>
                                                                            <xs:element name="Property" minOccurs="1" maxOccurs="unbounded">
                                                                                <xs:complexType>
                                                                                    <xs:attribute name="name" type="xs:string" use="required" />
                                                                                    <xs:attribute name="value" type="xs:string" use="required" />
                                                                                </xs:complexType>
                                                                            </xs:element>
                                                                        </xs:sequence>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                                <xs:element name="CustomUserFiles" minOccurs="0" maxOccurs="1">
                                                                    <xs:complexType>
                                                                        <xs:sequence>
                                                                            <xs:element name="File" minOccurs="1" maxOccurs="unbounded">
                                                                                <xs:complexType>
                                                                                    <xs:sequence>
                                                                                        <xs:element name="SourcePath" type="TypeFilePath" />
                                                                                        <xs:element name="ImagePath" type="xs:string">
                                                                                            <xs:annotation>
                                                                                                <xs:documentation>Specify the custom property name</xs:documentation>
                                                                                            </xs:annotation>
                                                                                        </xs:element>
                                                                                    </xs:sequence>
                                                                                </xs:complexType>
                                                                            </xs:element>
                                                                        </xs:sequence>
                                                                    </xs:complexType>
                                                                </xs:element>
                                                            </xs:sequence>
                                                        </xs:complexType>
                                                    </xs:element>
                                                </xs:sequence>
                                            </xs:complexType>
                                        </xs:element>
                                    </xs:sequence>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <!-- Common types & enums -->
    <xs:complexType name="TypePlatforms">
        <xs:annotation>
            <xs:documentation>List of supported platforms</xs:documentation>
        </xs:annotation>
        <xs:sequence>
            <xs:element name="Platform" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:attribute name="name" type="EnumPlatform" use="required" />
                    <xs:attribute name="architecture" type="EnumArchitecture" />
                    <xs:attribute name="minVersion" type="xs:string" use="required" />
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="TypeLanguages">
        <xs:sequence>
            <xs:element name="Language" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                    <xs:simpleContent>
                        <xs:extension base="xs:string">
                            <xs:attribute name="langId" type="LanguageIdType" />
                        </xs:extension>
                    </xs:simpleContent>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
        <xs:attribute name="languageNeutral" default="false" type="xs:boolean">
            <xs:annotation>
                <xs:documentation>(optional) (default=false)</xs:documentation>
            </xs:annotation>
        </xs:attribute>
    </xs:complexType>
    <xs:simpleType name="EnumPlatform">
        <xs:restriction base="xs:string">
            <xs:enumeration value="Windows" />
            <xs:enumeration value="Mac" />
            <xs:enumeration value="Linux" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="EnumArchitecture">
        <xs:restriction base="xs:string">
            <xs:enumeration value="x86" />
            <xs:enumeration value="x64" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="LanguageIdType">
        <xs:annotation>
            <xs:documentation><![CDATA[Type: Lang-SubLang as defined in https://docs.microsoft.com/en-us/windows/desktop/Intl/language-identifier-constants-and-strings]]></xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:enumeration value="cs-CZ">
                <xs:annotation>
                    <xs:documentation>Czech</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="de-DE">
                <xs:annotation>
                    <xs:documentation>German</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="en-GB">
                <xs:annotation>
                    <xs:documentation>English - United Kingdom</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="en-US">
                <xs:annotation>
                    <xs:documentation>English - United States</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="es-ES">
                <xs:annotation>
                    <xs:documentation>Spanish</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="fr-FR">
                <xs:annotation>
                    <xs:documentation>French</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="hu-HU">
                <xs:annotation>
                    <xs:documentation>Hungarian</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="it-IT">
                <xs:annotation>
                    <xs:documentation>Italian</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="ja-JP">
                <xs:annotation>
                    <xs:documentation>Japanese</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="ko-KR">
                <xs:annotation>
                    <xs:documentation>Korean</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="pl-PL">
                <xs:annotation>
                    <xs:documentation>Polish</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="pt-BR">
                <xs:annotation>
                    <xs:documentation>Portuguese - Brazilian</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="pt-PT">
                <xs:annotation>
                    <xs:documentation>Portuguese - Portugal</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="ru-RU">
                <xs:annotation>
                    <xs:documentation>Russian</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="zh-CN">
                <xs:annotation>
                    <xs:documentation>Simplified Chinese</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
            <xs:enumeration value="zh-TW">
                <xs:annotation>
                    <xs:documentation>Traditional Chinese</xs:documentation>
                </xs:annotation>
            </xs:enumeration>
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="GUID">
        <xs:annotation>
            <xs:documentation>Regex: Well-formed guid, uppercase, with enclosing braces</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="\{[0-F]{8}-[0-F]{4}-[0-F]{4}-[0-F]{4}-[0-F]{12}\}" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="TypeFilePath">
        <xs:annotation>
            <xs:documentation>Regex: The following characters are excluded: \ ? * </xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\?\*]+" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="TypeSerialNumber">
        <xs:annotation>
            <xs:documentation>Regex: serial number</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[0-9]{3}-[0-9]{8}" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="TypeProductKey">
        <xs:annotation>
            <xs:documentation>Regex: product key</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[A-Z0-9]{5}" />
        </xs:restriction>
    </xs:simpleType>
    <xs:simpleType name="TypeID">
        <xs:annotation>
            <xs:documentation>Regex: generic identifier for such as file name, etc.</xs:documentation>
        </xs:annotation>
        <xs:restriction base="xs:string">
            <xs:pattern value="[^\\\?\*]+" />
        </xs:restriction>
    </xs:simpleType>
    <xs:complexType name="TypeLicense">
        <xs:choice>
            <xs:element name="UserLicense" minOccurs="0" maxOccurs="1" />
            <xs:element name="StandaloneLicense" minOccurs="0" maxOccurs="1" />
            <xs:element name="NetworkLicense" minOccurs="0" maxOccurs="1">
                <xs:complexType>
                    <xs:choice>
                        <xs:element name="Single">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Server" type="TypeID" />
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="Distributed">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Server" minOccurs="2" maxOccurs="unbounded">
                                        <xs:complexType>
                                            <xs:attribute name="name" type="xs:string" use="required" />
                                            <xs:attribute name="order" type="xs:int" use="required" />
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                        <xs:element name="Redundant">
                            <xs:complexType>
                                <xs:sequence>
                                    <xs:element name="Server" minOccurs="3" maxOccurs="3">
                                        <xs:complexType>
                                            <xs:attribute name="name" type="xs:string" use="required" />
                                            <xs:attribute name="order" type="xs:int" use="required" />
                                        </xs:complexType>
                                    </xs:element>
                                </xs:sequence>
                            </xs:complexType>
                        </xs:element>
                    </xs:choice>
                </xs:complexType>
            </xs:element>
        </xs:choice>
    </xs:complexType>
</xs:schema>
