flowchart TD
    %% start und select branch type
    Start([Start:
Deploy-Application.ps1]) --> InitModule([load and unblock modules/
Restart-NXTDeployScript
 for 32bit on 64bit /
 Trigger])
    InitModule --> InitSession([Initialize-ADTModule /
Open-ADTSession
&
loading the package configuration
neo42PackageConfig.json])
    InitSession --> H1
    H1[1:
CustomBegin] --> BranchType{deployment type?}

    %% INSTALL / REPAIR BRANCH
    BranchType -->|Install / Repair| H2
    H2[2:
CustomInstallAndReinstallAndSoftMigrationBegin] --> Dependencies([management of explicitly defined package/application dependencies]) --> CheckSoftMigration{soft migration possible?}
    Dependencies --> |controlled abort/
actions failed| FailureTasks


    %% UNINSTALL BRANCH
    BranchType -->|Uninstall| Uninst_AsKillProcesses([disturbing processes?
user request with a timeout])
    Uninst_AsKillProcesses -->|resume processing no later than after the timeout!| H13
    H14a[14a:
CustomUninstallEndOnError] ----> FailureTasks
    H14[14:
CustomUninstallEnd] --> Uninst_SuccesTasks([conclusion & cleanup tasks /
unregistering]) --> H19
    H13[13:
CustomUninstallBegin] --> Uninstallation([uninstallation task])
    Uninstallation --> |error uninstallation| H14a
    Uninstallation --> |success| H14

    %% USER PART BRANCHES
    BranchType -->|InstallUserPart / TriggerInstallUserPart| H15
    H15[15:
CustomInstallUserPartBegin] --> |success| H16
    H15[15:
CustomInstallUserPartBegin] ---> |error installation - UserPart| FailureTasks
    H16[16:
CustomInstallUserPartEnd] --> |success| H19
    H16[16:
CustomInstallUserPartEnd] ---> |error installation - UserPart| FailureTasks

    BranchType -->|UninstallUserPart / TriggerUninstallUserPart| H17
    H17[17:
CustomUninstallUserPartBegin] --> |success| H18
    H17[17:
CustomUninstallUserPartBegin] ---> |error uninstallation - UserPart| FailureTasks
    H18[18:
CustomUninstallUserPartEnd] --> |success| H19
    H18[18:
CustomUninstallUserPartEnd] ---> |error uninstallation - UserPart| FailureTasks
    
    %% soft migration path
    CheckSoftMigration -->|yes| UnRegisterOldPackages(if necessary:
unregister of old/pre-packages) -->  H3[3:
CustomSoftMigrationBegin] --> H4
    UnRegisterOldPackages ---> |controlled abort/
actions failed| FailureTasks
    
    %% default install / reinstall / upgrade path
    CheckSoftMigration -->|no| CleanUpOldPackages(if necessary:
cleanup/unregister of old/pre-packages) --> Inst_AsKillProcesses{disturbing processes & defer?}
    CleanUpOldPackages --> |controlled abort/
actions failed| FailureTasks
    Inst_AsKillProcesses -->|processing continued| H5
    H5[5:
CustomInstallAndReinstallPreInstallAndReinstall] --> CheckReinstall{installation
or
reinstallation?}
    Inst_AsKillProcesses ---->|processing defered/
aborted| FailureTasks

    %% reinstall path
    CheckReinstall --> |reinstallation/upgrade| CheckProcessMode{Ausführungsmode?
einstufig / zweistufig}
    CheckProcessMode --> |two-stage
reinstall/upgrade| H6
    CheckProcessMode --> |one-stage
upgrade/install/repair| H8
    H6[6:
CustomReinstallPreUninstall] --> UninstOnReinstallation([uninstallation task for reinstallation/upgrade])
    UninstOnReinstallation -->|error in uninstallation task| H7a[7a:
CustomReinstallPostUninstallOnError] ----> FailureTasks
    UninstOnReinstallation -->|success| H7[7:
CustomReinstallPostUninstall] --> H8
    H8[8:
CustomReinstallPreInstall] --> InstOnReinstallation([installation task for reinstallation/upgrade])
    InstOnReinstallation -->|error in installation task| H9a[9a:
CustomReinstallPostInstallOnError] ----> FailureTasks
    InstOnReinstallation -->|success| H9[9:
CustomReinstallPostInstall] --> H12
    H12[12:
CustomInstallAndReinstallEnd] ----> H4
    H4[4:
CustomInstallAndReinstallAndSoftMigrationEnd] --> Inst_SuccessTasks

    %% first installation / upgrade path
    CheckReinstall --> |first installation| H10
    H10[10:
CustomInstallBegin] --> Installation([installation task])
    Installation -->|success| H11[11:
CustomInstallEnd] --> H12
    Installation -->|error installation| H11a[11a:
CustomInstallEndOnError] ----> FailureTasks

    %% exit path (error case)
    ControlledExitOnError([general, controlled, erroneous script termination]) --> H20
    FailureTasks([conclusion & cleanup tasks /
error registering]) ---> H20
    H20[20:
CustomEndOnError] ---> ExitFail([exit error code])

    %% exit path (success case)
    ControlledExitOnSuccess([general, controlled, successful script termination]) --> H19
    Inst_SuccessTasks([conclusion & cleanup tasks /
ActiveSetup /
registering]) --> H19
    H19[19:
CustomEnd] --> ExitSuccess([exit 0 / 3010 reboot])