//# 4 errors, 478 messages
//#
/*
    //#WindowsInstaller.java:1:1: class: com.dmdirc.installer.WindowsInstaller$1
    //#WindowsInstaller.java:1:1: class: com.dmdirc.installer.WindowsInstaller
    //#WindowsInstaller.java:1:1: method: com.dmdirc.installer.WindowsInstaller.com.dmdirc.installer.WindowsInstaller__static_init
 * Copyright (c) 2006-2009 Chris Smith, Shane Mc Cormack, Gregory Holmes
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

package com.dmdirc.installer;

import com.dmdirc.installer.cliparser.CLIParser;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;

/**
 * Installs DMDirc on windows
 *
 * @author Shane Mc Cormack
 */
public class WindowsInstaller extends Installer {
    //#WindowsInstaller.java:36: method: void com.dmdirc.installer.WindowsInstaller.com.dmdirc.installer.WindowsInstaller()
    //#WindowsInstaller.java:36: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.installer.Installer()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void com.dmdirc.installer.WindowsInstaller()
    //#    unanalyzed callee: void com.dmdirc.installer.Installer()
    //#input(void com.dmdirc.installer.WindowsInstaller()): this

    /** {@inheritDoc} */
    @Override
    public String defaultInstallLocation() {
        String result = "";
    //#WindowsInstaller.java:41: method: String com.dmdirc.installer.WindowsInstaller.defaultInstallLocation()
    //#input(String defaultInstallLocation()): ""._tainted
    //#input(String defaultInstallLocation()): "C:\Program Files"._tainted
    //#input(String defaultInstallLocation()): "\DMDirc"._tainted
    //#input(String defaultInstallLocation()): "\Desktop\DMDirc"._tainted
    //#input(String defaultInstallLocation()): __Descendant_Table[com/dmdirc/installer/WindowsInstaller]
    //#input(String defaultInstallLocation()): __Descendant_Table[others]
    //#input(String defaultInstallLocation()): __Dispatch_Table.isVista()Z
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/BooleanParam.__Descendant_Table[com/dmdirc/installer/cliparser/BooleanParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/BooleanParam.__Descendant_Table[others]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/BooleanParam.__Dispatch_Table.getStringValue()Ljava/lang/String;
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/BooleanParam.__Dispatch_Table.getValue()Z
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[com/dmdirc/installer/cliparser/BooleanParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[com/dmdirc/installer/cliparser/CLIParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[com/dmdirc/installer/cliparser/IntegerParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[com/dmdirc/installer/cliparser/StringParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[others]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParam.__Dispatch_Table.getStringValue()Ljava/lang/String;
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.__Class_Obj.__Lock
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.__Descendant_Table[com/dmdirc/installer/cliparser/CLIParser]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.__Descendant_Table[others]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.__Dispatch_Table.getParam(Ljava/lang/String;)Lcom/dmdirc/installer/cliparser/CLIParam;
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.__Dispatch_Table.getParamNumber(Ljava/lang/String;)I
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.me
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.me.__Tag
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.me.params
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/IntegerParam.__Descendant_Table[com/dmdirc/installer/cliparser/IntegerParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/IntegerParam.__Descendant_Table[others]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/IntegerParam.__Dispatch_Table.getStringValue()Ljava/lang/String;
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/IntegerParam.__Dispatch_Table.getValue()I
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/StringParam.__Descendant_Table[com/dmdirc/installer/cliparser/StringParam]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/StringParam.__Descendant_Table[others]
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/StringParam.__Dispatch_Table.getStringValue()Ljava/lang/String;
    //#input(String defaultInstallLocation()): com/dmdirc/installer/cliparser/StringParam.__Dispatch_Table.getValue()Ljava/lang/String;
    //#input(String defaultInstallLocation()): this
    //#input(String defaultInstallLocation()): this.__Tag
    //#output(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.me
    //#output(String defaultInstallLocation()): java.lang.String:valueOf(...)._tainted
    //#output(String defaultInstallLocation()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String defaultInstallLocation()): new ArrayList(CLIParser#2) num objects
    //#output(String defaultInstallLocation()): new ArrayList(CLIParser#3) num objects
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1) num objects
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1).__Tag
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1).helpParam
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1).paramList
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1).params
    //#output(String defaultInstallLocation()): new CLIParser(getCLIParser#1).redundant
    //#output(String defaultInstallLocation()): new Hashtable(CLIParser#1) num objects
    //#output(String defaultInstallLocation()): return_value
    //#new obj(String defaultInstallLocation()): java.lang.String:valueOf(...)
    //#new obj(String defaultInstallLocation()): java.lang.StringBuilder:toString(...)
    //#new obj(String defaultInstallLocation()): new ArrayList(CLIParser#2)
    //#new obj(String defaultInstallLocation()): new ArrayList(CLIParser#3)
    //#new obj(String defaultInstallLocation()): new CLIParser(getCLIParser#1)
    //#new obj(String defaultInstallLocation()): new Hashtable(CLIParser#1)
    //#pre[1] (String defaultInstallLocation()): init'ed(com/dmdirc/installer/cliparser/CLIParser.me)
    //#pre[3] (String defaultInstallLocation()): (soft) this.__Tag == com/dmdirc/installer/WindowsInstaller
    //#presumption(String defaultInstallLocation()): getCLIParser(...).__Tag == com/dmdirc/installer/cliparser/CLIParser
    //#presumption(String defaultInstallLocation()): getCLIParser(...).__Tag == com/dmdirc/installer/cliparser/CLIParser
    //#presumption(String defaultInstallLocation()): getCLIParser(...).params != null
    //#presumption(String defaultInstallLocation()): getCLIParser(...).params != null
    //#presumption(String defaultInstallLocation()): getParam(...).myValue@43 != null
    //#post(String defaultInstallLocation()): com/dmdirc/installer/cliparser/CLIParser.me != null
    //#post(String defaultInstallLocation()): init'ed(java.lang.String:valueOf(...)._tainted)
    //#post(String defaultInstallLocation()): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String defaultInstallLocation()): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(String defaultInstallLocation()): return_value != null
    //#post(String defaultInstallLocation()): new ArrayList(CLIParser#2) num objects <= 1
    //#post(String defaultInstallLocation()): new ArrayList(CLIParser#3) num objects == new ArrayList(CLIParser#2) num objects
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1) num objects == new ArrayList(CLIParser#2) num objects
    //#post(String defaultInstallLocation()): new Hashtable(CLIParser#1) num objects == new ArrayList(CLIParser#2) num objects
    //#post(String defaultInstallLocation()): new ArrayList(CLIParser#2) num objects == 0
    //#post(String defaultInstallLocation()): new ArrayList(CLIParser#3) num objects == 0
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1) num objects == 0
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1).__Tag == com/dmdirc/installer/cliparser/CLIParser
    //#post(String defaultInstallLocation()): init'ed(new CLIParser(getCLIParser#1).__Tag)
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1).helpParam == null
    //#post(String defaultInstallLocation()): init'ed(new CLIParser(getCLIParser#1).helpParam)
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1).paramList == &new ArrayList(CLIParser#2)
    //#post(String defaultInstallLocation()): init'ed(new CLIParser(getCLIParser#1).paramList)
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1).params == &new Hashtable(CLIParser#1)
    //#post(String defaultInstallLocation()): init'ed(new CLIParser(getCLIParser#1).params)
    //#post(String defaultInstallLocation()): new CLIParser(getCLIParser#1).redundant == &new ArrayList(CLIParser#3)
    //#post(String defaultInstallLocation()): init'ed(new CLIParser(getCLIParser#1).redundant)
    //#post(String defaultInstallLocation()): new Hashtable(CLIParser#1) num objects == 0
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(String defaultInstallLocation()): Effects-of-calling:java.lang.String:valueOf
    //#test_vector(String defaultInstallLocation()): java.lang.String:isEmpty(...)@46: {0}, {1}
    //#test_vector(String defaultInstallLocation()): java.lang.System:getenv(...)@47: Inverse{null}, Addr_Set{null}
        if (CLIParser.getCLIParser().getParamNumber("-directory") > 0) {
            result = CLIParser.getCLIParser().getParam("-directory").
    //#WindowsInstaller.java:43: ?null dereference
    //#    getParam(...) != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: String defaultInstallLocation()
    //#    basic block: bb_2
    //#    assertion: getParam(...) != null
    //#    VN: getParam(...)
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#WindowsInstaller.java:43: ?use of default init
    //#    init'ed(getParam(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: String defaultInstallLocation()
    //#    basic block: bb_2
    //#    assertion: init'ed(getParam(...).__Tag)
    //#    VN: getParam(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#WindowsInstaller.java:43: ?null dereference
    //#    com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[getParam(...).__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: String defaultInstallLocation()
    //#    basic block: bb_2
    //#    assertion: com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[getParam(...).__Tag] != null
    //#    VN: com/dmdirc/installer/cliparser/CLIParam.__Descendant_Table[getParam(...).__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#WindowsInstaller.java:43: ?precondition failure
    //#    com/dmdirc/installer/cliparser/IntegerParam.getStringValue: this.__Tag == com/dmdirc/installer/cliparser/IntegerParam
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: String defaultInstallLocation()
    //#    basic block: bb_2
    //#    assertion: getParam(...).__Tag in {com/dmdirc/installer/cliparser/BooleanParam, com/dmdirc/installer/cliparser/IntegerParam, com/dmdirc/installer/cliparser/StringParam}
    //#    callee: String com/dmdirc/installer/cliparser/IntegerParam.getStringValue()
    //#    callee assertion: this.__Tag == com/dmdirc/installer/cliparser/IntegerParam
    //#    callee file: IntegerParam.java
    //#    callee precondition index: [2]
    //#    callee srcpos: 73
    //#    VN: getParam(...).__Tag
    //#    Expected: {409_600, 411_392, 411_904}
    //#    Bad: {410_368}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
                    getStringValue();
        }
        if (result.isEmpty()) {
            String filename = System.getenv("PROGRAMFILES");
            if (filename == null) {
                if (isVista()) {
                    filename = System.getProperty("user.home") +
                               "\\Desktop\\DMDirc";
                } else {
                    filename = "C:\\Program Files";
                }
            }
            result = filename + "\\DMDirc";
        }
        return result;
    //#WindowsInstaller.java:58: end of method: String com.dmdirc.installer.WindowsInstaller.defaultInstallLocation()
    }

    /** {@inheritDoc} */
    @Override
    public boolean validFile(final String filename) {
        return (!filename.equalsIgnoreCase("setup.exe") &&
    //#WindowsInstaller.java:64: method: bool com.dmdirc.installer.WindowsInstaller.validFile(String)
    //#input(bool validFile(String)): filename
    //#output(bool validFile(String)): return_value
    //#pre[1] (bool validFile(String)): filename != null
    //#post(bool validFile(String)): init'ed(return_value)
    //#WindowsInstaller.java:64: end of method: bool com.dmdirc.installer.WindowsInstaller.validFile(String)
                !filename.equalsIgnoreCase("jre.exe") &&
                !filename.equalsIgnoreCase("wget.exe") &&
                !filename.equalsIgnoreCase("wgetoutput") &&
                !filename.equalsIgnoreCase("shortcut.exe"));
    }

    /**
     * Are we running vista? -_-
     *
     * @return True if this is vista.
     */
    public boolean isVista() {
        return System.getProperty("os.name").indexOf("Vista") >= 0;
    //#WindowsInstaller.java:77: method: bool com.dmdirc.installer.WindowsInstaller.isVista()
    //#output(bool isVista()): return_value
    //#presumption(bool isVista()): java.lang.System:getProperty(...)@77 != null
    //#post(bool isVista()): init'ed(return_value)
    //#WindowsInstaller.java:77: end of method: bool com.dmdirc.installer.WindowsInstaller.isVista()
    }

    /**
     * Are we running NT?
     *
     * @return True if this is NT.
     */
    public boolean isNT() {
        final String osName = System.getProperty("os.name");
    //#WindowsInstaller.java:86: method: bool com.dmdirc.installer.WindowsInstaller.isNT()
    //#output(bool isNT()): return_value
    //#presumption(bool isNT()): java.lang.System:getProperty(...)@86 != null
    //#post(bool isNT()): init'ed(return_value)
        return (osName.indexOf("NT") >= 0 || osName.indexOf("2000") >= 0 ||
    //#WindowsInstaller.java:87: end of method: bool com.dmdirc.installer.WindowsInstaller.isNT()
                osName.indexOf("2003") >= 0 || osName.indexOf("XP") >= 0);
    }

    /** {@inheritDoc} */
    @Override
    public boolean supportsShortcut(final ShortcutType shortcutType) {
        switch (shortcutType) {
    //#WindowsInstaller.java:94: method: com.dmdirc.installer.WindowsInstaller$1.com.dmdirc.installer.WindowsInstaller$1__static_init
    //#WindowsInstaller.java:94: Warning: method not available - call not analyzed
    //#    call on Installer$ShortcutType[] com.dmdirc.installer.Installer$ShortcutType:values()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller$1
    //#    method: com.dmdirc.installer.WindowsInstaller$1__static_init
    //#    unanalyzed callee: Installer$ShortcutType[] com.dmdirc.installer.Installer$ShortcutType:values()
    //#WindowsInstaller.java:94: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.installer.Installer$ShortcutType:ordinal()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller$1
    //#    method: com.dmdirc.installer.WindowsInstaller$1__static_init
    //#    unanalyzed callee: int com.dmdirc.installer.Installer$ShortcutType:ordinal()
    //#input(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.DESKTOP
    //#input(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.MENU
    //#input(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.PROTOCOL
    //#input(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.QUICKLAUNCH
    //#input(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.UNINSTALLER
    //#output(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType
    //#output(com.dmdirc.installer.WindowsInstaller$1__static_init): __Descendant_Table[com/dmdirc/installer/WindowsInstaller$1]
    //#output(com.dmdirc.installer.WindowsInstaller$1__static_init): new int[](WindowsInstaller$1__static_init#1) num objects
    //#output(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType.length
    //#output(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType[0..4_294_967_295]
    //#new obj(com.dmdirc.installer.WindowsInstaller$1__static_init): new int[](WindowsInstaller$1__static_init#1)
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.DESKTOP != null
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.MENU != null
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.PROTOCOL != null
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.QUICKLAUNCH != null
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType.UNINSTALLER != null
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer$ShortcutType:values(...).length@94 >= 1
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length@94
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length@94
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length@94
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length@94
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length@94
    //#presumption(com.dmdirc.installer.WindowsInstaller$1__static_init): com.dmdirc.installer.Installer_ShortcutType:values(...)@94 != null
    //#post(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType == &new int[](WindowsInstaller$1__static_init#1)
    //#post(com.dmdirc.installer.WindowsInstaller$1__static_init): __Descendant_Table[com/dmdirc/installer/WindowsInstaller$1] == &__Dispatch_Table
    //#post(com.dmdirc.installer.WindowsInstaller$1__static_init): new int[](WindowsInstaller$1__static_init#1) num objects == 1
    //#post(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType.length >= 1
    //#post(com.dmdirc.installer.WindowsInstaller$1__static_init): $SwitchMap$com$dmdirc$installer$Installer$ShortcutType[0..4_294_967_295] in {0..5}, if init'ed
    //#WindowsInstaller.java:94: end of method: com.dmdirc.installer.WindowsInstaller$1.com.dmdirc.installer.WindowsInstaller$1__static_init
    //#WindowsInstaller.java:94: method: bool com.dmdirc.installer.WindowsInstaller.supportsShortcut(Installer$ShortcutType)
    //#WindowsInstaller.java:94: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.installer.Installer$ShortcutType:ordinal()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: bool supportsShortcut(Installer$ShortcutType)
    //#    unanalyzed callee: int com.dmdirc.installer.Installer$ShortcutType:ordinal()
    //#input(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1).length
    //#input(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295]
    //#input(bool supportsShortcut(Installer$ShortcutType)): com/dmdirc/installer/WindowsInstaller$1.$SwitchMap$com$dmdirc$installer$Installer$ShortcutType
    //#input(bool supportsShortcut(Installer$ShortcutType)): shortcutType
    //#output(bool supportsShortcut(Installer$ShortcutType)): return_value
    //#pre[2] (bool supportsShortcut(Installer$ShortcutType)): shortcutType != null
    //#pre[1] (bool supportsShortcut(Installer$ShortcutType)): (soft) init'ed(com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295])
    //#presumption(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.Installer$ShortcutType:values(...).length >= 1
    //#presumption(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 < com.dmdirc.installer.Installer$ShortcutType:values(...).length
    //#presumption(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@94 >= 0
    //#presumption(bool supportsShortcut(Installer$ShortcutType)): java.lang.System:getProperty(...)@97 != null
    //#post(bool supportsShortcut(Installer$ShortcutType)): init'ed(return_value)
    //#test_vector(bool supportsShortcut(Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295]: {1}, {2..5}, {-2_147_483_648..0, 6..4_294_967_295}
            case QUICKLAUNCH:
                // Only windows 95 doesn't have quick launch
                return !(System.getProperty("os.name").indexOf("95") >= 0);
            case DESKTOP:
            case MENU:
            case UNINSTALLER:
            case PROTOCOL:
                // All versions of windows have desktop, menu, uninstaller and protocol
                return true;
            default:
                // Anything else that gets added should be false until the relevent
                // code is added
                return false;
    //#WindowsInstaller.java:107: end of method: void com.dmdirc.installer.WindowsInstaller.com.dmdirc.installer.WindowsInstaller()
    //#WindowsInstaller.java:107: end of method: bool com.dmdirc.installer.WindowsInstaller.supportsShortcut(Installer$ShortcutType)
        }
    }

    /** {@inheritDoc} */
    @Override
    public String getMenuName() {
        return "Start menu";
    //#WindowsInstaller.java:114: method: String com.dmdirc.installer.WindowsInstaller.getMenuName()
    //#output(String getMenuName()): return_value
    //#post(String getMenuName()): return_value == &"Start menu"
    //#WindowsInstaller.java:114: end of method: String com.dmdirc.installer.WindowsInstaller.getMenuName()
    }

    /**
     * Add a registry key.
     *
     * @param key Key to add.
     */
    public void addRegistryKey(final String key) {
        step.addText(" - Adding Key: " + key);
    //#WindowsInstaller.java:123: method: void com.dmdirc.installer.WindowsInstaller.addRegistryKey(String)
    //#WindowsInstaller.java:123: Warning: suspicious precondition
    //#    The precondition for this.step.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void addRegistryKey(String)
    //#    suspicious precondition index: [6]
    //#input(void addRegistryKey(String)): " - Adding Key: "._tainted
    //#input(void addRegistryKey(String)): "&#09; - Error: "._tainted
    //#input(void addRegistryKey(String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/TextStep]
    //#input(void addRegistryKey(String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepConfirm]
    //#input(void addRegistryKey(String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepInstall]
    //#input(void addRegistryKey(String)): com/dmdirc/installer/TextStep.__Descendant_Table[others]
    //#input(void addRegistryKey(String)): com/dmdirc/installer/TextStep.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void addRegistryKey(String)): com/dmdirc/installer/ui/StepConfirm.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void addRegistryKey(String)): com/dmdirc/installer/ui/StepInstall.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void addRegistryKey(String)): key
    //#input(void addRegistryKey(String)): key._tainted
    //#input(void addRegistryKey(String)): this
    //#input(void addRegistryKey(String)): this.step
    //#input(void addRegistryKey(String)): this.step.__Tag
    //#pre[4] (void addRegistryKey(String)): this.step != null
    //#pre[6] (void addRegistryKey(String)): this.step.__Tag in {com/dmdirc/installer/TextStep, com/dmdirc/installer/ui/StepConfirm, com/dmdirc/installer/ui/StepInstall}
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:addText
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Runtime:getRuntime
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Runtime:exec
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Process:getInputStream
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:com.dmdirc.installer.StreamReader
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:com.dmdirc.installer.StreamReader:start
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Process:getErrorStream
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Process:waitFor
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Process:exitValue
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.SecurityException:getMessage
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void addRegistryKey(String)): Effects-of-calling:java.lang.Thread
        final String[] addKey = new String[]{"reg.exe", "add", key, "/f"};
        execAndWait(addKey);
    }
    //#WindowsInstaller.java:126: end of method: void com.dmdirc.installer.WindowsInstaller.addRegistryKey(String)

    /**
     * Modify a registry value.
     *
     * @param key Key to use.
     * @param value Value to modify.
     * @param data Data for key.
     */
    public void editRegistryValue(final String key, final String value,
                                  final String data) {
        editRegistryValue(key, value, "REG_SZ", data);
    //#WindowsInstaller.java:137: method: void com.dmdirc.installer.WindowsInstaller.editRegistryValue(String, String, String)
    //#WindowsInstaller.java:137: Warning: suspicious precondition
    //#    The precondition for this.step.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void editRegistryValue(String, String, String)
    //#    suspicious precondition index: [8]
    //#input(void editRegistryValue(String, String, String)): " - Editing value: "._tainted
    //#input(void editRegistryValue(String, String, String)): "&#09; - Error: "._tainted
    //#input(void editRegistryValue(String, String, String)): "\"._tainted
    //#input(void editRegistryValue(String, String, String)): __Descendant_Table[com/dmdirc/installer/WindowsInstaller]
    //#input(void editRegistryValue(String, String, String)): __Descendant_Table[others]
    //#input(void editRegistryValue(String, String, String)): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/TextStep]
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepConfirm]
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepInstall]
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[others]
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/TextStep.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/ui/StepConfirm.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String)): com/dmdirc/installer/ui/StepInstall.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String)): data
    //#input(void editRegistryValue(String, String, String)): key
    //#input(void editRegistryValue(String, String, String)): key._tainted
    //#input(void editRegistryValue(String, String, String)): this
    //#input(void editRegistryValue(String, String, String)): this.__Tag
    //#input(void editRegistryValue(String, String, String)): this.step
    //#input(void editRegistryValue(String, String, String)): this.step.__Tag
    //#input(void editRegistryValue(String, String, String)): value
    //#input(void editRegistryValue(String, String, String)): value._tainted
    //#pre[1] (void editRegistryValue(String, String, String)): data != null
    //#pre[5] (void editRegistryValue(String, String, String)): this.__Tag == com/dmdirc/installer/WindowsInstaller
    //#pre[6] (void editRegistryValue(String, String, String)): this.step != null
    //#pre[8] (void editRegistryValue(String, String, String)): this.step.__Tag in {com/dmdirc/installer/TextStep, com/dmdirc/installer/ui/StepConfirm, com/dmdirc/installer/ui/StepInstall}
    //#pre[9] (void editRegistryValue(String, String, String)): value != null
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:addText
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Runtime:getRuntime
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Runtime:exec
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Process:getInputStream
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:com.dmdirc.installer.StreamReader
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:com.dmdirc.installer.StreamReader:start
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Process:getErrorStream
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Process:waitFor
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Process:exitValue
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.SecurityException:getMessage
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.util.ArrayList:size
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.util.ArrayList:toArray
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void editRegistryValue(String, String, String)): Effects-of-calling:java.lang.Thread
    }
    //#WindowsInstaller.java:138: end of method: void com.dmdirc.installer.WindowsInstaller.editRegistryValue(String, String, String)

    /**
     * Modify a registry value.
     *
     * @param key Key to use.
     * @param value Value to modify.
     * @param type Type of data.
     * @param data Data for key.
     */
    public void editRegistryValue(final String key, final String value,
                                  final String type, final String data) {
        final ArrayList<String> params = new ArrayList<String>();
    //#WindowsInstaller.java:150: method: void com.dmdirc.installer.WindowsInstaller.editRegistryValue(String, String, String, String)
    //#WindowsInstaller.java:150: Warning: suspicious precondition
    //#    The precondition for this.step.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void editRegistryValue(String, String, String, String)
    //#    suspicious precondition index: [8]
    //#input(void editRegistryValue(String, String, String, String)): " - Editing value: "._tainted
    //#input(void editRegistryValue(String, String, String, String)): "&#09; - Error: "._tainted
    //#input(void editRegistryValue(String, String, String, String)): "\"._tainted
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/TextStep]
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepConfirm]
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepInstall]
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/TextStep.__Descendant_Table[others]
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/TextStep.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/ui/StepConfirm.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String, String)): com/dmdirc/installer/ui/StepInstall.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void editRegistryValue(String, String, String, String)): data
    //#input(void editRegistryValue(String, String, String, String)): key
    //#input(void editRegistryValue(String, String, String, String)): key._tainted
    //#input(void editRegistryValue(String, String, String, String)): this
    //#input(void editRegistryValue(String, String, String, String)): this.step
    //#input(void editRegistryValue(String, String, String, String)): this.step.__Tag
    //#input(void editRegistryValue(String, String, String, String)): type
    //#input(void editRegistryValue(String, String, String, String)): value
    //#input(void editRegistryValue(String, String, String, String)): value._tainted
    //#pre[1] (void editRegistryValue(String, String, String, String)): data != null
    //#pre[6] (void editRegistryValue(String, String, String, String)): this.step != null
    //#pre[8] (void editRegistryValue(String, String, String, String)): this.step.__Tag in {com/dmdirc/installer/TextStep, com/dmdirc/installer/ui/StepConfirm, com/dmdirc/installer/ui/StepInstall}
    //#pre[10] (void editRegistryValue(String, String, String, String)): value != null
    //#presumption(void editRegistryValue(String, String, String, String)): java.util.ArrayList:size(...)@169 >= 0
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:addText
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Runtime:getRuntime
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Runtime:exec
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Process:getInputStream
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:com.dmdirc.installer.StreamReader
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:com.dmdirc.installer.StreamReader:start
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Process:getErrorStream
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Process:waitFor
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Process:exitValue
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.SecurityException:getMessage
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void editRegistryValue(String, String, String, String)): Effects-of-calling:java.lang.Thread
    //#test_vector(void editRegistryValue(String, String, String, String)): java.lang.String:isEmpty(...)@156: {0}, {1}
    //#test_vector(void editRegistryValue(String, String, String, String)): java.lang.String:isEmpty(...)@164: {1}, {0}
        step.addText(" - Editing value: " + key + "\\" + value);
        params.add("reg.exe");
        params.add("add");
        params.add(key);
        params.add("/f");
        if (value.isEmpty()) {
            params.add("/ve");
        } else {
            params.add("/v");
            params.add(value);
        }
        params.add("/t");
        params.add(type);
        if (!data.isEmpty()) {
            params.add("/d");
            params.add(data);
        }

        execAndWait(params.toArray(new String[params.size()]));
    }
    //#WindowsInstaller.java:170: end of method: void com.dmdirc.installer.WindowsInstaller.editRegistryValue(String, String, String, String)

    /**
     * Execute and wait for the requested command
     *
     * @param cmd Command array to execute/
     * @return return value from command, or -1 if there was an error.
     */
    private int execAndWait(final String cmd[]) {
        try {
            final Process myProcess = Runtime.getRuntime().exec(cmd);
    //#WindowsInstaller.java:180: method: int com.dmdirc.installer.WindowsInstaller.execAndWait(String[])
    //#WindowsInstaller.java:180: Warning: suspicious precondition
    //#    The precondition for this.step.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: int execAndWait(String[])
    //#    suspicious precondition index: [5]
    //#    Attribs:  Soft
    //#input(int execAndWait(String[])): "&#09; - Error: "._tainted
    //#input(int execAndWait(String[])): cmd
    //#input(int execAndWait(String[])): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/TextStep]
    //#input(int execAndWait(String[])): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepConfirm]
    //#input(int execAndWait(String[])): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepInstall]
    //#input(int execAndWait(String[])): com/dmdirc/installer/TextStep.__Descendant_Table[others]
    //#input(int execAndWait(String[])): com/dmdirc/installer/TextStep.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(int execAndWait(String[])): com/dmdirc/installer/ui/StepConfirm.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(int execAndWait(String[])): com/dmdirc/installer/ui/StepInstall.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(int execAndWait(String[])): this
    //#input(int execAndWait(String[])): this.step
    //#input(int execAndWait(String[])): this.step.__Tag
    //#output(int execAndWait(String[])): return_value
    //#pre[3] (int execAndWait(String[])): (soft) this.step != null
    //#pre[5] (int execAndWait(String[])): (soft) this.step.__Tag in {com/dmdirc/installer/TextStep, com/dmdirc/installer/ui/StepConfirm, com/dmdirc/installer/ui/StepInstall}
    //#presumption(int execAndWait(String[])): java.lang.Runtime:exec(...)@180 != null
    //#presumption(int execAndWait(String[])): java.lang.Runtime:getRuntime(...)@180 != null
    //#post(int execAndWait(String[])): init'ed(return_value)
    //#unanalyzed(int execAndWait(String[])): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(int execAndWait(String[])): Effects-of-calling:java.lang.Thread
    //#test_vector(int execAndWait(String[])): java.lang.Process:exitValue(...)@187: {0}, {-2_147_483_648..-1, 1..4_294_967_295}
            new StreamReader(myProcess.getInputStream()).start();
    //#WindowsInstaller.java:181: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.installer.StreamReader:start()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: int execAndWait(String[])
    //#    unanalyzed callee: void com.dmdirc.installer.StreamReader:start()
            new StreamReader(myProcess.getErrorStream()).start();
    //#WindowsInstaller.java:182: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.installer.StreamReader:start()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: int execAndWait(String[])
    //#    unanalyzed callee: void com.dmdirc.installer.StreamReader:start()
            try {
                myProcess.waitFor();
            } catch (InterruptedException e) {
            }
            if (myProcess.exitValue() != 0) {
                step.addText("\t - Error: Unknown Reason");
            }
            return myProcess.exitValue();
        } catch (SecurityException e) {
            step.addText("\t - Error: " + e.getMessage());
        } catch (IOException e) {
            step.addText("\t - Error: " + e.getMessage());
        }

        return -1;
    //#WindowsInstaller.java:197: end of method: int com.dmdirc.installer.WindowsInstaller.execAndWait(String[])
    }

    /** {@inheritDoc} */
    @Override
    public void setupShortcut(final String location,
                              final ShortcutType shortcutType) {
        // Shortcut.exe is from http://www.optimumx.com/download/#Shortcut

        if (!supportsShortcut(shortcutType)) {
    //#WindowsInstaller.java:206: method: void com.dmdirc.installer.WindowsInstaller.setupShortcut(String, Installer$ShortcutType)
    //#WindowsInstaller.java:206: Warning: suspicious precondition
    //#    The precondition for this.step.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void setupShortcut(String, Installer$ShortcutType)
    //#    suspicious precondition index: [9]
    //#    Attribs:  Soft
    //#input(void setupShortcut(String, Installer$ShortcutType)): " - Adding Key: "._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): " - Editing value: "._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): ""._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "&#09; - Error: "._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): ".F:"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): ".I:"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): ".T:"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): ".W:"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "Comments"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "DisplayIcon"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "DisplayName"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "EditFlags"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKCR\irc"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKCR\irc\DefaultIcon"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKCR\irc\Shell"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKCR\irc\Shell\open"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKCR\irc\Shell\open\command"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\DMDirc"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "InstallDir"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "InstalledTime"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "Publisher"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "URL Protocol"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "URLInfoAbout"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "URLUpdateInfo"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "UninstallString"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\""._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\Application Data\Microsoft\Internet Explorer\Quick Launch"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\DMDirc.exe"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\DMDirc.exe\" -e -c %1"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\DMDirc.lnk"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\Desktop"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\Microsoft\Windows"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\Start Menu\Programs\DMDirc"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\Uninstaller.exe"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): "\icon.ico"._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Descendant_Table[com/dmdirc/installer/WindowsInstaller]
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Descendant_Table[others]
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.addRegistryKey(Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.isNT()Z
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.isVista()Z
    //#input(void setupShortcut(String, Installer$ShortcutType)): __Dispatch_Table.supportsShortcut(Lcom/dmdirc/installer/Installer$ShortcutType;)Z
    //#input(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1).length
    //#input(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295]
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/TextStep]
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepConfirm]
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/TextStep.__Descendant_Table[com/dmdirc/installer/ui/StepInstall]
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/TextStep.__Descendant_Table[others]
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/TextStep.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/WindowsInstaller$1.$SwitchMap$com$dmdirc$installer$Installer$ShortcutType
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/ui/StepConfirm.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): com/dmdirc/installer/ui/StepInstall.__Dispatch_Table.addText(Ljava/lang/String;)V
    //#input(void setupShortcut(String, Installer$ShortcutType)): location
    //#input(void setupShortcut(String, Installer$ShortcutType)): location._tainted
    //#input(void setupShortcut(String, Installer$ShortcutType)): shortcutType
    //#input(void setupShortcut(String, Installer$ShortcutType)): this
    //#input(void setupShortcut(String, Installer$ShortcutType)): this.__Tag
    //#input(void setupShortcut(String, Installer$ShortcutType)): this.step
    //#input(void setupShortcut(String, Installer$ShortcutType)): this.step.__Tag
    //#pre[4] (void setupShortcut(String, Installer$ShortcutType)): shortcutType != null
    //#pre[6] (void setupShortcut(String, Installer$ShortcutType)): this.__Tag == com/dmdirc/installer/WindowsInstaller
    //#pre[1] (void setupShortcut(String, Installer$ShortcutType)): (soft) init'ed(com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295])
    //#pre[2] (void setupShortcut(String, Installer$ShortcutType)): (soft) location != null
    //#pre[7] (void setupShortcut(String, Installer$ShortcutType)): (soft) this.step != null
    //#pre[9] (void setupShortcut(String, Installer$ShortcutType)): (soft) this.step.__Tag in {com/dmdirc/installer/TextStep, com/dmdirc/installer/ui/StepConfirm, com/dmdirc/installer/ui/StepInstall}
    //#presumption(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.Installer$ShortcutType:values(...).length >= 1
    //#presumption(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@216 < com.dmdirc.installer.Installer$ShortcutType:values(...).length
    //#presumption(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.Installer_ShortcutType:ordinal(...)@216 >= 0
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:com.dmdirc.installer.Installer$ShortcutType:ordinal
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.System:getProperty
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:addText
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:execAndWait
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:editRegistryValue
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Runtime:getRuntime
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Runtime:exec
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Process:getInputStream
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:com.dmdirc.installer.StreamReader
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:com.dmdirc.installer.StreamReader:start
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Process:getErrorStream
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Process:waitFor
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Process:exitValue
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.SecurityException:getMessage
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.io.IOException:getMessage
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.util.ArrayList:add
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.util.ArrayList:size
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.util.ArrayList:toArray
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:javax.swing.SwingUtilities:invokeLater
    //#unanalyzed(void setupShortcut(String, Installer$ShortcutType)): Effects-of-calling:java.lang.Thread
    //#test_vector(void setupShortcut(String, Installer$ShortcutType)): com.dmdirc.installer.WindowsInstaller$1__static_init.new int[](WindowsInstaller$1__static_init#1)[0..4_294_967_295]: {1}, {2}, {3}, {4}, {5}, {-2_147_483_648..0, 6..4_294_967_295}
    //#test_vector(void setupShortcut(String, Installer$ShortcutType)): java.io.File:exists(...)@212: {0}, {1}
    //#test_vector(void setupShortcut(String, Installer$ShortcutType)): java.io.File:exists(...)@301: {1}, {0}
    //#test_vector(void setupShortcut(String, Installer$ShortcutType)): java.io.File:exists(...)@307: {0}, {1}
    //#test_vector(void setupShortcut(String, Installer$ShortcutType)): java.lang.String:length(...)@293: {1..4_294_967_295}, {0}
            step.addText(
                    " - Error creating shortcut. Not applicable to this Operating System");
            return;
        }

        if (new File("Shortcut.exe").exists()) {
            String filename = "";
    //#WindowsInstaller.java:213: Warning: unused assignment
    //#    Unused assignment into filename
    //#    severity: LOW
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void setupShortcut(String, Installer$ShortcutType)
            File dir;

            switch (shortcutType) {
    //#WindowsInstaller.java:216: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.installer.Installer$ShortcutType:ordinal()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void setupShortcut(String, Installer$ShortcutType)
    //#    unanalyzed callee: int com.dmdirc.installer.Installer$ShortcutType:ordinal()
                case DESKTOP:
                    if (isNT() || isVista()) {
                        filename = System.getProperty("user.home") + "\\Desktop";
                    } else {
                        filename = System.getenv("WINDIR") + "\\Desktop";
                    }
                    break;

                case MENU:
                    if (isVista()) {
                        filename = System.getenv("APPDATA") +
                                   "\\Microsoft\\Windows";
                    } else {
                        filename = System.getProperty("user.home");
                    }
                    filename = filename + "\\Start Menu\\Programs\\DMDirc";
                    break;

                case QUICKLAUNCH:
                    if (isVista()) {
                        filename =
                        System.getProperty("user.home") +
                        "\\AppData\\Roaming\\Microsoft\\Internet Explorer\\Quick Launch";
                    } else {
                        filename =
                        System.getProperty("user.home") +
                        "\\Application Data\\Microsoft\\Internet Explorer\\Quick Launch";
                    }
                    break;

                case UNINSTALLER:
                    // Registry hax!
                    final String key =
    //#WindowsInstaller.java:249: Warning: unused assignment
    //#    Unused assignment into key
    //#    severity: LOW
    //#    class: com.dmdirc.installer.WindowsInstaller
    //#    method: void setupShortcut(String, Installer$ShortcutType)
                                 "HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\DMDirc";
                    addRegistryKey(key);
                    editRegistryValue(key, "Comments", "DMDirc IRC Client");
                    editRegistryValue(key, "DisplayName", "DMDirc IRC Client");
                    editRegistryValue(key, "DisplayIcon", location +
                                                          "\\icon.ico");
                    editRegistryValue(key, "UninstallString",
                                      location + "\\Uninstaller.exe");
                    editRegistryValue(key, "Publisher", "DMDirc.com");
                    editRegistryValue(key, "URLInfoAbout",
                                      "http://www.DMDirc.com/");
                    editRegistryValue(key, "URLUpdateInfo",
                                      "http://www.DMDirc.com/");
                    editRegistryValue(key, "InstallDir", location);
                    editRegistryValue(key, "InstalledTime", String.valueOf(
                            System.currentTimeMillis()));
                    return;

                case PROTOCOL:
                    // Add needed keys.
                    addRegistryKey("HKCR\\irc");
                    addRegistryKey("HKCR\\irc\\DefaultIcon");
                    addRegistryKey("HKCR\\irc\\Shell");
                    addRegistryKey("HKCR\\irc\\Shell\\open");
                    addRegistryKey("HKCR\\irc\\Shell\\open\\command");
                    // Now the values
                    editRegistryValue("HKCR\\irc", "", "URL:IRC Protocol");
                    editRegistryValue("HKCR\\irc", "URL Protocol", "");
                    editRegistryValue("HKCR\\irc", "EditFlags", "REG_BINARY",
                                      "02000000");
                    editRegistryValue("HKCR\\irc\\DefaultIcon", "", location +
                                                                    "\\icon.ico");
                    editRegistryValue("HKCR\\irc\\Shell\\open\\command", "",
                                      "\\\"" + location +
                                      "\\DMDirc.exe\\\" -e -c %1");
                    return;

                default:
                    step.addText(
                            " - Error creating shortcut. Not applicable to this Operating System");
                    return;
            }

            if (filename.length() == 0) {
                step.addText(
                        " - Error creating shortcut. Not applicable to this System");
                return;
            }

            // Check the dir exists
            dir = new File(filename);
            if (!dir.exists()) {
                dir.mkdir();
            }

            // Delete an older shortcut
            final File oldFile = new File(filename + "\\DMDirc.lnk");
            if (oldFile.exists()) {
                oldFile.delete();
            }

//			final String thisDirName = new File("").getAbsolutePath();
            final String[] command = new String[]{
                //			                      thisDirName+"/Shortcut.exe",
                "Shortcut.exe",
                "/F:" + filename + "\\DMDirc.lnk",
                "/A:C",
                //			                      "/T:"+location+"\\DMDirc.bat",
                //			                      "/T:javaw.exe",
                //			                      "/P:-jar DMDirc.jar",
                "/T:" + location + "\\DMDirc.exe",
                "/W:" + location,
                "/I:" + location + "\\icon.ico",
                "/D:DMDirc IRC Client"
            };
            execAndWait(command);
        } else {
            step.addText(
                    " - Error creating shortcut: Unable to find Shortcut.exe");
        }
    }
    //#WindowsInstaller.java:330: end of method: void com.dmdirc.installer.WindowsInstaller.setupShortcut(String, Installer$ShortcutType)
}    //#WindowsInstaller.java:: end of class: com.dmdirc.installer.WindowsInstaller$1
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Descendant_Table[com/dmdirc/installer/WindowsInstaller]
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.addRegistryKey(Ljava/lang/String;)V
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.defaultInstallLocation()Ljava/lang/String;
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.execAndWait([Ljava/lang/String;)I
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.getMenuName()Ljava/lang/String;
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.isNT()Z
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.isVista()Z
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.setupShortcut(Ljava/lang/String;Lcom/dmdirc/installer/Installer$ShortcutType;)V
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.supportsShortcut(Lcom/dmdirc/installer/Installer$ShortcutType;)Z
    //#output(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.validFile(Ljava/lang/String;)Z
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Descendant_Table[com/dmdirc/installer/WindowsInstaller] == &__Dispatch_Table
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.addRegistryKey(Ljava/lang/String;)V == &addRegistryKey
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.defaultInstallLocation()Ljava/lang/String; == &defaultInstallLocation
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &editRegistryValue
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.editRegistryValue(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V == &editRegistryValue
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.execAndWait([Ljava/lang/String;)I == &execAndWait
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.getMenuName()Ljava/lang/String; == &getMenuName
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.isNT()Z == &isNT
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.isVista()Z == &isVista
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.setupShortcut(Ljava/lang/String;Lcom/dmdirc/installer/Installer$ShortcutType;)V == &setupShortcut
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.supportsShortcut(Lcom/dmdirc/installer/Installer$ShortcutType;)Z == &supportsShortcut
    //#post(com.dmdirc.installer.WindowsInstaller__static_init): __Dispatch_Table.validFile(Ljava/lang/String;)Z == &validFile
    //#WindowsInstaller.java:: end of method: com.dmdirc.installer.WindowsInstaller.com.dmdirc.installer.WindowsInstaller__static_init
    //#WindowsInstaller.java:: end of class: com.dmdirc.installer.WindowsInstaller
