<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">
  <xs:annotation>
    <xs:documentation>
      install4j project file. Describes a multi-platform installer for a Java application
      that produces installer artifacts for Windows (.exe), macOS (.dmg), and Linux
      (.deb/.rpm/archive).
      
      The build pipeline (install4j IDE, the install4jc CLI compiler, or the Ant or Gradle
      plugin) reads this file and emits one installer per configured media set.
      
      Variable substitution is supported in most string-valued attributes. Compiler
      variables (${compiler:foo}) resolve at build time; installer variables
      (${installer:bar}) at runtime; i18n keys (${i18n:baz}) at runtime against the
      configured language bundles.
      
      Schema architecture. Most config types form an extension chain rooted at
      BeanConfigType. Anything user-customizable (screens, actions, groups, form
      components, styles, custom telemetries) extends BeanConfigType to inherit two
      slots: a `beanClass` attribute (FQN of the implementation class, e.g.
      `com.install4j.runtime.beans.actions.misc.LoadResponseFileAction`) and a
      `&lt;serializedBean&gt;` child carrying the bean&apos;s serialized JavaBean properties.
      Concrete types like ActionConfigType, ScreenConfigType, FormComponentConfigType
      inherit this scaffolding; reading any of them, walk up via xs:extension to find
      inherited attributes/elements. Top-level structural types (Install4JConfigType,
      LauncherEntryType, the per-platform MediaSetConfigType variants) have their own
      shapes and don&apos;t extend BeanConfigType.
      
      Companion docs live under doc/concepts/ (one file per concept), doc/installers/ (the
      installer runtime), doc/cli/ (install4jc), doc/api/ (runtime API for custom code),
      and doc/main/ (IDE walkthroughs). The most touched starting points are
      doc/concepts/projects.md, doc/concepts/launchers.md, doc/concepts/files.md,
      doc/concepts/mediaFiles.md.
    </xs:documentation>
  </xs:annotation>
  <xs:element name="install4j" type="Install4JConfigType"/>
  <xs:simpleType name="filePath">
    <xs:restriction base="xs:string"/>
  </xs:simpleType>
  <xs:simpleType name="JreBundleSourceEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="generated"/>
      <xs:enumeration value="preCreated">
        <xs:annotation><xs:documentation>Use a JRE bundle built earlier with `bin/createbundle`; install4j embeds it as-is.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="none"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="VmOptionsFileModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="none"/>
      <xs:enumeration value="template">
        <xs:annotation><xs:documentation>Ship a vmoptions template alongside the launcher with explanatory comments for the user.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="content">
        <xs:annotation><xs:documentation>Ship a vmoptions file with the literal content from `&lt;vmOptionsFileContent&gt;`.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="OverwriteModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="never">
        <xs:annotation><xs:documentation>Existing destination file is never replaced.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="always">
        <xs:annotation><xs:documentation>Existing destination file is always replaced.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="ifNewer">
        <xs:annotation><xs:documentation>Replace files only when the source file is newer; older destination is skipped silently.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="ifNewerOtherwiseAsk">
        <xs:annotation><xs:documentation>Replace files when the source is newer; otherwise prompt the user.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="alwaysAskExceptForUpdate">
        <xs:annotation><xs:documentation>Prompt the user when the destination wasn&apos;t installed by a previous run; silently keep otherwise.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="alwaysAsk">
        <xs:annotation><xs:documentation>Always prompt the user, even on update installations.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ExecutionModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="gui"/>
      <xs:enumeration value="console"/>
      <xs:enumeration value="unattended"/>
      <xs:enumeration value="unattendedProgress">
        <xs:annotation><xs:documentation>Unattended mode that still shows a progress window.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MacAssociationRoleEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="viewer"/>
      <xs:enumeration value="editor"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MacAssociationHandlerRankEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="owner">
        <xs:annotation><xs:documentation>macOS `LSHandlerRank=Owner`; the application owns the file type.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="default">
        <xs:annotation><xs:documentation>macOS `LSHandlerRank=Default`; default handler for the file type.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="alternate">
        <xs:annotation><xs:documentation>macOS `LSHandlerRank=Alternate`; alternate handler.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="JDKModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="auto"/>
      <xs:enumeration value="runtimeJre">
        <xs:annotation><xs:documentation>Use the JRE that runs the install4j GUI itself; no separate build JDK needed.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="jdk">
        <xs:annotation><xs:documentation>Use a specific JDK from the IDE&apos;s JDK list, named by `jdkName`.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="SeparatorConversionEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="none"/>
      <xs:enumeration value="build">
        <xs:annotation><xs:documentation>Convert path/file separators for the build platform (the machine running install4jc).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="target">
        <xs:annotation><xs:documentation>Convert separators for each target media&apos;s platform when the variable is expanded at install time.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ValueTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="undefined"/>
      <xs:enumeration value="string"/>
      <xs:enumeration value="integer"/>
      <xs:enumeration value="long"/>
      <xs:enumeration value="boolean"/>
      <xs:enumeration value="stringArray"/>
      <xs:enumeration value="intArray"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="KeySourceEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="pkcs12">
        <xs:annotation><xs:documentation>PKCS#12 keystore file (.p12 / .pfx).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="pkcs11">
        <xs:annotation><xs:documentation>PKCS#11 token (HSM, smart card).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="windows">
        <xs:annotation><xs:documentation>Microsoft Windows certificate store.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="executable">
        <xs:annotation><xs:documentation>External signing executable that returns the signed payload.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="digestSigningExecutable">
        <xs:annotation><xs:documentation>External executable that returns a signed digest (HSM-style flow). → doc/concepts/codeSigning.xml</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="KeyStoreCertificateTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="store">
        <xs:annotation><xs:documentation>Look up the certificate inside the keystore by alias.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="file">
        <xs:annotation><xs:documentation>Use a separate certificate file alongside the private key.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DefaultModulesSetEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="minimum"/>
      <xs:enumeration value="jre"/>
      <xs:enumeration value="all"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="CertificateIdentifierTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="serial"/>
      <xs:enumeration value="label"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="UninstallModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ifCreated">
        <xs:annotation><xs:documentation>Delete the file on uninstallation only if the installer created it. Default.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="never">
        <xs:annotation><xs:documentation>Never delete the file on uninstallation.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="always">
        <xs:annotation><xs:documentation>Always delete the file on uninstallation, even if the user replaced it. Handle with care.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="ifCreatedButNotForUpdate">
        <xs:annotation><xs:documentation>Like `ifCreated`, but skip deletion when uninstalling as part of an update.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="alwaysButNotForUpdate">
        <xs:annotation><xs:documentation>Like `always`, but skip deletion when uninstalling as part of an update.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FileTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="regular"/>
      <xs:enumeration value="launcher">
        <xs:annotation><xs:documentation>Marks this file as a launcher executable; install4j patches it during media build.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="installerApplication">
        <xs:annotation><xs:documentation>The installer&apos;s own application image. Tooling-managed; do not set manually.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DirEntryModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="direct">
        <xs:annotation><xs:documentation>Add the directory&apos;s contents directly under the currently selected distribution-tree node.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="subdir">
        <xs:annotation><xs:documentation>Add the contents under a subdirectory whose name comes from `subdirName`.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="InstallerTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="regular"/>
      <xs:enumeration value="addon">
        <xs:annotation><xs:documentation>Add-on installer; only installs over an existing installation, no uninstaller. → doc/concepts/addOns.xml</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ExternalParametrizationModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="all">
        <xs:annotation><xs:documentation>All bean properties are exposed for external parametrization.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="include">
        <xs:annotation><xs:documentation>Only the property names listed in the configuration are exposed.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="exclude">
        <xs:annotation><xs:documentation>All properties except the listed ones are exposed.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="LaunchModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="startupSync">
        <xs:annotation><xs:documentation>Run synchronously at startup; the launcher waits for the integration to finish before continuing.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="startupAsync">
        <xs:annotation><xs:documentation>Run asynchronously at startup; the launcher continues immediately.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="startupFirstWindow">
        <xs:annotation><xs:documentation>Run when the first application window is shown.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="LaunchScheduleEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="always"/>
      <xs:enumeration value="updateSchedule">
        <xs:annotation><xs:documentation>Run on the configured update schedule.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="firstRun">
        <xs:annotation><xs:documentation>Run only the first time any launcher of an archive media file is started by the current user.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FailureStrategyEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="continue"/>
      <xs:enumeration value="quit"/>
      <xs:enumeration value="ask"/>
      <xs:enumeration value="returnToScreen">
        <xs:annotation><xs:documentation>Cancel the action chain and return to the screen the user came from.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ActionElevationTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="inherit">
        <xs:annotation><xs:documentation>Inherit elevation from the parent context (action group, screen, or the installer application).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="none"/>
      <xs:enumeration value="elevated"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="BackButtonTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="visible"/>
      <xs:enumeration value="safe">
        <xs:annotation><xs:documentation>Visible only when going back is reversible; hidden on irreversible steps.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="hidden"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="WizardIndexChangeTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="unchanged">
        <xs:annotation><xs:documentation>Wizard index sidebar is left unchanged.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="new">
        <xs:annotation><xs:documentation>Start a new top-level wizard index entry; identified by `wizardIndexKey`.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="step">
        <xs:annotation><xs:documentation>Activate a sub-step under an existing wizard index entry referenced by `wizardIndexKey`.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="remove">
        <xs:annotation><xs:documentation>Remove the current wizard index entry from the sidebar.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="LookAndFeelTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="crossPlatform"/>
      <xs:enumeration value="native"/>
      <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DarkModeStrategyEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="auto"/>
      <xs:enumeration value="light"/>
      <xs:enumeration value="dark"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FlatLafLightThemeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="light"/>
      <xs:enumeration value="lightIntelliJ"/>
      <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="FlatLafDarkThemeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="dark"/>
      <xs:enumeration value="darcula"/>
      <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ContentFilesTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="internal"/>
      <xs:enumeration value="external">
        <xs:annotation><xs:documentation>Generated data files must be distributed alongside the installer executable.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="downloadable">
        <xs:annotation><xs:documentation>Components flagged as downloadable are excluded from the installer and downloaded at install time.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="WindowsArchitectureEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="32"/>
      <xs:enumeration value="64"/>
      <xs:enumeration value="arm64"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MsixServiceStartupTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="auto">
        <xs:annotation><xs:documentation>Service starts automatically when Windows boots.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="manual">
        <xs:annotation><xs:documentation>Service is registered but only starts when explicitly requested (sc start, the Services UI, or another service that depends on it).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="disabled">
        <xs:annotation><xs:documentation>Service is registered but cannot be started.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MsixServiceStartAccountEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="localSystem">
        <xs:annotation><xs:documentation>NT AUTHORITY\System: highest local privilege, no network identity. Default for most services.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="localService">
        <xs:annotation><xs:documentation>NT AUTHORITY\LocalService: minimal local privileges, anonymous on the network. Use for services that don&apos;t need elevated rights or network credentials.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="networkService">
        <xs:annotation><xs:documentation>NT AUTHORITY\NetworkService: minimal local privileges, the machine&apos;s identity on the network. Use for services that authenticate to other machines.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MsiScopeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="perMachine"/>
      <xs:enumeration value="perUser"/>
      <xs:enumeration value="selectable">
        <xs:annotation><xs:documentation>User chooses per-machine vs per-user at install time. Unattended per-machine installs need `ALLUSERS=1`.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MsiProductIdTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="build">
        <xs:annotation><xs:documentation>New MSI product ID per build; the same build can&apos;t be installed twice.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="version">
        <xs:annotation><xs:documentation>New MSI product ID per application version; the same version can&apos;t be installed twice.</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="custom">
        <xs:annotation><xs:documentation>MSI product ID set manually via `customProductId`.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ArchiveTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="dmg"/>
      <xs:enumeration value="tgz"/>
      <xs:enumeration value="appstore">
        <xs:annotation><xs:documentation>Sandboxed `.pkg` for App Store submission. Requires App Store distribution certificates and an entitlements bundle. → doc/concepts/codeSigning.xml</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MacosArchitectureEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="aarch64"/>
      <xs:enumeration value="amd64"/>
      <xs:enumeration value="universal">
        <xs:annotation><xs:documentation>Universal binary running natively on both ARM64 and Intel x64 processors.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DmgStylingModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="default"/>
      <xs:enumeration value="none"/>
      <xs:enumeration value="custom"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="PackageSetupTypeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="none"/>
      <xs:enumeration value="default"/>
      <xs:enumeration value="apps"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="MissingFilesStrategyEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="ignore"/>
      <xs:enumeration value="warn"/>
      <xs:enumeration value="error"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="AbstractJreBundlesConfigType" abstract="true">
    <xs:sequence>
      <xs:element name="modules" type="ModulesConfigType" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Set of modules that make up the bundled JRE. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="jdkProviderId" type="xs:string">
      <xs:annotation><xs:documentation>ID of the JDK provider that supplies the bundled JRE (e.g. &quot;adoptium&quot;, &quot;corretto&quot;, &quot;zulu&quot;). → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="release" type="xs:string" default="">
      <xs:annotation><xs:documentation>JDK release identifier in the chosen provider&apos;s namespace (e.g. &quot;17.0.13+11&quot;). Empty means use the provider&apos;s latest release for the project&apos;s javaMinVersion. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="JreBundleConfigType">
    <xs:complexContent>
      <xs:extension base="AbstractJreBundlesConfigType">
        <xs:attribute name="usePack200" type="xs:boolean">
          <xs:annotation><xs:documentation>Legacy pack200 compression for the bundled JRE&apos;s jar files. Pack200 was removed from the JDK in Java 14; modern projects leave this off.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideJdkRelease" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this media set uses its own jdkProviderId/release instead of the project-wide default.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="jreBundleSource" type="JreBundleSourceEnum" default="generated">
          <xs:annotation><xs:documentation>How the JRE is included in this media set.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="includedJre" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a pre-created JRE archive (.tar.gz). Used only when jreBundleSource=&quot;preCreated&quot;. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="manualJreEntry" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the includedJre path is taken verbatim. When false, the path is resolved via the install4j JRE registry against jdkProviderId/release.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="platform" type="xs:string">
          <xs:annotation><xs:documentation>Target platform identifier (e.g. &quot;linux-amd64&quot;, &quot;windows-amd64&quot;, &quot;macos-amd64&quot;, &quot;macos-aarch64&quot;). The bundled JRE must match this platform.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="NameAndIdConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="id" type="xs:string" use="required">
          <xs:annotation><xs:documentation>Auto-generated stable identifier for this config item, referenced from elsewhere in the project (mediaSet refIds, fileset ids, mountPoint root ids, etc.). Don&apos;t change once installers have shipped.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="VmOptionsFileConfigType">
    <xs:sequence>
      <xs:element name="content" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Initial contents of the .vmoptions file as plain text. Used when mode=&quot;content&quot;.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:simpleContent>
            <xs:extension base="xs:string"/>
          </xs:simpleContent>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="mode" type="VmOptionsFileModeEnum" default="template">
      <xs:annotation><xs:documentation>How the .vmoptions file is generated. The `content` element is used when mode=&quot;content&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="overwriteMode" type="OverwriteModeEnum" default="never">
      <xs:annotation><xs:documentation>Overwrite policy for the file on update installs. `never` preserves user edits.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="fileMode" type="xs:string" default="644">
      <xs:annotation><xs:documentation>Octal Unix permission mode for the .vmoptions file (e.g. &apos;644&apos;).</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="NameAndCustomizableIdConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndIdConfigType">
        <xs:attribute name="customizedId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Optional human-friendly id shown in the install4j IDE. When set, this is used as the displayed id while &apos;id&apos; remains the stable internal reference.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LauncherEntryType">
    <xs:complexContent>
      <xs:extension base="NameAndCustomizableIdConfigType">
        <xs:sequence>
          <xs:element name="executable" type="ExecutableConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="splashScreen" type="SplashScreenConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="java" type="JavaConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="desktopFile" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Linux .desktop file content shipped alongside the launcher.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="vmOptionsFile" type="VmOptionsFileConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>User-editable .vmoptions file shipped next to the launcher. Lets end users add JVM arguments without modifying the launcher itself. → doc/concepts/launchers.md (VM options)</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="serviceFile" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Linux systemd service unit content; written when this launcher is installed as a service. → doc/concepts/services.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="customScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Unix shell-script fragment inserted into the generated launcher script (executed before the JVM is invoked).</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="infoPlist" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Custom macOS Info.plist fragment merged into the generated bundle&apos;s plist.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="iconImageFiles" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Linux/Unix icon image files in PNG format used for the desktop entry. Each `&lt;file path=&quot;…&quot;/&gt;` entry points at a square PNG sized for the standard icon-theme directories (16, 32, 48, 64, 128, 256).</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="file" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="path" type="filePath">
                      <xs:annotation><xs:documentation>Path to a PNG icon file, relative to distributionSourceDir.</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="macStaticAssociations" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>macOS file/URL associations declared statically in the launcher&apos;s Info.plist (vs. registered at runtime via the API). → doc/concepts/macosAppStore.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="fileAssociation" type="MacFileAssociationConfigType">
                    <xs:annotation><xs:documentation>macOS-side static file association registered in the launcher&apos;s Info.plist (CFBundleDocumentTypes). → doc/concepts/launchers.md (File associations)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="urlHandler" type="MacUrlHandlerConfigType">
                    <xs:annotation><xs:documentation>macOS URL scheme handler registered in the launcher&apos;s Info.plist (CFBundleURLTypes). → doc/concepts/launchers.md (URL handlers)</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="external" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this launcher is built as a stand-alone executable (no installer wraps it). Requires externalFile to be set.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="excludeFromMenu" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this launcher is not added to the user&apos;s Start menu / Applications folder.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="unixMode" type="xs:string" default="755">
          <xs:annotation><xs:documentation>Octal Unix file permission bits applied to the installed launcher executable (e.g. &apos;755&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="unixAutoStart" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true and the launcher is installed as a service, the service is enabled to start at boot. → doc/concepts/services.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="menuName" type="filePath" default="">
          <xs:annotation><xs:documentation>Display name for desktop/Start-menu entries. Empty means use the application name.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="externalFile" type="xs:string" default="">
          <xs:annotation><xs:documentation>Output path for the stand-alone launcher executable. Used only when external is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="icnsFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a macOS .icns icon file, relative to distributionSourceDir.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customMacBundleIdentifier" type="xs:boolean" default="false"/>
        <xs:attribute name="macBundleIdentifier" type="xs:string" default="">
          <xs:annotation><xs:documentation>macOS bundle identifier (reverse-DNS). Used only when customMacBundleIdentifier is true; otherwise install4j derives one from the application&apos;s properties.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="swtApp" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the launcher uses the SWT-aware bootstrap (required for Eclipse/SWT-based applications).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="fileset" type="xs:string" default="">
          <xs:annotation><xs:documentation>Fileset id whose contents this launcher needs at runtime; the installer ensures the fileset is included. → doc/concepts/fileGroups.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="macBundleBinary" type="xs:string" default="JavaApplicationStub"/>
        <xs:attribute name="addMacEntitlements" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, install4j adds the entitlements from macEntitlementsFile to the macOS bundle (required for sandboxing or other macOS-specific privileges). → doc/concepts/macosAppStore.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="macEntitlementsFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a macOS entitlements .plist file. Used only when addMacEntitlements is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="addMacApplicationCategory" type="xs:boolean" default="false"/>
        <xs:attribute name="macApplicationCategory" type="xs:string" default="">
          <xs:annotation><xs:documentation>UTI string for LSApplicationCategoryType (e.g. &quot;public.app-category.developer-tools&quot;). Used only when addMacApplicationCategory is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useCustomMacosExecutableName" type="xs:boolean" default="false"/>
        <xs:attribute name="customMacosExecutableName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Override for the executable inside the macOS .app bundle. Used only when useCustomMacosExecutableName is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useJavaMinVersionOverride" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this launcher uses javaMinVersionOverride instead of the project-wide minimum Java version.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="javaMinVersionOverride" type="xs:string" default=""/>
        <xs:attribute name="useJavaMaxVersionOverride" type="xs:boolean" default="false"/>
        <xs:attribute name="javaMaxVersionOverride" type="xs:string" default=""/>
        <xs:attribute name="checkUpdater" type="xs:boolean" default="false"/>
        <xs:attribute name="updateExecutionMode" type="ExecutionModeEnum" default="unattendedProgress"/>
        <xs:attribute name="unattendedUpdateTitle" type="xs:string" default="${i18n:updater.WindowTitle(&quot;${compiler:sys.fullName}&quot;)}"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MacFileAssociationConfigType">
    <xs:attribute name="extension" type="xs:string" use="required">
      <xs:annotation><xs:documentation>File extension (without leading dot).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="description" type="xs:string" use="required">
      <xs:annotation><xs:documentation>Human-readable type description shown in Finder. May contain i18n variables.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconFile" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to a per-association .icns file. Empty falls back to the launcher&apos;s icon.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="role" type="MacAssociationRoleEnum" default="viewer">
      <xs:annotation><xs:documentation>Maps to the macOS CFBundleTypeRole key in the launcher&apos;s Info.plist.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="handlerRank" type="MacAssociationHandlerRankEnum" default="default">
      <xs:annotation><xs:documentation>Maps to the macOS LSHandlerRank key. Controls precedence among apps that handle the same extension.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="MacUrlHandlerConfigType">
    <xs:attribute name="scheme" type="xs:string" use="required">
      <xs:annotation><xs:documentation>URL scheme this launcher handles (e.g. &apos;myapp&apos; for myapp:// URLs).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="role" type="MacAssociationRoleEnum" default="viewer">
      <xs:annotation><xs:documentation>Maps to the macOS CFBundleTypeRole key in the launcher&apos;s Info.plist.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="Install4JApplicationConfigType">
    <xs:complexContent>
      <xs:extension base="ApplicationConfigType">
        <xs:sequence>
          <xs:element name="languages" type="Install4jLanguagesConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="searchSequence" type="SearchSequenceConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="variables" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Compiler variables expand at build time; installer variables back ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="variable" type="CompilerVariableConfigType">
                    <xs:annotation><xs:documentation>A single named variable. As a compiler variable it is expanded with ${compiler:name} during the build; as an installer variable it backs ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="mergedProjects" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Projects that are merged into this one at compile time. → doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="project" type="MergedProjectConfigType" minOccurs="0" maxOccurs="unbounded">
                  <xs:annotation><xs:documentation>A project to merge into this one at compile time. → doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="codeSigning" type="CodeSigningConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Code-signing settings for Windows .exe and macOS .app/.dmg/.pkg artifacts. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="jreBundles" type="JreBundlesDefaultConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Project-wide default JRE bundle. Per-media-set &lt;jreBundle&gt; can override. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="applicationId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Stable identifier for this project, used as the cross-version key by auto-update and merged-project resolution. Auto-generated when first saved; do not change once installers have shipped. → doc/concepts/autoUpdate.md, doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mediaDir" type="filePath" default="">
          <xs:annotation><xs:documentation>Directory where built installer artifacts are written; resolved relative to distributionSourceDir. Empty means the project&apos;s own directory. → doc/concepts/mediaFiles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mediaFilePattern" type="xs:string" default="${compiler:sys.shortName}_${compiler:sys.platform}_${compiler:sys.version}">
          <xs:annotation><xs:documentation>File-name pattern for built installer artifacts. Compiler variables are typical inputs (e.g. &quot;${compiler:sys.shortName}_${compiler:sys.platform}_${compiler:sys.version}&quot;). → doc/concepts/mediaFiles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="compression" type="xs:int" default="6">
          <xs:annotation><xs:documentation>Deflate compression level applied to bundled data files (0 to 9; 0 = none, 9 = best). Has no effect when lzmaCompression is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="lzmaCompression" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, applies LZMA compression to bundled data files. Higher ratio than deflate but slower to extract. → doc/concepts/mediaFiles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="pack200Compression" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>Legacy pack200 compression flag for jar files. Pack200 was removed from the JDK in Java 14; modern projects leave this off.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="excludeSignedFromPacking" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, code-signed files are excluded from pack200 (legacy). Effective only when pack200Compression=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="commonExternalFiles" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, downloadable component archives shared between media sets are written once into a common directory next to the installers, deduplicating across platforms.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="createChecksums" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, MD5 checksums are written next to each generated media file for integrity verification.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="shrinkRuntime" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the bundled JRE is shrunk via jlink to only the modules actually needed. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="shortName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Short program name; exposed to the rest of the project as ${compiler:sys.shortName} and used as a default in many places (executable names, registry keys, dmg volume titles).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="publisher" type="xs:string" default="">
          <xs:annotation><xs:documentation>Vendor / publisher name; exposed as ${compiler:sys.publisher} and embedded in installer metadata (Windows resources, macOS Info.plist, .deb/.rpm package metadata).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="publisherWeb" type="xs:string" default="">
          <xs:annotation><xs:documentation>Publisher website URL.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="version" type="xs:string" default="">
          <xs:annotation><xs:documentation>Application version; exposed as ${compiler:sys.version}. → doc/concepts/versionNumbers.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="allPathsRelative" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>IDE-only state. When true, the IDE keeps file paths in this project relative to the project file when adding new entries.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="backupOnSave" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>IDE-only state. When true, the IDE writes a .install4j.bak before overwriting the project file on save.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="autoSave" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>IDE-only state. When true, the IDE auto-saves the project file periodically.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="convertDotsToUnderscores" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, dots in built media filenames are replaced with underscores (e.g. for Windows compatibility with file extensions).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="convertSpacesToUnderscores" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, spaces in built media filenames are replaced with underscores.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="macSignature" type="xs:string" default="????">
          <xs:annotation><xs:documentation>Legacy four-character macOS bundle signature (creator code). Most modern macOS installers leave this at the default &quot;????&quot;. → doc/concepts/macosAppStore.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="macVolumeId" type="xs:string">
          <xs:annotation><xs:documentation>Auto-generated random hex id used as the macOS dmg volume identifier. Regenerated on first save; usually doesn&apos;t need manual editing.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="javaMinVersion" type="xs:string" default="">
          <xs:annotation><xs:documentation>Minimum JRE version required to run the produced installers and bundled launchers (e.g. &quot;17&quot;). Empty means no lower bound. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="javaMaxVersion" type="xs:string" default="">
          <xs:annotation><xs:documentation>Maximum JRE version. Empty means no upper bound. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="allowBetaVM" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>Allow non-GA (early-access) builds when matching JREs.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="jdkMode" type="JDKModeEnum" default="auto">
          <xs:annotation><xs:documentation>Selects how the local JDK used for builds is located.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="jdkName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Name of the JDK in the install4j IDE&apos;s JDK list to use for this project. Effective when jdkMode=&quot;jdk&quot;.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ComponentNodeConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndCustomizableIdConfigType">
        <xs:sequence>
          <xs:element name="description" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Free-form description shown next to the component on the selection screen. Plain text.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="displayDescription" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the description is shown directly below the component name; otherwise it is only visible via the help button.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="hideHelpButton" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the per-component help button is hidden on the selection screen.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ComponentConfigType">
    <xs:complexContent>
      <xs:extension base="ComponentNodeConfigType">
        <xs:sequence>
          <xs:element name="include" type="IncludeConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Inclusion list for a directory scan or fileset selection.</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="dependencies" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Components that must be selected together with this one.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="component" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string">
                      <xs:annotation><xs:documentation>Id of a depended-on component. Must match the &apos;id&apos; attribute of another &lt;component&gt; in this project.</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="selected" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, this component is selected by default on the selection screen.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="changeable" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When false, the component is mandatory: the user cannot deselect it on the component selection screen.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="downloadable" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the component&apos;s files are downloaded on demand instead of being embedded in the installer.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="hidden" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the component is hidden on the selection screen but still installable programmatically.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ComponentFolderConfigType">
    <xs:complexContent>
      <xs:extension base="ComponentNodeConfigType">
        <xs:sequence>
          <xs:element name="components" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="component" type="ComponentConfigType">
                    <xs:annotation><xs:documentation>A user-selectable installable component built from one or more filesets. Users pick components on the component selection screen. → doc/concepts/files.md (Filesets and components)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="folder" type="ComponentFolderConfigType">
                    <xs:annotation><xs:documentation>Grouping folder in the component tree shown on the component selection screen. → doc/concepts/files.md (Filesets and components)</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="expanded" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the folder is initially expanded on the component selection screen.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Install4jLanguagesConfigType">
    <xs:complexContent>
      <xs:extension base="LanguagesConfigType">
        <xs:sequence>
          <xs:element name="additionalLanguages" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Additional languages that ship with the installer; users see them in the language-selection dialog.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="language" type="SingleLanguageConfigType" minOccurs="0" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="skipLanguageSelection" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer&apos;s language-selection dialog is skipped when the OS locale matches a configured language.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="languageSelectionInPrincipalLanguage" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer&apos;s language-selection dialog is rendered in the principal language regardless of OS locale.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="Install4JConfigType">
    <xs:complexContent>
      <xs:extension base="BaseConfigType">
        <xs:sequence>
          <xs:element name="application" type="Install4JApplicationConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Application identity (name, version, publisher) and project-wide build settings.</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="files" type="FilesConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>File tree shipped with the installer. → doc/concepts/files.md</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="launchers" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Set of launchers (executables) the installer creates on the user&apos;s machine. → doc/concepts/launchers.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="launcher" type="LauncherEntryType" minOccurs="0" maxOccurs="unbounded">
                  <xs:annotation><xs:documentation>One launcher (executable) the installer will create. → doc/concepts/launchers.md</xs:documentation></xs:annotation>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="installerGui" type="InstallerGUIConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Installer GUI configuration: applications (installer/uninstaller flow), screen styles, widget styles, and global GUI settings. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="mediaSets" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Per-platform installer artifacts the build will produce (Windows .exe, macOS .dmg/.pkg, Linux .deb/.rpm/archive). → doc/concepts/mediaFiles.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="windowsArchive" type="WindowsArchiveMediaSetConfigType">
                    <xs:annotation><xs:documentation>Windows archive media set: produces a .zip with a pre-extracted distribution. No installer wrapper. → doc/concepts/mediaFiles.md (Archive)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="msix" type="MsixMediaSetConfigType">
                    <xs:annotation><xs:documentation>Windows MSIX media set: produces a signed .msix package. Deployed by Windows; no install4j installer wizard runs.</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="linuxRPM" type="LinuxRPMMediaSetConfigType">
                    <xs:annotation><xs:documentation>Linux RPM media set: produces an .rpm installable via rpm/dnf/yum. → doc/concepts/mediaFiles.md (RPM package)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="windows" type="WindowsMediaSetConfigType">
                    <xs:annotation><xs:documentation>Windows installer media set: produces a self-extracting .exe (or .msi when msi=true). → doc/concepts/mediaFiles.md (Windows installer)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="unixArchive" type="UnixArchiveMediaSetConfigType">
                    <xs:annotation><xs:documentation>Unix archive media set: produces a .tar.gz with a pre-extracted distribution. No installer wrapper. → doc/concepts/mediaFiles.md (Archive)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="linuxDeb" type="LinuxDebMediaSetConfigType">
                    <xs:annotation><xs:documentation>Debian package media set: produces a .deb installable via dpkg/apt. → doc/concepts/mediaFiles.md (Debian package)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="unixInstaller" type="UnixGUIMediaSetConfigType">
                    <xs:annotation><xs:documentation>Unix GUI installer media set: produces a self-contained shell installer with a Swing GUI. → doc/concepts/mediaFiles.md (Unix installer)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="macosFolder" type="MacosFolderMediaSetConfigType">
                    <xs:annotation><xs:documentation>macOS folder media set: produces an installer .app bundle, ready to embed inside a DMG. Output is the .app folder, not a packaged image. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="macosArchive" type="MacosBundleArchiveMediaSetConfigType">
                    <xs:annotation><xs:documentation>macOS single-bundle archive media set: produces a .tgz containing a single launcher&apos;s .app bundle, optionally configured to run an installer setup app on first launch. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="macosFolderArchive" type="MacosFolderArchiveMediaSetConfigType">
                    <xs:annotation><xs:documentation>macOS archived application folder media set: produces a .tgz archive containing the .app bundle. Mainly used for code-signing pipelines that ship the app outside a DMG. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="buildIds" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Selection of media sets to build and persistent build flags. → doc/concepts/build.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="mediaSet" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="refId" type="xs:string">
                      <xs:annotation><xs:documentation>Reference to a media set&apos;s id. Effective only when buildAll=false.</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
              <xs:attribute name="buildAll" type="xs:boolean" default="true">
                <xs:annotation><xs:documentation>When true, all media sets are built. When false, only the explicitly listed entries are built. → doc/concepts/build.md</xs:documentation></xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
          <xs:element name="buildOptions" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:attribute name="verbose" type="xs:boolean" default="false"/>
              <xs:attribute name="faster" type="xs:boolean" default="false">
                <xs:annotation><xs:documentation>When true, the build skips re-running steps whose inputs haven&apos;t changed. Faster but less robust against tooling changes; off by default for release builds.</xs:documentation></xs:annotation>
              </xs:attribute>
              <xs:attribute name="disableSigning" type="xs:boolean" default="false">
                <xs:annotation><xs:documentation>When true, code signing is skipped. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
              </xs:attribute>
              <xs:attribute name="disableJreBundling" type="xs:boolean" default="false">
                <xs:annotation><xs:documentation>When true, JRE bundling is skipped (no JREs are downloaded or embedded into installers). Useful for fast iteration during development. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
              </xs:attribute>
              <xs:attribute name="debug" type="xs:boolean" default="false">
                <xs:annotation><xs:documentation>When true, the produced installers run in debug mode with extra logging.</xs:documentation></xs:annotation>
              </xs:attribute>
              <xs:attribute name="disableNotarization" type="xs:boolean" default="false">
                <xs:annotation><xs:documentation>When true, macOS notarization is skipped (DMG/PKG only). Notarization requires a signed and online build, so this flag is useful for offline iteration. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
              </xs:attribute>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="SingleVariableConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="value" type="xs:string" default="">
          <xs:annotation><xs:documentation>Default value of the variable. May reference other variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string" default="">
          <xs:annotation><xs:documentation>Optional description shown in the install4j IDE and in the unattended-install help text.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="category" type="xs:string" default="">
          <xs:annotation><xs:documentation>Free-form grouping label shown in the install4j IDE.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="hidden" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the variable is omitted from the unattended-install response file template.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="separatorConversion" type="SeparatorConversionEnum" default="none">
          <xs:annotation><xs:documentation>Whether file/path separators in the value are translated, and for which platform.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CompilerVariableConfigType">
    <xs:complexContent>
      <xs:extension base="SingleVariableConfigType">
        <xs:attribute name="overrideWindows" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the matching value attribute replaces the variable&apos;s value when building media sets for that platform.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideMacos" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the matching value attribute replaces the variable&apos;s value when building media sets for that platform.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideUnix" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the matching value attribute replaces the variable&apos;s value when building media sets for that platform.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="valueWindows" type="xs:string">
          <xs:annotation><xs:documentation>Platform-specific override of the variable&apos;s value. Effective only when the matching override flag is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="valueMacos" type="xs:string">
          <xs:annotation><xs:documentation>Platform-specific override of the variable&apos;s value. Effective only when the matching override flag is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="valueUnix" type="xs:string">
          <xs:annotation><xs:documentation>Platform-specific override of the variable&apos;s value. Effective only when the matching override flag is true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="InstallerVariableConfigType">
    <xs:complexContent>
      <xs:extension base="SingleVariableConfigType">
        <xs:attribute name="valueClass" type="ValueTypeEnum" default="undefined">
          <xs:annotation><xs:documentation>Runtime value type. `undefined` keeps the value as a String; otherwise the value is parsed as the named type (`integer`, `long`, `boolean`, `stringArray`, `intArray`, ...).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="registerForResponseFile" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this variable is included in the unattended-installation response file template generated by -Dinstall4j.responseFile.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="responseFileComment" type="xs:string" default="">
          <xs:annotation><xs:documentation>Comment placed above this variable in the generated response file template.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CodeSigningConfigType">
    <xs:sequence>
      <xs:element name="windowsPkcs11Identifier" type="CertificateIdentifierType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="macPkcs11Identifier" type="CertificateIdentifierType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="windowsKeystoreIdentifier" type="CertificateIdentifierType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="windowsDigestSigningExecutable" type="DigestSigningExectuableConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="macDigestSigningExecutable" type="DigestSigningExectuableConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="windowsAdditionalBinaries" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Glob patterns for additional Windows binaries inside the installer payload that should be signed (DLLs, helpers, etc.).</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="macAdditionalBinaries" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Glob patterns for additional macOS binaries inside the bundle that should be signed (.dylib, .so, .jnilib by default).</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="macSearchedJars" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Glob patterns for jars whose embedded native libraries should be searched and individually signed.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="macExcludedDirs" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Glob patterns for directories within the bundle that should NOT be searched for binaries to sign.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="entry" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="macEnabled" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, macOS artifacts are signed during the build. Requires the configured macKeySource to be set up correctly.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macKeySource" type="KeySourceEnum" default="pkcs12">
      <xs:annotation><xs:documentation>Where the macOS signing key comes from. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macPkcs12File" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to the .p12 file containing the macOS signing key and certificate chain. Used only when macKeySource=&quot;pkcs12&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsEnabled" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, Windows artifacts are signed during the build.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsKeySource" type="KeySourceEnum" default="pkcs12">
      <xs:annotation><xs:documentation>Where the Windows signing key comes from. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsPkcs12File" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to the .p12 file containing the Windows signing key and certificate chain. Used only when windowsKeySource=&quot;pkcs12&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsExecutable" type="xs:string" default="">
      <xs:annotation><xs:documentation>Path to a custom signing executable. Used only when windowsKeySource=&quot;executable&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsCertDir" type="xs:string" default="">
      <xs:annotation><xs:documentation>Directory containing the certificate files used by signtool when windowsKeySource=&quot;windows&quot;. Empty defaults to the system certificate store.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macNotarize" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, macOS artifacts are submitted to Apple for notarization after signing. Requires macApiIssuer/macApiKey/macApiPrivateKey. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macApiIssuer" type="xs:string" default="">
      <xs:annotation><xs:documentation>App Store Connect API issuer ID (UUID). Used only when macNotarize=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macApiKey" type="xs:string" default="">
      <xs:annotation><xs:documentation>App Store Connect API key ID. Used only when macNotarize=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macApiPrivateKey" type="xs:string" default="">
      <xs:annotation><xs:documentation>Path to the App Store Connect API private key file (.p8). Used only when macNotarize=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsPkcs11Library" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to the PKCS#11 library used for Windows signing. Used only when windowsKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsPkcs11Slot" type="xs:int" default="0">
      <xs:annotation><xs:documentation>PKCS#11 slot index for the Windows signing key. Used only when windowsKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsPkcs11CertificateType" type="KeyStoreCertificateTypeEnum" default="store">
      <xs:annotation><xs:documentation>Whether the Windows PKCS#11 certificate is read from the token (store) or from a file. Used only when windowsKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsPkcs11CertificateFile" type="xs:string" default="">
      <xs:annotation><xs:documentation>Path to the certificate file for Windows PKCS#11 signing. Used only when windowsKeySource=&quot;pkcs11&quot; and windowsPkcs11CertificateType=&quot;file&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macPkcs11Library" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to the PKCS#11 library used for macOS signing. Used only when macKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macPkcs11Slot" type="xs:int" default="0">
      <xs:annotation><xs:documentation>PKCS#11 slot index for the macOS signing key. Used only when macKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macPkcs11CertificateType" type="KeyStoreCertificateTypeEnum" default="store">
      <xs:annotation><xs:documentation>Whether the macOS PKCS#11 certificate is read from the token (store) or from a file. Used only when macKeySource=&quot;pkcs11&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="macPkcs11CertificateFile" type="xs:string" default="">
      <xs:annotation><xs:documentation>Path to the certificate file for macOS PKCS#11 signing. Used only when macKeySource=&quot;pkcs11&quot; and macPkcs11CertificateType=&quot;file&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="AutoUpdateConfigType">
    <xs:sequence>
      <xs:element name="commentFiles" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="file" type="CommentFileConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>Per-language release-notes file referenced by the auto-update descriptor. → doc/concepts/autoUpdate.md</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="customAttributes" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="attribute" type="AttributeConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>Name/value pair written into the auto-update descriptor and queryable from the application via the auto-update API. → doc/concepts/autoUpdate.md</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="useMinUpdatableVersion" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, only installations whose installed version is at least minUpdatableVersion are offered this update.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="minUpdatableVersion" type="xs:string" default="">
      <xs:annotation><xs:documentation>Lower-bound installed version that this update applies to. Effective when useMinUpdatableVersion=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="useMaxUpdatableVersion" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, only installations whose installed version is at most maxUpdatableVersion are offered this update.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="maxUpdatableVersion" type="xs:string" default="">
      <xs:annotation><xs:documentation>Upper-bound installed version that this update applies to. Effective when useMaxUpdatableVersion=true.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="DigestSigningExectuableConfigType">
    <xs:attribute name="certificateFile" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to the certificate file (PEM/DER) whose public key matches the signing key used by the external command.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="commandLine" type="xs:string" default="">
      <xs:annotation><xs:documentation>Command line that signs a digest. ${digest} is the hex-encoded digest input; the command must write the raw signature to stdout.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="batchMode" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, the command runs without prompting; pass-through of stdin is suppressed. Use for unattended builds where the command never asks for a password.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ModulesConfigType">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="defaultModules" type="ModulesConfig.DefaultModulesConfigType">
          <xs:annotation><xs:documentation>Selects a predefined module baseline. Individual &lt;module&gt; entries layered on top add to or remove from this set.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="module" type="ModulesConfig.ModuleConfigType">
          <xs:annotation><xs:documentation>A single JPMS module (e.g. &apos;java.sql&apos;) to add to or remove from the bundled JRE.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="jmod" type="ModulesConfig.JmodConfigType">
          <xs:annotation><xs:documentation>Additional .jmod file linked into the bundled JRE.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="jmodDirectory" type="ModulesConfig.JmodDirectoryConfigType">
          <xs:annotation><xs:documentation>Directory of additional .jmod files linked into the bundled JRE.</xs:documentation></xs:annotation>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ModulesConfig.DefaultModulesConfigType">
    <xs:attribute name="set" type="DefaultModulesSetEnum">
      <xs:annotation><xs:documentation>Which preset module set to use as the baseline.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ModulesConfig.ModuleConfigType">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="exclude" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this module is removed from the baseline set instead of being added.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ModulesConfig.JmodConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ModulesConfig.JmodDirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CertificateIdentifierType">
    <xs:attribute name="type" type="CertificateIdentifierTypeEnum" default="serial">
      <xs:annotation><xs:documentation>How the certificate is selected. `serial` identifies it by issuer plus serial number; `label` by alias or PKCS#11 label.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="issuer" type="xs:string" default="">
      <xs:annotation><xs:documentation>Issuer common name (CN) of the certificate. Used together with `serial` when type=&quot;serial&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="serial" type="xs:string" default="">
      <xs:annotation><xs:documentation>Serial number of the certificate (hex). Used together with `issuer` when type=&quot;serial&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="subject" type="xs:string" default="">
      <xs:annotation><xs:documentation>Subject common name (CN) of the certificate. Informational; not used to look up the key.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="label" type="xs:string" default="">
      <xs:annotation><xs:documentation>Keystore alias or PKCS#11 object label. Used when type=&quot;label&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="AttributeConfigType">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="value" type="xs:string">
          <xs:annotation><xs:documentation>Value of the custom attribute. May contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CommentFileConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType">
        <xs:attribute name="languageId" type="xs:string" default="">
          <xs:annotation><xs:documentation>ISO language code (e.g. &apos;en&apos;, &apos;de&apos;) selecting which translation this comment file applies to.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="JreBundlesDefaultConfigType">
    <xs:complexContent>
      <xs:extension base="AbstractJreBundlesConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MergedProjectConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndIdConfigType">
        <xs:attribute name="enabled" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When false, this merged project is ignored at build time without removing it from the configuration.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="projectFile" type="filePath" use="required">
          <xs:annotation><xs:documentation>Path to the .install4j project file to merge in, relative to this project&apos;s location.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mergeFiles" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the file tree of the merged project is included.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mergeLaunchers" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, launchers defined in the merged project are added to this project.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mergeInstallerApplications" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, installer applications (screens, actions, form components) of the merged project are included.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mergeStyles" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, GUI styles of the merged project are included. Off by default to avoid style id collisions.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FileTreeConfigType" abstract="true">
    <xs:sequence>
      <xs:element name="entry" type="FileSelectionEntryType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="IncludeConfigType">
    <xs:complexContent>
      <xs:extension base="FileTreeConfigType">
        <xs:attribute name="all" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, all entries match.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MountPointConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndIdConfigType">
        <xs:attribute name="root" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the &lt;root&gt; this mount point sits under.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="location" type="filePath" default="">
          <xs:annotation><xs:documentation>Path under the root where files attached to this mount point are placed. May contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideMode" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, mode replaces the original directory permissions for this mount point; otherwise the project default applies.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mode" type="xs:string" default="755">
          <xs:annotation><xs:documentation>Octal directory mode (e.g. &apos;755&apos;) for this mount point. Effective only when overrideMode=true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BaseEntryConfigType">
    <xs:attribute name="mountPoint" type="xs:string" default="">
      <xs:annotation><xs:documentation>Id of the &lt;mountPoint&gt; that anchors this entry&apos;s destination at install time.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="file" type="filePath" default="">
      <xs:annotation><xs:documentation>Source file path on the build host. May contain compiler variables.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="overwriteMode" type="OverwriteModeEnum" default="alwaysAskExceptForUpdate">
      <xs:annotation><xs:documentation>Behavior when the destination file already exists. Effective only when overrideOverwriteMode=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="shared" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, the file is marked as shared with other applications and is not removed by the uninstaller as long as another application owns it.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="fileMode" type="xs:string" default="644">
      <xs:annotation><xs:documentation>Octal Unix permission mode (e.g. &apos;755&apos;) applied when overrideFileMode=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="uninstallMode" type="UninstallModeEnum" default="ifCreated">
      <xs:annotation><xs:documentation>Whether the uninstaller removes this file. Effective only when overrideUninstallMode=true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="overrideFileMode" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, fileMode replaces the file&apos;s original permissions; otherwise original mode (or the project default) is preserved.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="overrideOverwriteMode" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, this entry&apos;s overwriteMode is used; otherwise the project&apos;s &lt;files&gt; default applies.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="overrideUninstallMode" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, this entry&apos;s uninstallMode is used; otherwise the project&apos;s &lt;files&gt; default applies.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="RootConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndIdConfigType">
        <xs:attribute name="fileset" type="filePath" default="">
          <xs:annotation><xs:documentation>Id of the fileset this root contributes to. Empty means the default fileset.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="location" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to the directory whose contents are added to the distribution tree.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FileSelectionEntryType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType">
        <xs:attribute name="fileType" type="FileTypeEnum" default="regular"/>
        <xs:attribute name="rootId" type="xs:string">
          <xs:annotation><xs:documentation>Optional id of an installation root that prefixes the location attribute.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="defaultFileset" type="xs:boolean">
          <xs:annotation><xs:documentation>When true, this entry references the default file set; the location attribute is then ignored.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="filesetId" type="xs:string">
          <xs:annotation><xs:documentation>When set, this entry references the contents of the file set with the given id; the location attribute is then ignored.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DirEntryConfigType">
    <xs:complexContent>
      <xs:extension base="BaseEntryConfigType">
        <xs:sequence>
          <xs:element name="exclude" type="ExcludeConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Exclusion list for a directory scan: matching entries are dropped. Combined with the directory&apos;s excludeSuffixes attribute and the project-wide globalExcludeSuffixes.</xs:documentation></xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="entryMode" type="DirEntryModeEnum" default="direct">
          <xs:annotation><xs:documentation>How this directory contributes content.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="subDirectory" type="xs:string" default="">
          <xs:annotation><xs:documentation>Optional sub-path appended to the entry&apos;s location, used when entryMode=&quot;subdir&quot;.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="excludeSuffixes" type="xs:string" default="">
          <xs:annotation><xs:documentation>Comma-separated list of filename suffix patterns to exclude. Asterisks are stripped; &apos;*.bak&apos; becomes &apos;bak&apos;.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="dirMode" type="xs:string" default="755">
          <xs:annotation><xs:documentation>Octal directory permission mode applied when overrideDirMode=true (e.g. &apos;755&apos;). Used on Unix-like targets.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideDirMode" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, dirMode replaces the directory&apos;s original permissions; otherwise the original mode (or the project default) is preserved.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="VariableEntryConfigType">
    <xs:complexContent>
      <xs:extension base="BaseEntryConfigType">
        <xs:attribute name="name" type="xs:string" default="">
          <xs:annotation><xs:documentation>Name of the compiler variable supplying the file paths.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="separator" type="xs:string" default="${compiler:sys.pathlistSeparator}">
          <xs:annotation><xs:documentation>Separator character that splits the variable&apos;s value into individual paths. Defaults to the platform path separator.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ExcludeConfigType">
    <xs:complexContent>
      <xs:extension base="FileTreeConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="InstallerGUIConfigType">
    <xs:sequence>
      <xs:element name="laf" type="LookAndFeelConfigType" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Look and feel of the installer GUI: theme selection, dark mode strategy, UI scaling. → doc/concepts/lookAndFeel.md</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="customCode" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Sources of custom Java code (.class files, jars, archives, scan directories) added to the installer classpath. Custom screens, actions, and form components reference classes from these sources via &apos;beanClass&apos;. → doc/api/</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="file" type="CustomCodeConfig.FileConfigType">
                <xs:annotation><xs:documentation>Single .class or .jar file added to the custom code classpath.</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="directory" type="CustomCodeConfig.DirectoryConfigType">
                <xs:annotation><xs:documentation>Directory of compiled .class files added to the custom code classpath as a classes root.</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="scanDirectory" type="CustomCodeConfig.ScanDirectoryConfigType">
                <xs:annotation><xs:documentation>Directory whose contained .jar files are added to the custom code classpath. Re-scanned on every build.</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="archive" type="CustomCodeConfig.ArchiveConfigType">
                <xs:annotation><xs:documentation>Zip archive whose contents are extracted onto the custom code classpath.</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="resource" type="CustomCodeConfig.ResourceConfigType">
                <xs:annotation><xs:documentation>Resource file (e.g. images, properties) added to the installer classpath as-is.</xs:documentation></xs:annotation>
              </xs:element>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="staticMembers" type="ScriptConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="autoUpdate" type="AutoUpdateConfigType" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Auto-update descriptor settings. → doc/concepts/autoUpdate.md, doc/concepts/backgroundAutoUpdate.md</xs:documentation></xs:annotation>
      </xs:element>
      <xs:element name="applications" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="application" type="InstallerApplicationConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>An installer application: the standard installer, the standard uninstaller, or an add-on installer application. The &apos;beanClass&apos; attribute selects the application implementation. → doc/concepts/screensAndActions.md, doc/installers/</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="styles" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="style" type="StyleConfigType">
                <xs:annotation><xs:documentation>A reusable visual style applied to wizard screens (header, banner, watermark chrome). → doc/concepts/screenStyles.md</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="group" type="DefaultGroupConfigType">
                <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="defaultStyleId" type="xs:string">
            <xs:annotation><xs:documentation>ID of the &lt;style&gt; applied to screens that don&apos;t carry their own styleId. → doc/concepts/screenStyles.md</xs:documentation></xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
      <xs:element name="widgetStyles" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="widgetStyle" type="WidgetStyleConfigType">
                <xs:annotation><xs:documentation>A reusable collection of FlatLaf widget overrides that styles can reference via widgetStyleId. → doc/concepts/widgetStyles.md</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="group" type="DefaultGroupConfigType">
                <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
              </xs:element>
            </xs:choice>
          </xs:sequence>
          <xs:attribute name="defaultWidgetStyleId" type="xs:string">
            <xs:annotation><xs:documentation>ID of the &lt;widgetStyle&gt; applied to form components that don&apos;t carry their own widgetStyleId. → doc/concepts/widgetStyles.md</xs:documentation></xs:annotation>
          </xs:attribute>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="installerType" type="InstallerTypeEnum" default="regular">
      <xs:annotation><xs:documentation>regular = full installer; addOn = patch installer that updates a previously-installed regular installer of the project named in addOnAppId.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="addOnAppId" type="xs:string" default="">
      <xs:annotation><xs:documentation>Application id of the regular install4j project this addOn updates. Used only when installerType=&quot;addon&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="autoUpdateDescriptorUrl" type="xs:string" default="">
      <xs:annotation><xs:documentation>URL where the auto-update descriptor (updates.xml) is fetched from. → doc/concepts/autoUpdate.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="useAutoUpdateBaseUrl" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, autoUpdateBaseUrl is used as a base for resolving relative URLs in the auto-update descriptor.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="autoUpdateBaseUrl" type="xs:string" default="">
      <xs:annotation><xs:documentation>Base URL for resolving relative URLs in the auto-update descriptor. Used only when useAutoUpdateBaseUrl is true. → doc/concepts/autoUpdate.md</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="BeanConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NameAndCustomizableIdConfigType">
        <xs:sequence>
          <xs:element name="serializedBean" type="SerializedBeanType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="textOverrides" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="property" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="name" type="xs:string"/>
                    <xs:attribute name="value" type="xs:string"/>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="actionLists" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="actionList" type="ActionListConfigType" minOccurs="0" maxOccurs="unbounded">
                  <xs:annotation><xs:documentation>Reusable list of actions referenced from beans (typically from form components or actions whose property type is ActionList). → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="beanClass" type="xs:string" default="">
          <xs:annotation><xs:documentation>Fully qualified Java class name of the bean implementation. Built-in install4j beans live under com.install4j.runtime.beans.*; custom beans must be on the custom code classpath. → doc/api/</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="enabled" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When false, this screen, action, or form component is skipped at runtime as if it weren&apos;t in the configuration.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="commentSet" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this bean has a configuration comment shown in the install4j IDE.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="comment" type="xs:string" default="">
          <xs:annotation><xs:documentation>Free-form comment shown in the install4j IDE. Has no runtime effect.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="StyleOverrideConfigType">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:sequence>
          <xs:any processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:anyAttribute processContents="lax"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ActionParentBeanConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="BeanConfigType">
        <xs:sequence>
          <xs:element name="styleOverrides" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="styleOverride" type="StyleOverrideConfigType" minOccurs="0" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="actionElevationType" type="ActionElevationTypeEnum">
          <xs:annotation><xs:documentation>Privilege elevation policy applied when this screen/action runs. → doc/concepts/privileges.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="styleId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Reference to the &lt;style&gt; element used for this screen&apos;s chrome (header, banner, watermark).</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="GroupConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="ActionParentBeanConfigType">
        <xs:sequence>
          <xs:element name="beans" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="action" type="ActionConfigType">
                    <xs:annotation><xs:documentation>An action that runs as part of an action list, screen, or screen group. The &apos;beanClass&apos; attribute selects the action implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="screen" type="ScreenConfigType">
                    <xs:annotation><xs:documentation>A wizard screen shown to the user. The &apos;beanClass&apos; attribute selects which screen implementation runs (built-in screens under com.install4j.runtime.beans.screens.*). → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="formComponent" type="FormComponentConfigType">
                    <xs:annotation><xs:documentation>A form component (label, text field, file chooser, etc.) shown on a form screen. The &apos;beanClass&apos; attribute selects the implementation. → doc/concepts/formScreens.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="style" type="StyleConfigType">
                    <xs:annotation><xs:documentation>A reusable visual style applied to wizard screens (header, banner, watermark chrome). → doc/concepts/screenStyles.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="link" type="LinkConfigType">
                    <xs:annotation><xs:documentation>Reference to a screen, action, or form component defined elsewhere (in this project or in a merged project) instead of duplicating the definition. → doc/concepts/screensAndActions.md, doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="group" type="DefaultGroupConfigType">
                    <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="externalParametrizationPropertyNames" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Property names exposed when externalParametrizationMode=&quot;include&quot; or restricted from when it is &quot;exclude&quot;.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="propertyName" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:simpleContent>
                      <xs:extension base="xs:string"/>
                    </xs:simpleContent>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="useExternalParametrization" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this form component&apos;s properties become parameters of the generated installer wrapper, settable from the command line / response file.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="externalParametrizationName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Name used as the installer-variable / response-file key for this form component&apos;s parametrization.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="externalParametrizationMode" type="ExternalParametrizationModeEnum" default="all">
          <xs:annotation><xs:documentation>Which properties are externally parametrizable.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="DefaultGroupConfigType">
    <xs:complexContent>
      <xs:extension base="GroupConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="StyleConfigType">
    <xs:complexContent>
      <xs:extension base="BeanConfigType">
        <xs:sequence>
          <xs:element name="formComponents" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="formComponent" type="FormComponentConfigType">
                    <xs:annotation><xs:documentation>A form component (label, text field, file chooser, etc.) shown on a form screen. The &apos;beanClass&apos; attribute selects the implementation. → doc/concepts/formScreens.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="group" type="FormComponentGroupConfigType">
                    <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="widgetStyleId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Reference to a &lt;widgetStyle&gt; by its id. The widget style provides theming for individual UI controls inside this style.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FormComponentGroupConfigType">
    <xs:complexContent>
      <xs:extension base="GroupConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ActionListConfigType">
    <xs:complexContent>
      <xs:extension base="NameAndIdConfigType">
        <xs:sequence>
          <xs:choice minOccurs="0" maxOccurs="unbounded">
            <xs:element name="action" type="ActionConfigType">
              <xs:annotation><xs:documentation>An action that runs as part of an action list, screen, or screen group. The &apos;beanClass&apos; attribute selects the action implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
            </xs:element>
            <xs:element name="group" type="DefaultGroupConfigType">
              <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
            </xs:element>
            <xs:element name="link" type="LinkConfigType">
              <xs:annotation><xs:documentation>Reference to a screen, action, or form component defined elsewhere (in this project or in a merged project) instead of duplicating the definition. → doc/concepts/screensAndActions.md, doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
            </xs:element>
          </xs:choice>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LinkConfigType">
    <xs:complexContent>
      <xs:extension base="BeanConfigType">
        <xs:attribute name="targetId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the target bean to link to. Resolved against the local or merged project as selected by mergedProjectId.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mergedProjectId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the merged project that owns the target. Empty when the target lives in the local project.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="WizardIndexConfigType">
    <xs:sequence>
      <xs:element name="steps" minOccurs="0" maxOccurs="1">
        <xs:annotation><xs:documentation>Ordered list of wizard index steps shown in the sidebar.</xs:documentation></xs:annotation>
        <xs:complexType>
          <xs:sequence>
            <xs:element name="step" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>A single wizard index entry (key + display name).</xs:documentation></xs:annotation>
              <xs:complexType>
                <xs:attribute name="key" type="xs:string">
                  <xs:annotation><xs:documentation>Stable identifier for the step, referenced from screens via wizardIndexKey.</xs:documentation></xs:annotation>
                </xs:attribute>
                <xs:attribute name="name" type="xs:string">
                  <xs:annotation><xs:documentation>Display name of the wizard index step shown in the sidebar.</xs:documentation></xs:annotation>
                </xs:attribute>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="partiallyDefined" type="xs:boolean">
      <xs:annotation><xs:documentation>When true, only the steps explicitly defined here are shown; when false, the full wizard sequence is reflected.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="maxWidth" type="xs:int">
      <xs:annotation><xs:documentation>Maximum width of the wizard index sidebar in pixels.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="minWidth" type="xs:int">
      <xs:annotation><xs:documentation>Minimum width of the wizard index sidebar in pixels.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="numbered" type="xs:boolean">
      <xs:annotation><xs:documentation>When true, steps are prefixed with running numbers in the sidebar.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="background" type="xs:string">
      <xs:annotation><xs:documentation>Background color of the wizard index sidebar (hex like &apos;#202020&apos; or legacy integer). Empty means use the look and feel default.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="foreground" type="xs:string">
      <xs:annotation><xs:documentation>Foreground (text) color of the wizard index sidebar. Empty means use the look and feel default.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="backgroundImage" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to a background image rendered behind the wizard index sidebar.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="backgroundImageAnchor" type="xs:int">
      <xs:annotation><xs:documentation>Where the background image is anchored inside the sidebar; integer GridBagConstraints code (e.g. 18 = FIRST_LINE_START, 11 = PAGE_START, 10 = CENTER).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="initialKey" type="xs:string" default="">
      <xs:annotation><xs:documentation>Key of the initially highlighted step when the wizard first appears.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="InstallerApplicationConfigType">
    <xs:complexContent>
      <xs:extension base="ActionParentBeanConfigType">
        <xs:sequence>
          <xs:element name="customScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Unix shell-script fragment inserted into the generated launcher script (executed before the JVM is invoked).</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="infoPlist" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Custom macOS Info.plist fragment merged into the generated bundle&apos;s plist.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="launcherIds" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="launcher" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string" use="required">
                      <xs:annotation><xs:documentation>Auto-generated stable identifier for this config item, referenced from elsewhere in the project (mediaSet refIds, fileset ids, mountPoint root ids, etc.). Don&apos;t change once installers have shipped.</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="variables" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Compiler variables expand at build time; installer variables back ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="variable" type="InstallerVariableConfigType">
                    <xs:annotation><xs:documentation>A single named variable. As a compiler variable it is expanded with ${compiler:name} during the build; as an installer variable it backs ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="startup" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Startup screen run before any UI is shown. Use it for license checks, elevation requests, and other preflight work.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="screen" type="ScreenConfigType" minOccurs="0" maxOccurs="1">
                  <xs:annotation><xs:documentation>A wizard screen shown to the user. The &apos;beanClass&apos; attribute selects which screen implementation runs (built-in screens under com.install4j.runtime.beans.screens.*). → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="screens" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Wizard screens shown by this application, in display order.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="screen" type="ScreenConfigType">
                    <xs:annotation><xs:documentation>A wizard screen shown to the user. The &apos;beanClass&apos; attribute selects which screen implementation runs (built-in screens under com.install4j.runtime.beans.screens.*). → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="group" type="DefaultGroupConfigType">
                    <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="link" type="LinkConfigType">
                    <xs:annotation><xs:documentation>Reference to a screen, action, or form component defined elsewhere (in this project or in a merged project) instead of duplicating the definition. → doc/concepts/screensAndActions.md, doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="fileset" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the fileset to install for this application. Empty means the default fileset.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customIcnsFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a custom .icns file used for the macOS installer/uninstaller bundle. Overrides the project default.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customIcoFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a custom .ico file used for the Windows installer/uninstaller executable. Overrides the project default.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="macEntitlementsFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Path to a macOS entitlements .plist embedded into the signed installer/uninstaller. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="automaticLauncherIntegration" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer launches the configured launcher(s) at the end as configured by launchMode/launchSchedule/allLaunchers/launcherIds.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="launchMode" type="LaunchModeEnum" default="startupFirstWindow">
          <xs:annotation><xs:documentation>When the launcher is started relative to the installer&apos;s startup. Effective only when automaticLauncherIntegration=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="launchInNewProcess" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the launcher runs in a separate process detached from the installer. Off keeps it as a child process.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="launchSchedule" type="LaunchScheduleEnum" default="updateSchedule">
          <xs:annotation><xs:documentation>Whether automatic launching also runs after update installs, and (for archive media files) whether it runs once per user. Effective only when automaticLauncherIntegration=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="allLaunchers" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, all launchers in this project are eligible for automatic launch. When false, only those listed in &lt;launcherIds&gt; are.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ControlFlowBeanConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="ActionParentBeanConfigType">
        <xs:sequence>
          <xs:element name="condition" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="rollbackBarrier" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this action stops the rollback chain on failure: previous actions are rolled back, but actions before this barrier are kept.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="rollbackBarrierExitCode" type="xs:int" default="1">
          <xs:annotation><xs:documentation>Installer exit code returned when rollback stops at this barrier. Defaults to install4j&apos;s standard rollback exit code.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FormComponentConfigType">
    <xs:complexContent>
      <xs:extension base="BeanConfigType">
        <xs:sequence>
          <xs:element name="initScript" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="visibilityScript" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="externalParametrizationPropertyNames" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Property names exposed when externalParametrizationMode=&quot;include&quot; or restricted from when it is &quot;exclude&quot;.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="propertyName" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:simpleContent>
                      <xs:extension base="xs:string"/>
                    </xs:simpleContent>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="insetTop" type="xs:int" default="3">
          <xs:annotation><xs:documentation>Top inset (pixels) around this form component, defaults to the standard layout spacing.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="insetLeft" type="xs:int" default="0">
          <xs:annotation><xs:documentation>Left inset (pixels) around this form component.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="insetBottom" type="xs:int" default="3">
          <xs:annotation><xs:documentation>Bottom inset (pixels) around this form component.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="insetRight" type="xs:int" default="0">
          <xs:annotation><xs:documentation>Right inset (pixels) around this form component.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="resetInitOnPrevious" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the initialization script runs again every time the user revisits this screen, not only on the first activation.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useExternalParametrization" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this form component&apos;s properties become parameters of the generated installer wrapper, settable from the command line / response file.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="externalParametrizationName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Name used as the installer-variable / response-file key for this form component&apos;s parametrization.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="externalParametrizationMode" type="ExternalParametrizationModeEnum" default="all">
          <xs:annotation><xs:documentation>Which properties are externally parametrizable.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ActionConfigType">
    <xs:complexContent>
      <xs:extension base="ControlFlowBeanConfigType">
        <xs:attribute name="multiExec" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the action runs every time the wizard re-enters its parent screen instead of only on the first activation.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="failureStrategy" type="FailureStrategyEnum" default="continue">
          <xs:annotation><xs:documentation>What happens when the action throws or returns failure. `continue`/`quit`/`ask` are the common choices.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="failureAskRetry" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When failureStrategy=&quot;ask&quot;, controls whether the dialog offers a Retry button.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="failureAskQuit" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When failureStrategy=&quot;ask&quot;, controls whether the dialog offers a Quit button.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="failureAskIgnore" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When failureStrategy=&quot;ask&quot;, controls whether the dialog offers an Ignore button.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="errorMessage" type="xs:string" default="">
          <xs:annotation><xs:documentation>Error message shown when the action fails. May contain compiler and installer variables.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="WidgetStyleConfigType">
    <xs:complexContent>
      <xs:extension base="BeanConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CustomCodeConfig.FileConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CustomCodeConfig.DirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CustomCodeConfig.ScanDirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CustomCodeConfig.ArchiveConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CustomCodeConfig.ResourceConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ScreenConfigType">
    <xs:complexContent>
      <xs:extension base="ControlFlowBeanConfigType">
        <xs:sequence>
          <xs:element name="wizardIndex" type="WizardIndexConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="validation" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="preActivation" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="postActivation" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="actions" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="action" type="ActionConfigType">
                    <xs:annotation><xs:documentation>An action that runs as part of an action list, screen, or screen group. The &apos;beanClass&apos; attribute selects the action implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="group" type="DefaultGroupConfigType">
                    <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="link" type="LinkConfigType">
                    <xs:annotation><xs:documentation>Reference to a screen, action, or form component defined elsewhere (in this project or in a merged project) instead of duplicating the definition. → doc/concepts/screensAndActions.md, doc/concepts/mergedProjects.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="formComponents" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="formComponent" type="FormComponentConfigType">
                    <xs:annotation><xs:documentation>A form component (label, text field, file chooser, etc.) shown on a form screen. The &apos;beanClass&apos; attribute selects the implementation. → doc/concepts/formScreens.md</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="group" type="FormComponentGroupConfigType">
                    <xs:annotation><xs:documentation>Groups screens, actions, or form components for shared activation logic and reuse. The &apos;beanClass&apos; attribute selects the group implementation. → doc/concepts/screensAndActions.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="backButton" type="BackButtonTypeEnum" default="safe">
          <xs:annotation><xs:documentation>Behavior of the Back button on this screen. `visible` always shows it; `safe` only when no irreversible action has run; `hidden` always hides it.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="finishScreen" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this is the final screen of the wizard (Finish/Done button instead of Next).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="wizardIndexChangeType" type="WizardIndexChangeTypeEnum" default="unchanged">
          <xs:annotation><xs:documentation>How this screen affects the wizard index sidebar.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="wizardIndexKey" type="xs:string" default="">
          <xs:annotation><xs:documentation>Identifier of the wizard index entry to create or activate; used with wizardIndexChangeType=`new` or `step`.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LookAndFeelConfigType">
    <xs:attribute name="type" type="LookAndFeelTypeEnum" default="crossPlatform">
      <xs:annotation><xs:documentation>Selects the look and feel family. `crossPlatform` uses FlatLaf themes; `native` uses the platform default; `custom` uses a user-supplied handler class.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="darkModeStrategy" type="DarkModeStrategyEnum" default="auto">
      <xs:annotation><xs:documentation>How the installer decides between light and dark theme at runtime.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="lightTheme" type="FlatLafLightThemeEnum" default="lightIntelliJ">
      <xs:annotation><xs:documentation>Selected light theme. Use `custom` together with customLightThemeName to load an IntelliJ .theme.json file.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="darkTheme" type="FlatLafDarkThemeEnum" default="darcula">
      <xs:annotation><xs:documentation>Selected dark theme. Use `custom` together with customDarkThemeName to load an IntelliJ .theme.json file.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="customLightThemeName" type="xs:string" default="">
      <xs:annotation><xs:documentation>Resource name of an IntelliJ .theme.json shipped with the installer; used when lightTheme=&quot;custom&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="customDarkThemeName" type="xs:string" default="">
      <xs:annotation><xs:documentation>Resource name of an IntelliJ .theme.json shipped with the installer; used when darkTheme=&quot;custom&quot;.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="lookAndFeelHandlerClassName" type="xs:string" default="">
      <xs:annotation><xs:documentation>Fully qualified class name implementing LookAndFeelHandler; used when type=&quot;custom&quot;. → doc/api/</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="uiScalingPercentage" type="xs:string" default="100">
      <xs:annotation><xs:documentation>UI scaling percentage applied to the installer GUI. May contain compiler variables; numeric value, &apos;100&apos; means no scaling.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="BaseMediaSetConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NameAndCustomizableIdConfigType">
        <xs:sequence>
          <xs:element name="excludedComponents" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Components excluded from this media set. Their files are not embedded and the entries are hidden from the user.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="component" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string">
                      <xs:annotation><xs:documentation>Reference to a component or launcher id elsewhere in the project (depending on the wrapping element: excludedComponents, includedDownloadableComponents, excludedLaunchers).</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="includedDownloadableComponents" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Downloadable components whose archives are bundled into this media set instead of being downloaded at install time. Effective when includeAllDownloadableComponents=false.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="component" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string">
                      <xs:annotation><xs:documentation>Reference to a component or launcher id elsewhere in the project (depending on the wrapping element: excludedComponents, includedDownloadableComponents, excludedLaunchers).</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="excludedLaunchers" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="launcher" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string">
                      <xs:annotation><xs:documentation>Reference to a component or launcher id elsewhere in the project (depending on the wrapping element: excludedComponents, includedDownloadableComponents, excludedLaunchers).</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="excludedBeans" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="bean" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="refId" type="xs:string">
                      <xs:annotation><xs:documentation>Reference to the bean&apos;s id (matches a screen/action/form-component id elsewhere in the project).</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="overriddenPrincipalLanguage" type="SingleLanguageConfigType" minOccurs="0" maxOccurs="1"/>
          <xs:element name="exclude" type="ExcludeConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Exclusion list for a directory scan: matching entries are dropped. Combined with the directory&apos;s excludeSuffixes attribute and the project-wide globalExcludeSuffixes.</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="variables" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Compiler variables expand at build time; installer variables back ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="variable" type="CompilerVariableOverrideConfigType">
                    <xs:annotation><xs:documentation>A single named variable. As a compiler variable it is expanded with ${compiler:name} during the build; as an installer variable it backs ${installer:name} at runtime. → doc/concepts/variables.md</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="jreBundle" type="JreBundleConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Per-media-set JRE bundle, overriding the project-wide &lt;jreBundles&gt; default. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="autoUpdate" type="AutoUpdateConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Auto-update descriptor settings. → doc/concepts/autoUpdate.md, doc/concepts/backgroundAutoUpdate.md</xs:documentation></xs:annotation>
          </xs:element>
          <xs:element name="laf" type="LookAndFeelConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Look and feel of the installer GUI: theme selection, dark mode strategy, UI scaling. → doc/concepts/lookAndFeel.md</xs:documentation></xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="mediaFileName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Per-media-set override of the project-wide media file name pattern. Empty falls back to &lt;application&gt;/mediaFilePattern.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="installDir" type="xs:string">
          <xs:annotation><xs:documentation>Default install directory for this media set. Often defaults to ${compiler:sys.shortName}; may contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overridePrincipalLanguage" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this media set uses its own principal language instead of the project&apos;s.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="runPostProcessor" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the postProcessor command is run after the media file is built.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="postProcessor" type="xs:string" default="">
          <xs:annotation><xs:documentation>Command line for an external post-processor invoked after a successful build. Receives the media file path as ${compiler:sys.mediaFile}.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="failOnPostProcessorError" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, a non-zero exit from the post-processor fails the build; otherwise it is treated as a warning.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useLegacyMediaFileIds" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the legacy media file id format from pre-8 install4j is preserved for compatibility with existing auto-update flows.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="legacyMediaFileIds" type="xs:string" default="">
          <xs:annotation><xs:documentation>Comma-separated list of legacy media file ids that this media set is known under, used for auto-update id matching.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="downloadURL" type="xs:string" default="">
          <xs:annotation><xs:documentation>Base URL from which downloadable components are fetched at install time. Required when any component has downloadable=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="includeAllDownloadableComponents" type="xs:boolean">
          <xs:annotation><xs:documentation>When true, all downloadable components are bundled directly into this media set. Off by default for online installers.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="overrideLaf" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, this media set uses its own look and feel instead of the project-wide one.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BaseGUIMediaSetConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:attribute name="customInstallBaseDir" type="xs:string" default="">
          <xs:annotation><xs:documentation>Pre-filled installation base directory shown to the user. Empty falls back to the platform default (e.g. Program Files on Windows).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="contentFilesType" type="ContentFilesTypeEnum" default="internal">
          <xs:annotation><xs:documentation>How distribution files are packaged relative to the installer.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="WindowsArchiveMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:attribute name="architecture" type="WindowsArchitectureEnum">
          <xs:annotation><xs:documentation>Target CPU architecture for the produced Windows installer or archive. Selects which JRE flavor is bundled.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MsixServiceConfigType">
    <xs:sequence>
      <xs:element name="dependencies" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="dependency" minOccurs="0" maxOccurs="unbounded">
              <xs:complexType>
                <xs:attribute name="name" type="xs:string"/>
              </xs:complexType>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="launcherId" type="xs:string" use="required">
      <xs:annotation><xs:documentation>Id of the install4j service launcher this entry configures.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="startupType" type="MsixServiceStartupTypeEnum" default="auto">
      <xs:annotation><xs:documentation>Service@StartupType. Default auto.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="startAccount" type="MsixServiceStartAccountEnum" default="localSystem">
      <xs:annotation><xs:documentation>Service@StartAccount. Default localSystem.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="MsixMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:sequence>
          <xs:element name="pathAliases" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Launcher / installer-application ids exposed on PATH via windows.appExecutionAlias. The alias name is the launcher&apos;s executable filename, e.g. mytool.exe — users invoke it from a shell as &apos;mytool&apos;.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="pathAlias" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="id" type="xs:string" use="required">
                      <xs:annotation><xs:documentation>Auto-generated stable identifier for this config item, referenced from elsewhere in the project (mediaSet refIds, fileset ids, mountPoint root ids, etc.). Don&apos;t change once installers have shipped.</xs:documentation></xs:annotation>
                    </xs:attribute>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="services" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Service launchers included in the manifest as &lt;uap5:Extension Category=&quot;windows.service&quot;&gt;. Each entry references a service-mode launcher by id and configures its startup type, account, and dependencies.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="service" type="MsixServiceConfigType" minOccurs="0" maxOccurs="unbounded"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
          <xs:element name="associations" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>File-type associations and URL-scheme handlers emitted into the manifest. Each entry binds an extension or scheme to one launcher via its id.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="fileAssociation" type="MsixFileAssociationConfigType"/>
                  <xs:element name="urlHandler" type="MsixUrlHandlerConfigType"/>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="architecture" type="WindowsArchitectureEnum">
          <xs:annotation><xs:documentation>Target CPU architecture for the produced Windows installer or archive. Selects which JRE flavor is bundled.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="packageIdentityName" type="xs:string" default="">
          <xs:annotation><xs:documentation>Identity Name in the package manifest. Empty falls back to a sanitized form of ${compiler:sys.shortName}.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="packageVersion" type="xs:string" default="">
          <xs:annotation><xs:documentation>Identity Version in a.b.c.d form. Empty pads the project version to four parts.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="createForStore" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the package is built for Microsoft Store submission: Identity/@Publisher is set to storePublisherId instead of being derived from the signing certificate, and the package is left unsigned so the Store signs it on upload.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="storePublisherId" type="xs:string" default="">
          <xs:annotation><xs:documentation>The Package/Identity/Publisher value assigned by Partner Center, e.g. CN=ABCDEF12-3456-7890-ABCD-EF1234567890. Used (and required) only when createForStore is true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="startupLauncherId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the launcher to register as a windows.startupTask — auto-launches when the user logs in. Empty: no startup task. The user can disable it later via Settings &gt; Apps &gt; Startup.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="minWindowsVersion" type="xs:string" default="10.0.17763.0">
          <xs:annotation><xs:documentation>Dependencies/TargetDeviceFamily @MinVersion. Default 10.0.17763.0 (Windows 10 1809, MSIX baseline).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="maxWindowsVersionTested" type="xs:string" default="10.0.22621.0">
          <xs:annotation><xs:documentation>Dependencies/TargetDeviceFamily @MaxVersionTested.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="appInstallerUrl" type="xs:string" default="">
          <xs:annotation><xs:documentation>Public URL where the .appinstaller will be hosted. Empty: no .appinstaller is generated. The .msix referenced inside the .appinstaller is assumed to live at the same directory under its compiled filename.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="updateCheckHours" type="xs:int" default="24">
          <xs:annotation><xs:documentation>OnLaunch/@HoursBetweenUpdateChecks. 0-255, default 24.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="showUpdatePrompt" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>OnLaunch/@ShowPrompt: when true, App Installer prompts the user before applying an update. When false, updates install silently.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="automaticBackgroundUpdates" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>Emit AutomaticBackgroundTask: when true, Windows checks for updates in the background even when the app is not running.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="updateBlocksActivation" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>OnLaunch/@UpdateBlocksActivation: when true, the app is held off until an available update is applied. When false (the default), launches proceed against the currently-installed version while the update downloads in the background.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="forceUpdateFromAnyVersion" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>Emit ForceUpdateFromAnyVersion: when true, the .appinstaller&apos;s package replaces the installed package even when the installed version is newer (e.g. for shipping a rollback). Default false.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customizePackageIcon" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, packageIconImageFile drives the package&apos;s Store / Apps&amp;features logo and all tile assets. When false, install4j&apos;s standard icon is used.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="packageIconImageFile" type="filePath" default="">
          <xs:annotation><xs:documentation>Single high-resolution PNG used for the package-level Properties/Logo and as the source for every generated tile. Recommended 310×310 (matches the largest Windows tile size) or 620×620 for Retina-grade downscaling.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customizeAppInstallerBackgroundColor" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, ships an MSIXAppInstallerData.xml customization that sets the App Installer dialog background to appInstallerBackgroundColor.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="appInstallerBackgroundColor" type="xs:string" default="#1F1F1F">
          <xs:annotation><xs:documentation>Hex color (#RRGGBB) for the App Installer dialog background, written into &lt;UX BackgroundColor=...&gt; in MSIXAppInstallerData.xml. Used only when customizeAppInstallerBackgroundColor is true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MsixAssociationConfigType" abstract="true">
    <xs:attribute name="launcherId" type="xs:string" use="required">
      <xs:annotation><xs:documentation>Id of the launcher that handles this association.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="MsixFileAssociationConfigType">
    <xs:complexContent>
      <xs:extension base="MsixAssociationConfigType">
        <xs:sequence>
          <xs:element name="iconImageFiles" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>PNG image files used as the source for this association&apos;s per-tile icon. Only consulted when customizeIcon is true.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:sequence>
                <xs:element name="file" minOccurs="0" maxOccurs="unbounded">
                  <xs:complexType>
                    <xs:attribute name="path" type="filePath"/>
                  </xs:complexType>
                </xs:element>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="extension" type="xs:string" use="required">
          <xs:annotation><xs:documentation>File extension without leading dot. Multiple extensions can be separated with commas.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string" use="required">
          <xs:annotation><xs:documentation>Human-readable type description. May contain i18n variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mimeType" type="xs:string" default="">
          <xs:annotation><xs:documentation>MIME content type, e.g. &quot;application/x-foo&quot;.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="additionalParameters" type="xs:string" default="">
          <xs:annotation><xs:documentation>Extra command-line arguments passed before the file path when the launcher is invoked via this association. The file path is appended automatically as a quoted argument.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="openIsSafe" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, marks the file type as safe to open without a SmartScreen prompt.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="customizeIcon" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, iconImageFiles drives the per-association tile icon; when false, the launcher&apos;s icon is used.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MsixUrlHandlerConfigType">
    <xs:complexContent>
      <xs:extension base="MsixAssociationConfigType">
        <xs:attribute name="urlPattern" type="xs:string" use="required">
          <xs:annotation><xs:documentation>URL pattern this launcher handles. Two modes: a URL scheme like &quot;myapp&quot; registers a custom URL protocol (myapp:// URIs open this launcher); an HTTPS URL like &quot;https://example.com&quot; registers the launcher as the App URI Handler for that host (https://example.com/... URIs open this launcher instead of the browser, provided the host serves /.well-known/windows-app-web-link.json listing this package&apos;s family name).</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LinuxPackageMediaSetConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:sequence>
          <xs:element name="preInstallScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Shell fragment executed by the package manager before installation.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="postInstallScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Shell fragment executed by the package manager after installation.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="preUninstallScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Shell fragment executed by the package manager before uninstallation.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
          <xs:element name="postUninstallScript" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Shell fragment executed by the package manager after uninstallation.</xs:documentation></xs:annotation>
            <xs:complexType>
              <xs:simpleContent>
                <xs:extension base="xs:string"/>
              </xs:simpleContent>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="overwriteNeverAsConfigFiles" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, files marked with overwriteMode=&quot;never&quot; are written as package-manager config files (so user edits survive upgrades).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="dependencies" type="xs:string" default="">
          <xs:annotation><xs:documentation>Comma-separated package dependency expression in the target package manager&apos;s syntax (e.g. &apos;java-21-openjdk, libstdc++&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="replacedPackages" type="xs:string" default="">
          <xs:annotation><xs:documentation>Comma-separated list of packages this package replaces or conflicts with.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="require64BitVm" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer refuses to run on 32-bit Unix/Linux JREs.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="setupType" type="PackageSetupTypeEnum" default="default">
          <xs:annotation><xs:documentation>How the install4j installer integrates with the package manager&apos;s lifecycle.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="postInstallAppId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the installer application invoked from the post-install script when setupType=&quot;apps&quot;.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="preUninstallAppId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the installer application invoked from the pre-uninstall script.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LinuxRPMMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="LinuxPackageMediaSetConfigType">
        <xs:attribute name="os" type="xs:string" default="linux">
          <xs:annotation><xs:documentation>Operating-system tag written into the RPM header (typically &apos;linux&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="arch" type="xs:string" default="i386">
          <xs:annotation><xs:documentation>Target architecture written into the RPM header (&apos;x86_64&apos;, &apos;aarch64&apos;, &apos;noarch&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="WindowsMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseGUIMediaSetConfigType">
        <xs:attribute name="verifyIntegrity" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the installer verifies the embedded archive integrity at startup before extracting any files.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="msi" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, an .msi installer is generated instead of a self-extracting .exe.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="msiScope" type="MsiScopeEnum" default="perMachine">
          <xs:annotation><xs:documentation>Installation scope of the generated MSI (per-machine writes to HKLM for all users; per-user writes to HKCU).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="msiProductIdType" type="MsiProductIdTypeEnum" default="build">
          <xs:annotation><xs:documentation>How the MSI ProductId is generated.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="msiCustomProductId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Fixed MSI ProductId GUID; used when msiProductIdType=&quot;custom&quot;.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="architecture" type="WindowsArchitectureEnum">
          <xs:annotation><xs:documentation>Target CPU architecture for the produced Windows installer or archive. Selects which JRE flavor is bundled.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="UnixArchiveMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:attribute name="require64BitVm" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer refuses to run on 32-bit Unix/Linux JREs.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="CompilerVariableOverrideConfigType">
    <xs:complexContent>
      <xs:extension base="SingleVariableConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LinuxDebMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="LinuxPackageMediaSetConfigType">
        <xs:attribute name="bzip" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the data archive inside the .deb is bzip2-compressed; otherwise gzip is used.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="description" type="xs:string" default="">
          <xs:annotation><xs:documentation>Long description written into the .deb control file. Plain text.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="maintainerEmail" type="xs:string" default="">
          <xs:annotation><xs:documentation>Maintainer email written into the .deb control file (typically &apos;Name &lt;email@example.com&gt;&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="architectureSet" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the configured architecture is written to the .deb control file. When false, &apos;all&apos; is used.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="architecture" type="xs:string" default="">
          <xs:annotation><xs:documentation>Debian architecture string (&apos;amd64&apos;, &apos;arm64&apos;, &apos;i386&apos;). Used when architectureSet=true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="UnixGUIMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseGUIMediaSetConfigType">
        <xs:attribute name="require64BitVm" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the installer refuses to run on 32-bit Unix/Linux JREs.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BaseMacosMediaSetConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="BaseGUIMediaSetConfigType">
        <xs:sequence>
          <xs:element name="topLevelFiles" type="TopLevelFilesConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Files, symlinks, extracted archives, and icon-location markers placed at the top level of the DMG/folder alongside the .app bundle. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="installerName" type="xs:string" default="${i18n:InstallerName(${compiler:sys.fullName})}">
          <xs:annotation><xs:documentation>Display name of the installer .app bundle (without the .app suffix). May contain compiler and i18n variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="volumeName" type="xs:string" default="${compiler:sys.shortName}">
          <xs:annotation><xs:documentation>Name shown for the mounted DMG volume in Finder. May contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="architecture" type="MacosArchitectureEnum">
          <xs:annotation><xs:documentation>Target CPU architecture for the produced macOS bundle. Selects which JRE flavor is bundled.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="dmgStylingMode" type="DmgStylingModeEnum" default="default">
          <xs:annotation><xs:documentation>How the mounted DMG window is styled.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useBackgroundImage" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, backgroundImageFile is shown as the DMG window background.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="backgroundImageFile" type="xs:string" default="">
          <xs:annotation><xs:documentation>Path to the DMG window background image (typically a 600x400 .png or .tiff). Effective when useBackgroundImage=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="bundleX" type="xs:int" default="100">
          <xs:annotation><xs:documentation>X coordinate of the application bundle&apos;s icon inside the DMG window, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="bundleY" type="xs:int" default="100">
          <xs:annotation><xs:documentation>Y coordinate of the application bundle&apos;s icon inside the DMG window, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowX" type="xs:int" default="100">
          <xs:annotation><xs:documentation>X coordinate of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowY" type="xs:int" default="100">
          <xs:annotation><xs:documentation>Y coordinate of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowWidth" type="xs:int" default="600">
          <xs:annotation><xs:documentation>Width of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowHeight" type="xs:int" default="400">
          <xs:annotation><xs:documentation>Height of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconSize" type="xs:int" default="128">
          <xs:annotation><xs:documentation>Icon size used for items in the DMG window, in pixels (e.g. 64, 96, 128).</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="compressDmg" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the resulting DMG is created with hdiutil compression (UDBZ); off uses UDZO. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MacosFolderMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMacosMediaSetConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="BaseMacosArchiveMediaSetConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="BaseMediaSetConfigType">
        <xs:sequence>
          <xs:element name="topLevelFiles" type="TopLevelFilesConfigType" minOccurs="0" maxOccurs="1">
            <xs:annotation><xs:documentation>Files, symlinks, extracted archives, and icon-location markers placed at the top level of the DMG/folder alongside the .app bundle. → doc/concepts/mediaFiles.md (macOS)</xs:documentation></xs:annotation>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="archiveType" type="ArchiveTypeEnum" default="dmg">
          <xs:annotation><xs:documentation>Output container format. DMG produces a styled disk image, TGZ a tarball, PKG an Apple Installer package, APPSTORE a signed package for App Store submission. → doc/concepts/codeSigning.md</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="provisioningProfile" type="xs:string" default="">
          <xs:annotation><xs:documentation>Path to a .provisionprofile embedded into the bundle. Required for App Store and certain notarized builds.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="volumeName" type="xs:string" default="${compiler:sys.shortName}">
          <xs:annotation><xs:documentation>Name shown for the mounted DMG volume in Finder. May contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="architecture" type="MacosArchitectureEnum">
          <xs:annotation><xs:documentation>Target CPU architecture for the produced macOS bundle. Selects which JRE flavor is bundled.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="dmgStylingMode" type="DmgStylingModeEnum" default="default">
          <xs:annotation><xs:documentation>How the mounted DMG window is styled.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useBackgroundImage" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, backgroundImageFile is shown as the DMG window background.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="backgroundImageFile" type="xs:string" default="">
          <xs:annotation><xs:documentation>Path to the DMG window background image (typically a 600x400 .png or .tiff). Effective when useBackgroundImage=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="bundleX" type="xs:int" default="100">
          <xs:annotation><xs:documentation>X coordinate of the application bundle&apos;s icon inside the DMG window, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="bundleY" type="xs:int" default="100">
          <xs:annotation><xs:documentation>Y coordinate of the application bundle&apos;s icon inside the DMG window, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowX" type="xs:int" default="100">
          <xs:annotation><xs:documentation>X coordinate of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowY" type="xs:int" default="100">
          <xs:annotation><xs:documentation>Y coordinate of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowWidth" type="xs:int" default="600">
          <xs:annotation><xs:documentation>Width of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="windowHeight" type="xs:int" default="400">
          <xs:annotation><xs:documentation>Height of the DMG window when first opened, in pixels.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconSize" type="xs:int" default="128">
          <xs:annotation><xs:documentation>Icon size used for items in the DMG window, in pixels (e.g. 64, 96, 128).</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AbstractTopLevelIconLocationEntryType">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="useIconLocation" type="xs:boolean">
          <xs:annotation><xs:documentation>When true, the icon for this entry is positioned at (iconX, iconY) inside the DMG window.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconX" type="xs:int" default="0">
          <xs:annotation><xs:documentation>X coordinate of this entry&apos;s icon in the DMG window, in pixels. Effective when useIconLocation=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconY" type="xs:int" default="0">
          <xs:annotation><xs:documentation>Y coordinate of this entry&apos;s icon in the DMG window, in pixels. Effective when useIconLocation=true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="AbstractTopLevelFileEntryType">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="file" type="filePath" use="required">
          <xs:annotation><xs:documentation>Source file path on the build host. May contain compiler variables.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MacosBundleArchiveMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMacosArchiveMediaSetConfigType">
        <xs:sequence>
          <xs:element name="serviceManagement" minOccurs="0" maxOccurs="1">
            <xs:complexType>
              <xs:sequence>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                  <xs:element name="daemon" type="ServiceManagementEntry.DaemonEntryType">
                    <xs:annotation><xs:documentation>Registers a launchd daemon (system-wide background service) shipped inside the bundle.</xs:documentation></xs:annotation>
                  </xs:element>
                  <xs:element name="agent" type="ServiceManagementEntry.AgentEntryType">
                    <xs:annotation><xs:documentation>Registers a launchd agent (per-user background service) shipped inside the bundle.</xs:documentation></xs:annotation>
                  </xs:element>
                </xs:choice>
              </xs:sequence>
            </xs:complexType>
          </xs:element>
        </xs:sequence>
        <xs:attribute name="launcherId" type="xs:string" default=""/>
        <xs:attribute name="executeSetupApp" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the launcher invokes a setup application on first start instead of the regular launcher payload.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="setupAppId" type="xs:string" default="">
          <xs:annotation><xs:documentation>Id of the installer application launched as setup; effective when executeSetupApp=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="setupLaunchInNewProcess" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the setup application runs in a separate process detached from the launcher.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TopLevelSymlinkEntryType">
    <xs:complexContent>
      <xs:extension base="AbstractTopLevelIconLocationEntryType">
        <xs:attribute name="target" type="xs:string" use="required">
          <xs:annotation><xs:documentation>Target path of the symbolic link (e.g. &apos;/Applications&apos;).</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TopLevelFilesConfigType">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="iconLocation" type="AbstractTopLevelIconLocationEntryType">
          <xs:annotation><xs:documentation>Icon-position marker for an existing top-level item: positions the icon in the DMG window without adding a new file.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="extractedArchive" type="AbstractTopLevelFileEntryType">
          <xs:annotation><xs:documentation>Archive whose contents are extracted at the top level of the DMG/folder rather than placed as a single file.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="symlink" type="TopLevelSymlinkEntryType">
          <xs:annotation><xs:documentation>Symbolic link placed at the top level of the DMG. Commonly used to add an /Applications shortcut so users can drag-and-drop the .app to install.</xs:documentation></xs:annotation>
        </xs:element>
        <xs:element name="file" type="TopLevelFileEntryType">
          <xs:annotation><xs:documentation>Extra file placed at the top level of the DMG/folder. The &apos;name&apos; attribute is the destination filename.</xs:documentation></xs:annotation>
        </xs:element>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ServiceManagementEntryType" abstract="true">
    <xs:attribute name="identifier" type="xs:string" use="required">
      <xs:annotation><xs:documentation>Reverse-DNS identifier registered with launchd; matches the Label key in the generated plist.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="executable" type="xs:string" use="required">
      <xs:annotation><xs:documentation>Path inside the bundle to the executable that launchd should start (relative to the bundle root).</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ServiceManagementEntry.DaemonEntryType">
    <xs:complexContent>
      <xs:extension base="ServiceManagementEntryType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ServiceManagementEntry.AgentEntryType">
    <xs:complexContent>
      <xs:extension base="ServiceManagementEntryType">
        <xs:attribute name="arguments" type="xs:string" default="">
          <xs:annotation><xs:documentation>Command-line arguments passed to the agent executable; written into the launchd plist.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="hide" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the agent is hidden from the macOS Login Items UI; corresponds to LSUIElement in the bundle.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TopLevelFileEntryType">
    <xs:complexContent>
      <xs:extension base="AbstractTopLevelFileEntryType">
        <xs:attribute name="overrideMode" type="xs:boolean" default="false">
          <xs:annotation><xs:documentation>When true, the entry&apos;s mode replaces the file&apos;s permissions; otherwise the project default applies.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="mode" type="xs:string" default="644">
          <xs:annotation><xs:documentation>Octal Unix permission mode for this file (e.g. &apos;755&apos;). Effective when overrideMode=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="useIconLocation" type="xs:boolean">
          <xs:annotation><xs:documentation>When true, the icon for this entry is positioned at (iconX, iconY) inside the DMG window.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconX" type="xs:int" default="0">
          <xs:annotation><xs:documentation>X coordinate of this entry&apos;s icon in the DMG window, in pixels. Effective when useIconLocation=true.</xs:documentation></xs:annotation>
        </xs:attribute>
        <xs:attribute name="iconY" type="xs:int" default="0">
          <xs:annotation><xs:documentation>Y coordinate of this entry&apos;s icon in the DMG window, in pixels. Effective when useIconLocation=true.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="MacosFolderArchiveMediaSetConfigType">
    <xs:complexContent>
      <xs:extension base="BaseMacosArchiveMediaSetConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="FilesConfigType">
    <xs:sequence>
      <xs:element name="filesets" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="fileset" type="NameAndCustomizableIdConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>A named subset of files that can be installed independently. Components reference filesets to form selectable feature groups. → doc/concepts/files.md (Filesets and components)</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="roots" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="root" type="RootConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>Distribution tree root: a directory on disk whose contents are placed under the install destination. Multiple roots can be merged into a single tree. → doc/concepts/files.md (Distribution tree)</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="mountPoints" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="mountPoint" type="MountPointConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>Named anchor point under a &lt;root&gt;. File entries reference a mount point by id, so the install destination can be remapped without editing every entry. → doc/concepts/files.md (Distribution tree)</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="entries" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="fileEntry" type="BaseEntryConfigType">
                <xs:annotation><xs:documentation>Distribution tree entry for an individual file. → doc/concepts/files.md (Distribution tree)</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="dirEntry" type="DirEntryConfigType">
                <xs:annotation><xs:documentation>Distribution tree entry that pulls a directory (or specific files inside it) from the build host into the install. → doc/concepts/files.md (Distribution tree)</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="variableEntry" type="VariableEntryConfigType">
                <xs:annotation><xs:documentation>Distribution tree entry whose contents are taken from a compiler variable that resolves to one or more file paths. → doc/concepts/files.md (Distribution tree)</xs:documentation></xs:annotation>
              </xs:element>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
      <xs:element name="components" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:choice minOccurs="0" maxOccurs="unbounded">
              <xs:element name="component" type="ComponentConfigType">
                <xs:annotation><xs:documentation>A user-selectable installable component built from one or more filesets. Users pick components on the component selection screen. → doc/concepts/files.md (Filesets and components)</xs:documentation></xs:annotation>
              </xs:element>
              <xs:element name="folder" type="ComponentFolderConfigType">
                <xs:annotation><xs:documentation>Grouping folder in the component tree shown on the component selection screen. → doc/concepts/files.md (Filesets and components)</xs:documentation></xs:annotation>
              </xs:element>
            </xs:choice>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="keepModificationTimes" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, modification timestamps from the source files are preserved on installation.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="missingFilesStrategy" type="MissingFilesStrategyEnum" default="warn">
      <xs:annotation><xs:documentation>How the build reacts to source files declared in the project that aren&apos;t present on disk. → doc/concepts/files.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="globalExcludeSuffixes" type="xs:string" default="">
      <xs:annotation><xs:documentation>Comma-separated suffixes (e.g. &quot;.bak,.tmp&quot;) excluded from every directory and scan-directory entry. → doc/concepts/files.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultOverwriteMode" type="OverwriteModeEnum" default="alwaysAskExceptForUpdate">
      <xs:annotation><xs:documentation>Default overwrite policy when an installed file already exists. Per-entry settings can override.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultUninstallMode" type="UninstallModeEnum" default="ifCreated">
      <xs:annotation><xs:documentation>Default uninstall policy. Per-entry settings can override.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="launcherOverwriteMode" type="OverwriteModeEnum" default="ifNewerOtherwiseAsk">
      <xs:annotation><xs:documentation>Overwrite policy for launcher executables specifically; allows a different default than defaultOverwriteMode.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultFileMode" type="xs:string" default="644">
      <xs:annotation><xs:documentation>Default Unix file-mode bits in octal (e.g. &quot;644&quot;). Per-entry settings can override.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="defaultDirMode" type="xs:string" default="755">
      <xs:annotation><xs:documentation>Default Unix directory-mode bits in octal (e.g. &quot;755&quot;).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="preserveSymlinks" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, symbolic links from the source tree are preserved as symlinks in the installer payload. Unix/macOS only.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="preserveMode" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, the source file&apos;s executable bit is preserved on installation. Unix/macOS only.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:simpleType name="ArtifactModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="classpath"/>
      <xs:enumeration value="module"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="RedirectionModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="overwrite"/>
      <xs:enumeration value="append"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ExecutableModeEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="gui"/>
      <xs:enumeration value="console"/>
      <xs:enumeration value="service"/>
      <xs:enumeration value="installer"/>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="ExecutionLevelEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="asInvoker">
        <xs:annotation><xs:documentation>Windows manifest: inherits the invoking process&apos;s privileges (Administrators get a filtered token).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="highestAvailable">
        <xs:annotation><xs:documentation>Windows manifest: requests the highest privileges available to the user (Administrator if available, else standard).</xs:documentation></xs:annotation>
      </xs:enumeration>
      <xs:enumeration value="requireAdministrator">
        <xs:annotation><xs:documentation>Windows manifest: requires Administrator privileges; UAC prompts for credentials if the user is non-admin.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:simpleType name="DpiAwarenessEnum">
    <xs:restriction base="xs:string">
      <xs:enumeration value="true"/>
      <xs:enumeration value="false"/>
      <xs:enumeration value="java9+">
        <xs:annotation><xs:documentation>DPI-aware only when the project&apos;s minimum Java version is 9+; older JREs run as DPI-unaware.</xs:documentation></xs:annotation>
      </xs:enumeration>
    </xs:restriction>
  </xs:simpleType>
  <xs:complexType name="ApplicationConfigType" abstract="true">
    <xs:attribute name="name" type="xs:string" default="">
      <xs:annotation><xs:documentation>Application display name; used as the project&apos;s title and as a default in many derived strings (window title, registry keys, package metadata).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="distributionSourceDir" type="filePath" default="">
      <xs:annotation><xs:documentation>Source root directory; classpath entries, file trees, icon paths and similar relative paths resolve against this. → doc/concepts/files.md</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="NameConfigType" abstract="true">
    <xs:attribute name="name" type="xs:string" default="">
      <xs:annotation><xs:documentation>Human-readable name shown in the install4j IDE. Free-form, may contain spaces.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="LanguagesConfigType" abstract="true">
    <xs:sequence>
      <xs:element name="principalLanguage" type="SingleLanguageConfigType" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfigType" abstract="true">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="scanDirectory" type="ArtifactPathConfig.ScanDirectoryConfigType"/>
        <xs:element name="directory" type="ArtifactPathConfig.DirectoryConfigType"/>
        <xs:element name="archive" type="ArtifactPathConfig.ArchiveConfigType"/>
        <xs:element name="envVar" type="ArtifactPathConfig.EnvVarConfigType"/>
        <xs:element name="variable" type="ArtifactPathConfig.VariableConfigType"/>
      </xs:choice>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ModulePathConfigType">
    <xs:complexContent>
      <xs:extension base="ArtifactPathConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ClassPathConfigType">
    <xs:complexContent>
      <xs:extension base="ArtifactPathConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="LocationConfigType" abstract="true">
    <xs:attribute name="location" type="filePath" default="">
      <xs:annotation><xs:documentation>Filesystem path to this entry. May contain a single &apos;*&apos; wildcard in the file-name part for version-glob matching (the shortest match wins). Resolved relative to distributionSourceDir.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ClasspathLocationConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="LocationConfigType">
        <xs:attribute name="failOnError" type="xs:boolean" default="true">
          <xs:annotation><xs:documentation>When true, the launcher aborts if this entry can&apos;t be found at runtime. When false, missing entries are silently skipped.</xs:documentation></xs:annotation>
        </xs:attribute>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="TextLineConfigType">
    <xs:attribute name="x" type="xs:int" default="20">
      <xs:annotation><xs:documentation>Pixel offset from the left edge of the splash bitmap.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="y" type="xs:int" default="0">
      <xs:annotation><xs:documentation>Pixel offset from the top of the splash bitmap.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="text" type="xs:string" default=""/>
    <xs:attribute name="fontSize" type="xs:int" default="8"/>
    <xs:attribute name="fontColor" type="xs:string" default="0,0,0">
      <xs:annotation><xs:documentation>RGB color in &quot;r,g,b&quot; form (each component 0 to 255).</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="bold" type="xs:boolean" default="false"/>
  </xs:complexType>
  <xs:complexType name="NativeLibConfigType">
    <xs:sequence>
      <xs:element name="directory" minOccurs="0" maxOccurs="unbounded">
        <xs:complexType>
          <xs:attribute name="name" type="filePath"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.ScanDirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="ClasspathLocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.DirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="ClasspathLocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.ArchiveConfigType">
    <xs:complexContent>
      <xs:extension base="ClasspathLocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.ReferenceConfigType" abstract="true">
    <xs:complexContent>
      <xs:extension base="NameConfigType">
        <xs:attribute name="failOnError" type="xs:boolean" default="true"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.EnvVarConfigType">
    <xs:complexContent>
      <xs:extension base="ArtifactPathConfig.ReferenceConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="ArtifactPathConfig.VariableConfigType">
    <xs:complexContent>
      <xs:extension base="ArtifactPathConfig.ReferenceConfigType">
        <xs:attribute name="separator" type="xs:string" default="${compiler:sys.pathlistSeparator}"/>
        <xs:attribute name="useRelativePrefix" type="xs:boolean" default="false"/>
        <xs:attribute name="relativePrefix" type="xs:string" default=""/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="SearchSequenceConfigType">
    <xs:sequence>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="registry" type="SearchSequenceConfig.RegistryConfigType"/>
        <xs:element name="installations" type="SearchSequenceConfig.InstallationsConfigType"/>
        <xs:element name="directory" type="SearchSequenceConfig.DirectoryConfigType"/>
        <xs:element name="envVar" type="SearchSequenceConfig.EnvVarConfigType"/>
      </xs:choice>
    </xs:sequence>
    <xs:attribute name="empty" type="xs:boolean" default="false"/>
  </xs:complexType>
  <xs:complexType name="SearchSequenceConfig.RegistryConfigType">
  </xs:complexType>
  <xs:complexType name="SearchSequenceConfig.InstallationsConfigType">
  </xs:complexType>
  <xs:complexType name="SearchSequenceConfig.DirectoryConfigType">
    <xs:complexContent>
      <xs:extension base="LocationConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="SearchSequenceConfig.EnvVarConfigType">
    <xs:complexContent>
      <xs:extension base="NameConfigType"/>
    </xs:complexContent>
  </xs:complexType>
  <xs:complexType name="VersionInfoConfigType">
    <xs:attribute name="include" type="xs:boolean" default="false"/>
    <xs:attribute name="fileVersion" type="xs:string" default=""/>
    <xs:attribute name="fileDescription" type="xs:string" default=""/>
    <xs:attribute name="legalCopyright" type="xs:string" default=""/>
    <xs:attribute name="internalName" type="xs:string" default=""/>
    <xs:attribute name="productName" type="xs:string" default=""/>
    <xs:attribute name="companyName" type="xs:string" default=""/>
    <xs:attribute name="productVersion" type="xs:string" default=""/>
  </xs:complexType>
  <xs:complexType name="SingleLanguageConfigType">
    <xs:attribute name="id" type="xs:string">
      <xs:annotation><xs:documentation>ISO language code (e.g. &apos;en&apos;, &apos;de&apos;, &apos;fr&apos;) of this language entry.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="customLocalizationFile" type="filePath" default="">
      <xs:annotation><xs:documentation>Path to a custom .properties resource bundle that overrides built-in translations for this language. → doc/concepts/launchers.md (i18n)</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ScriptConfigType">
    <xs:annotation><xs:documentation>An element with text content holding a Java code fragment. Used for staticMembers (top-level code accessible from all script properties), and runtime-evaluated scripts attached to actions, screens, and form components.</xs:documentation></xs:annotation>
    <xs:simpleContent>
      <xs:extension base="xs:string"/>
    </xs:simpleContent>
  </xs:complexType>
  <xs:complexType name="OptionConfigType">
    <xs:attribute name="version" type="xs:string">
      <xs:annotation><xs:documentation>Java-version constraint for this option line (e.g. &quot;17+&quot;, &quot;9-21&quot;); empty means apply for all versions.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="line" type="xs:string"/>
  </xs:complexType>
  <xs:complexType name="BaseConfigType" abstract="true">
    <xs:sequence>
      <xs:element name="directoryPresets" type="BaseDirectoryPresetsType" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="version" type="xs:string">
      <xs:annotation><xs:documentation>project file format version. Written by the IDE; used to apply XSLT migrations when an older project is opened with a newer install4j.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="transformSequenceNumber" type="xs:int">
      <xs:annotation><xs:documentation>Internal counter that tracks which migration transforms have already been applied to this file. Managed by install4j; don&apos;t edit manually.</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="BaseDirectoryPresetsType">
    <xs:attribute name="config" type="filePath" default=""/>
  </xs:complexType>
  <xs:complexType name="SplashScreenConfigType">
    <xs:sequence>
      <xs:element name="text" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="statusLine" type="TextLineConfigType" minOccurs="0" maxOccurs="1"/>
            <xs:element name="versionLine" type="TextLineConfigType" minOccurs="0" maxOccurs="1"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="show" type="xs:boolean" default="false"/>
    <xs:attribute name="width" type="xs:int" default="0"/>
    <xs:attribute name="height" type="xs:int" default="0"/>
    <xs:attribute name="bitmapFile" type="filePath" default=""/>
    <xs:attribute name="textOverlay" type="xs:boolean" default="false"/>
  </xs:complexType>
  <xs:complexType name="JavaConfigType">
    <xs:sequence>
      <xs:element name="searchSequence" type="SearchSequenceConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="classPath" type="ClassPathConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="modulePath" type="ModulePathConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="nativeLibraryDirectories" type="NativeLibConfigType" minOccurs="0" maxOccurs="1"/>
      <xs:element name="vmOptions" minOccurs="0" maxOccurs="1">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="options" type="OptionConfigType" minOccurs="0" maxOccurs="unbounded">
              <xs:annotation><xs:documentation>One line in the JVM options file produced for this launcher.</xs:documentation></xs:annotation>
            </xs:element>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
    <xs:attribute name="mainClass" type="xs:string" default="">
      <xs:annotation><xs:documentation>Fully-qualified main class. When mainMode=&quot;module&quot;, use &quot;moduleName/className&quot; form.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="mainMode" type="ArtifactModeEnum" default="classpath">
      <xs:annotation><xs:documentation>Whether mainClass is invoked from the classpath or the module path. → doc/concepts/launchers.md (Java invocation)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="vmParameters" type="xs:string" default="">
      <xs:annotation><xs:documentation>Space-separated VM args passed at launch. → doc/concepts/launchers.md (VM parameters)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="arguments" type="xs:string" default="">
      <xs:annotation><xs:documentation>Default arguments forwarded to mainClass; the user can append/override via the command line.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="allowVMPassthroughParameters" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, args of the form -J... on the launcher&apos;s command line are forwarded to the JVM. → doc/concepts/launchers.md (VM parameters)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="preferredVM" type="xs:string" default="">
      <xs:annotation><xs:documentation>Path to a preferred JRE; tried first before search-sequence locations.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="bundleRuntime" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, the JRE bundle configured for the project is included with this launcher. When false, the launcher relies on a JRE found via the search sequence. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="minVersion" type="xs:string" default="">
      <xs:annotation><xs:documentation>Minimum JRE version for this launcher (e.g. &quot;17&quot;). Empty means no lower bound; the project-level javaMinVersion still applies. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="maxVersion" type="xs:string" default="">
      <xs:annotation><xs:documentation>Maximum JRE version for this launcher. Empty means no upper bound. → doc/concepts/jreBundles.md</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="allowBetaVM" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>Allow non-GA (early-access) builds when matching JREs.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="jdkOnly" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>Restrict matching to JDKs (skip plain JREs).</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="ExecutableConfigType">
    <xs:sequence>
      <xs:element name="versionInfo" type="VersionInfoConfigType" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
    <xs:attribute name="name" type="xs:string" default="">
      <xs:annotation><xs:documentation>Filename (without extension) of the generated launcher executable. Empty falls back to the launcher&apos;s name.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconSet" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, the executable&apos;s icon comes from `iconFile`; when false, the platform default icon is used.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="iconFile" type="filePath" default="">
      <xs:annotation><xs:documentation>Path (relative to distributionSourceDir) to a Windows .ico file used as the executable&apos;s icon. Ignored when iconSet is false.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="executableDir" type="filePath" default="">
      <xs:annotation><xs:documentation>Directory the executable is placed in, relative to distributionSourceDir.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="redirectStderr" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, stderr from the JVM is captured into stderrFile instead of inheriting the parent console. → doc/concepts/launchers.md (Redirection)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="stderrFile" type="filePath" default="error.log">
      <xs:annotation><xs:documentation>Path of the file stderr is written to when redirectStderr=true. Resolved relative to the launcher&apos;s working directory.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="stderrMode" type="RedirectionModeEnum" default="overwrite">
      <xs:annotation><xs:documentation>Whether stderrFile is overwritten or appended on each launch.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="redirectStdout" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, stdout from the JVM is captured into stdoutFile instead of inheriting the parent console.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="stdoutFile" type="filePath" default="output.log">
      <xs:annotation><xs:documentation>Path of the file stdout is written to when redirectStdout=true. Resolved relative to the launcher&apos;s working directory.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="stdoutMode" type="RedirectionModeEnum" default="overwrite">
      <xs:annotation><xs:documentation>Whether stdoutFile is overwritten or appended on each launch.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="failOnStderrOutput" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, the launcher exits with a non-zero code if anything is written to stderr. Only meaningful when redirectStderr is true.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="executableMode" type="ExecutableModeEnum">
      <xs:annotation><xs:documentation>Launcher type: `gui` (GUI app), `console` (console app), `service` (Windows service), `installer` (installer-bundled). → doc/concepts/launchers.md (Executable types)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="changeWorkingDirectory" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, the launcher&apos;s working directory is changed to `workingDirectory` before the JVM starts.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="workingDirectory" type="filePath" default=".">
      <xs:annotation><xs:documentation>Working directory the launcher chdir&apos;s to before invoking the JVM. Path is resolved relative to the launcher binary&apos;s directory; &quot;.&quot; means the launcher&apos;s own directory.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="singleInstance" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>Reject a second launch when an instance is already running for the current user. Mutually overridable with globalSingleInstance / windowsSessionSingleInstance.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="executionLevel" type="ExecutionLevelEnum" default="asInvoker">
      <xs:annotation><xs:documentation>Privilege level requested via the Windows manifest at launch.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="checkConsoleParameter" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, GUI executables accept a -console argument that attaches the launcher to the parent console. Only meaningful when executableMode=&quot;gui&quot;. → doc/concepts/launchers.md (Executable types) (GUI application)</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="globalSingleInstance" type="xs:boolean" default="false">
      <xs:annotation><xs:documentation>When true, singleInstance is enforced across all users on the machine, not just per user.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="windowsSessionSingleInstance" type="xs:boolean" default="true">
      <xs:annotation><xs:documentation>When true, the singleInstance check is scoped to the current Windows session.</xs:documentation></xs:annotation>
    </xs:attribute>
    <xs:attribute name="dpiAware" type="DpiAwarenessEnum" default="java9+">
      <xs:annotation><xs:documentation>Windows DPI awareness setting written into the manifest. → doc/concepts/launchers.md (DPI awareness)</xs:documentation></xs:annotation>
    </xs:attribute>
  </xs:complexType>
  <xs:complexType name="SerializedBeanType">
    <xs:sequence>
      <xs:element name="property" type="BeanPropertyType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>

  <xs:simpleType name="BeanArrayElementTypeEnum">
    <xs:annotation>
      <xs:documentation>
        Element type of a typed array: one of the eight Java primitives or "string".
      </xs:documentation>
    </xs:annotation>
    <xs:restriction base="xs:string">
      <xs:enumeration value="boolean"/>
      <xs:enumeration value="byte"/>
      <xs:enumeration value="char"/>
      <xs:enumeration value="short"/>
      <xs:enumeration value="int"/>
      <xs:enumeration value="long"/>
      <xs:enumeration value="float"/>
      <xs:enumeration value="double"/>
      <xs:enumeration value="string"/>
    </xs:restriction>
  </xs:simpleType>

  <xs:simpleType name="BeanValueTypeEnum">
    <xs:annotation>
      <xs:documentation><![CDATA[
        Value of @type on a value-carrying element (<property>, <add>, <element>).
        Extends BeanArrayElementTypeEnum with "enum", "null", "array".
      ]]></xs:documentation>
    </xs:annotation>
    <xs:union memberTypes="BeanArrayElementTypeEnum">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:enumeration value="enum"/>
          <xs:enumeration value="null"/>
          <xs:enumeration value="array"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:union>
  </xs:simpleType>

  <xs:attributeGroup name="BeanValueAttrs">
    <xs:annotation>
      <xs:documentation><![CDATA[
        Attributes shared by value-carrying elements (<property>, <add>).
        Valid combinations depend on the form; see PropertyType.
      ]]></xs:documentation>
    </xs:annotation>
    <xs:attribute name="id" type="xs:string"/>
    <xs:attribute name="type" type="BeanValueTypeEnum"/>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
    <xs:attribute name="elementType" type="BeanArrayElementTypeEnum"/>
    <xs:attribute name="length" type="xs:nonNegativeInteger"/>
  </xs:attributeGroup>

  <xs:group name="BeanValueElements">
    <xs:annotation>
      <xs:documentation><![CDATA[
        Typed value elements that may appear as constructor arguments of an
        <object> or as the key/value children of an <entry>.
      ]]></xs:documentation>
    </xs:annotation>
    <xs:choice>
      <xs:element name="string" type="xs:string"/>
      <xs:element name="boolean" type="xs:boolean"/>
      <xs:element name="byte" type="xs:byte"/>
      <xs:element name="char" type="xs:string"/>
      <xs:element name="short" type="xs:short"/>
      <xs:element name="int" type="xs:int"/>
      <xs:element name="long" type="xs:long"/>
      <xs:element name="float" type="xs:float"/>
      <xs:element name="double" type="xs:double"/>
      <xs:element name="object" type="BeanObjectType"/>
      <xs:element name="null">
        <xs:complexType/>
      </xs:element>
      <xs:element name="array" type="BeanArrayType"/>
    </xs:choice>
  </xs:group>

  <xs:complexType name="BeanPropertyType" mixed="true">
    <xs:annotation>
      <xs:documentation><![CDATA[
        Encoded JavaBean property or collection mutation. Takes one of the forms below.
        XSD 1.0 cannot express the alternative type rules, so they are stated here as prose.

        Primitive value: @type is one of boolean, byte, char, short, int,
        long, float, double. The scalar is contained in @value; the element has no
        children.
            <property name="enabled" type="boolean" value="true"/>

        String value: @type="string"; the string is the element's text
        content, no children.
            <property name="label" type="string">Click next</property>

        Enum value: @type="enum" with @class (enum class) and @value (constant
        name). No children, no text.
            <property name="style" type="enum" class="com.foo.Style" value="BOLD"/>

        Null value: @type="null". No other attributes, no children, no text.
            <property name="icon" type="null"/>

        Array value: @type="array" with @length and exactly one of
        @elementType (primitive / string arrays) or @class (object arrays).
        Content is a sequence of <element> children.
            <property name="tags" type="array" elementType="string" length="2">
                <element index="0">a</element>
                <element index="1">b</element>
            </property>

        Object value: no @type; the content is a single <object> child that
        constructs the property's value.
            <property name="target">
                <object class="java.io.File"><string>.</string></object>
            </property>

        Mutation: no @type; the content is a sequence of <property>, <add>,
        and/or <entry> children that apply setter calls or collection/map
        mutations to the property's existing value (the property itself is not
        re-assigned).
            <property name="coupledComponentIds">
                <add type="string">1572</add>
            </property>
      ]]></xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="property" type="BeanPropertyType"/>
      <xs:element name="object" type="BeanObjectType"/>
      <xs:element name="add" type="BeanAddType"/>
      <xs:element name="entry" type="BeanEntryType"/>
      <xs:element name="element" type="BeanElementType"/>
      <xs:element name="void" type="BeanVoidType"/>
    </xs:choice>
    <xs:attribute name="name" type="xs:NCName" use="required"/>
    <xs:attributeGroup ref="BeanValueAttrs"/>
  </xs:complexType>

  <xs:complexType name="BeanVoidType">
    <xs:annotation>
      <xs:documentation>
        Legacy XMLEncoder back-reference declaration. Carries an @id that later
        @idref attributes resolve to. Has no constructor argument, it just labels
        a property of the enclosing object/property as referencable.
      </xs:documentation>
    </xs:annotation>
    <xs:attribute name="id" type="xs:string"/>
    <xs:attribute name="property" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="BeanObjectType">
    <xs:annotation>
      <xs:documentation><![CDATA[
        JavaBean or constructor invocation of @class or an @idref pointing at a
        previously-defined <void id="…"> alias. Children are typed value elements
        (constructor arguments) and/or <property> elements (setter calls applied
        after construction). Either @class or @idref must be present.
      ]]></xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="property" type="BeanPropertyType"/>
      <xs:group ref="BeanValueElements"/>
    </xs:choice>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="idref" type="xs:string"/>
    <xs:attribute name="id" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="BeanAddType" mixed="true">
    <xs:annotation>
      <xs:documentation>
        collection.add(value) from a "void method=add" call. Carries the same
        value forms as BeanPropertyType (primitive, string, enum, null, array,
        object) but has no @name and never takes the mutation form.
      </xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element name="object" type="BeanObjectType"/>
      <xs:element name="element" type="BeanElementType"/>
    </xs:choice>
    <xs:attributeGroup ref="BeanValueAttrs"/>
  </xs:complexType>

  <xs:complexType name="BeanEntryType">
    <xs:annotation>
      <xs:documentation>
        map.put(key, value) from a "void method=put" call. Contains exactly two
        child value elements, in order: the key first, then the value.
      </xs:documentation>
    </xs:annotation>
    <xs:group ref="BeanValueElements" minOccurs="2" maxOccurs="2"/>
  </xs:complexType>

  <xs:complexType name="BeanElementType" mixed="true">
    <xs:annotation>
      <xs:documentation><![CDATA[
        One slot of a typed array. For primitive / string arrays (parent supplies
        @elementType), the value is contained in @value or the text content. For object
        arrays (parent supplies @class) the value is a single <object> child.
      ]]></xs:documentation>
    </xs:annotation>
    <xs:choice minOccurs="0">
      <xs:element name="object" type="BeanObjectType"/>
    </xs:choice>
    <xs:attribute name="index" type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="type" type="BeanValueTypeEnum"/>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="value" type="xs:string"/>
  </xs:complexType>

  <xs:complexType name="BeanArrayType">
    <xs:annotation>
      <xs:documentation><![CDATA[
        Literal array element. Only occurs as a constructor argument of an
        <object>. Array-typed properties fold the array content into the
        <property> element itself and do not use this type.
      ]]></xs:documentation>
    </xs:annotation>
    <xs:sequence>
      <xs:element name="element" type="BeanElementType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="class" type="xs:string"/>
    <xs:attribute name="elementType" type="BeanArrayElementTypeEnum"/>
    <xs:attribute name="length" type="xs:nonNegativeInteger" use="required"/>
    <xs:attribute name="id" type="xs:string"/>
  </xs:complexType>
</xs:schema>
