//# 5 errors, 2,109 messages
//#
/*
    //#Channel.java:1:1: class: com.dmdirc.Channel
    //#Channel.java:1:1: method: com.dmdirc.Channel.com.dmdirc.Channel__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;

import com.dmdirc.actions.ActionManager;
import com.dmdirc.actions.CoreActionType;
import com.dmdirc.commandparser.CommandManager;
import com.dmdirc.commandparser.CommandType;
import com.dmdirc.config.ConfigManager;
import com.dmdirc.interfaces.ConfigChangeListener;
import com.dmdirc.parser.irc.ChannelClientInfo;
import com.dmdirc.parser.irc.ChannelInfo;
import com.dmdirc.parser.irc.ClientInfo;
import com.dmdirc.ui.WindowManager;
import com.dmdirc.ui.input.TabCompleter;
import com.dmdirc.ui.input.TabCompletionType;
import com.dmdirc.ui.interfaces.ChannelWindow;
import com.dmdirc.ui.interfaces.InputWindow;
import com.dmdirc.ui.messages.ColourManager;
import com.dmdirc.ui.messages.Styliser;
import com.dmdirc.util.RollingList;

import java.awt.Color;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * The Channel class represents the client's view of the channel. It handles
 * callbacks for channel events from the parser, maintains the corresponding
 * ChannelWindow, and handles user input for the channel.
 *
 * @author chris
 */
public class Channel extends MessageTarget implements ConfigChangeListener,
    //#Channel.java:57: method: Window com.dmdirc.Channel.getFrame()
    //#input(Window getFrame()): __Descendant_Table[com/dmdirc/Channel]
    //#input(Window getFrame()): __Descendant_Table[others]
    //#input(Window getFrame()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(Window getFrame()): this
    //#input(Window getFrame()): this.__Tag
    //#input(Window getFrame()): this.window
    //#output(Window getFrame()): return_value
    //#pre[2] (Window getFrame()): this.__Tag == com/dmdirc/Channel
    //#pre[3] (Window getFrame()): init'ed(this.window)
    //#post(Window getFrame()): return_value == this.window
    //#post(Window getFrame()): init'ed(return_value)
    //#Channel.java:57: end of method: Window com.dmdirc.Channel.getFrame()
        Serializable {

    /**
     * A version number for this class. It should be changed whenever the class
     * structure is changed (or anything else that would prevent serialized
     * objects being unserialized with the new class).
     */
    private static final long serialVersionUID = 1;

    /** The parser's pChannel class. */
    private transient ChannelInfo channelInfo;

    /** The server this channel is on. */
    private Server server;

    /** The ChannelWindow used for this channel. */
    private ChannelWindow window;

    /** The tabcompleter used for this channel. */
    private final TabCompleter tabCompleter;

    /** A list of previous topics we've seen. */
    private final RollingList<Topic> topics;

    /** Our event handler. */
    private final ChannelEventHandler eventHandler;

    /** Whether we're in this channel or not. */
    private boolean onChannel;

    /** Whether we should send WHO requests for this channel. */
    private volatile boolean sendWho;

    /** Whether we should show mode prefixes in text. */
    private volatile boolean showModePrefix;

    /** Whether we should show colours in nicks. */
    private volatile boolean showColours;

    /**
     * Creates a new instance of Channel.
     *
     * @param newServer The server object that this channel belongs to
     * @param newChannelInfo The parser's channel object that corresponds to
     * this channel
     */
    public Channel(final Server newServer, final ChannelInfo newChannelInfo) {
        super("channel", new ConfigManager(newServer.getIrcd(), newServer.getNetwork(),
    //#Channel.java:105: method: void com.dmdirc.Channel.com.dmdirc.Channel(Server, ChannelInfo)
    //#Channel.java:105: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:105: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager(String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager(String, String, String, String)
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): " - "._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): ")"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "."._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "biz"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "com"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "getNetwork called when parser is null (state: "._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "info"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "net"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "on"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): "org"._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): __Dispatch_Table.selfJoin()V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#40).__Tag
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#40).type
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.actions.metatypes.ChannelEvents__static_init.new ChannelEvents(ChannelEvents__static_init#1).__Tag
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.commandparser.CommandType.TYPE_CHANNEL
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.commandparser.CommandType.TYPE_CHAT
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.ui.input.TabCompletionType.COMMAND
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ChannelEventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ChannelEventHandler.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.registerCallbacks()V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/EventHandler]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ServerEventHandler]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/EventHandler.com.dmdirc.logger.ErrorLevel.FATAL
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Invite.__Dispatch_Table.getChannel()Ljava/lang/String;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Main.controller
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getIrcd()Ljava/lang/String;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getNetwork()Ljava/lang/String;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.removeInvites(Ljava/lang/String;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/ActionManager.listeners
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/CoreActionType.CHANNEL_OPENED
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newChannelInfo
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.__Tag
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.invites
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.listeners
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.myState
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.myState.__Tag
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.myState.state._tainted
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.parser
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.serverInfo
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.tabCompleter
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): newServer.window
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): this
    //#input(void com.dmdirc.Channel(Server, ChannelInfo)): this.__Tag
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerManager.me
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ArrayList(ServerManager#1) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ChannelEventHandler(Channel#4) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler.__Tag
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler.owner
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ConfigManager(Channel#1) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2).__Tag
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2).this$0
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ListenerList(FrameContainer#1) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ListenerList(FrameContainer#1).__Lock
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new RollingList(Channel#2) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1).__Tag
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1).servers
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): new TabCompleter(Channel#3) num objects
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.__Tag
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.changer
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.channelInfo
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.config
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.icon
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.listeners
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.notification
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.onChannel
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.sendWho
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.server
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.showColours
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.showModePrefix
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.tabCompleter
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.topics
    //#output(void com.dmdirc.Channel(Server, ChannelInfo)): this.window
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new ArrayList(ServerManager#1)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new ChannelEventHandler(Channel#4)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new ConfigManager(Channel#1)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new ListenerList(FrameContainer#1)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new RollingList(Channel#2)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1)
    //#new obj(void com.dmdirc.Channel(Server, ChannelInfo)): new TabCompleter(Channel#3)
    //#pre[2] (void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/Main.controller != null
    //#pre[4] (void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[5] (void com.dmdirc.Channel(Server, ChannelInfo)): newChannelInfo != null
    //#pre[6] (void com.dmdirc.Channel(Server, ChannelInfo)): newServer != null
    //#pre[7] (void com.dmdirc.Channel(Server, ChannelInfo)): newServer.__Tag == com/dmdirc/Server
    //#pre[17] (void com.dmdirc.Channel(Server, ChannelInfo)): newServer.parser != null
    //#pre[18] (void com.dmdirc.Channel(Server, ChannelInfo)): newServer.serverInfo != null
    //#pre[20] (void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(newServer.window)
    //#pre[22] (void com.dmdirc.Channel(Server, ChannelInfo)): this.__Tag == com/dmdirc/Channel
    //#pre[1] (void com.dmdirc.Channel(Server, ChannelInfo)): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#40).type != null
    //#pre[8] (void com.dmdirc.Channel(Server, ChannelInfo)): (soft) newServer.invites != null
    //#pre[10] (void com.dmdirc.Channel(Server, ChannelInfo)): (soft) newServer.listeners != null
    //#pre[21] (void com.dmdirc.Channel(Server, ChannelInfo)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(com.dmdirc.commandparser.CommandType.TYPE_CHANNEL)
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(com.dmdirc.commandparser.CommandType.TYPE_CHAT)
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(com.dmdirc.ui.input.TabCompletionType.COMMAND)
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.ui.interfaces.ChannelWindow:getInputHandler(...)@129 != null
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): com.dmdirc.ui.interfaces.UIController:getChannel(...)@127 != null
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(com/dmdirc/FrameContainer.java.awt.Color.BLACK)
    //#presumption(void com.dmdirc.Channel(Server, ChannelInfo)): this...server@127 != null
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.__Tag == com/dmdirc/Channel
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.changer == &new FrameContainer$IconChanger(FrameContainer#2)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.channelInfo == newChannelInfo
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.channelInfo != null
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.config == &new ConfigManager(Channel#1)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler == &new ChannelEventHandler(Channel#4)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.icon == &"channel"
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.listeners == &new ListenerList(FrameContainer#1)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.notification == com/dmdirc/FrameContainer.java.awt.Color.BLACK
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(this.notification)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.onChannel == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ChannelEventHandler(Channel#4) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ConfigManager(Channel#1) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ListenerList(FrameContainer#1) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new RollingList(Channel#2) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new TabCompleter(Channel#3) num objects == 1
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(this.sendWho)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.server == newServer
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.server != null
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(this.showColours)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(this.showModePrefix)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.tabCompleter == &new TabCompleter(Channel#3)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.topics == &new RollingList(Channel#2)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.window != null
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler.__Tag == com/dmdirc/ChannelEventHandler
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler.owner == this
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): this.eventHandler.owner != null
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2).this$0 == this.eventHandler.owner
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(this.eventHandler.owner)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new FrameContainer$IconChanger(FrameContainer#2).__Tag == com/dmdirc/FrameContainer$IconChanger
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): init'ed(new ListenerList(FrameContainer#1).__Lock)
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1).servers == undefined
    //#post(void com.dmdirc.Channel(Server, ChannelInfo)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:stipControlCodes
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getTopic
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:setTitle
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:setIcon
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getIdent
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getHost
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getConfigManager
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getState
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getParser
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getMyself
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:addLine
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getType
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:trigger
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getArity
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:triggerActions
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getServer
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getCallbackManager
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getNickname
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:removeInvites
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Class:getInterfaces
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:addCallback
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.callbacks.CallbackManager:addCallback
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.logger.Logger:appError
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getIrcd
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getNetwork
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getName
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:migrate
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getUI
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getFrame
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:readTerm
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:parseStack
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:get
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getArgTypes
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:test
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:evaluate
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:getChannelInfo
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getIRCD
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:java.lang.IllegalStateException
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getNetworkName
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getServerName
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getHost
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.WritableFrameContainer
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.FrameContainer
    //#unanalyzed(void com.dmdirc.Channel(Server, ChannelInfo)): Effects-of-calling:com.dmdirc.util.ListenerList
                newServer.getName(), newChannelInfo.getName()));

        channelInfo = newChannelInfo;
        server = newServer;

        getConfigManager().addChangeListener("channel", this);
    //#Channel.java:111: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, ConfigChangeListener)
        getConfigManager().addChangeListener("ui", "shownickcoloursintext", this);
    //#Channel.java:112: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:addChangeListener(String, String, ConfigChangeListener)

        topics = new RollingList<Topic>(getConfigManager().getOptionInt("channel",
    //#Channel.java:114: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: int com.dmdirc.config.ConfigManager:getOptionInt(String, String)
    //#Channel.java:114: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.util.RollingList(int)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.util.RollingList(int)
                "topichistorysize"));

        sendWho = getConfigManager().getOptionBool("channel", "sendwho");
    //#Channel.java:117: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        showModePrefix = getConfigManager().getOptionBool("channel", "showmodeprefix");
    //#Channel.java:118: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        showColours = getConfigManager().getOptionBool("ui", "shownickcoloursintext");
    //#Channel.java:119: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)

        tabCompleter = new TabCompleter(server.getTabCompleter());
    //#Channel.java:121: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter(TabCompleter)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter(TabCompleter)
        tabCompleter.addEntries(TabCompletionType.COMMAND,
    //#Channel.java:122: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.commandparser.CommandManager:getCommandNames(CommandType)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: List com.dmdirc.commandparser.CommandManager:getCommandNames(CommandType)
    //#Channel.java:122: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:addEntries(TabCompletionType, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:addEntries(TabCompletionType, List)
                CommandManager.getCommandNames(CommandType.TYPE_CHANNEL));
        tabCompleter.addEntries(TabCompletionType.COMMAND,
    //#Channel.java:124: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.commandparser.CommandManager:getCommandNames(CommandType)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: List com.dmdirc.commandparser.CommandManager:getCommandNames(CommandType)
    //#Channel.java:124: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:addEntries(TabCompletionType, List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:addEntries(TabCompletionType, List)
                CommandManager.getCommandNames(CommandType.TYPE_CHAT));

        window = Main.getUI().getChannel(Channel.this);
    //#Channel.java:127: Warning: method not available - call not analyzed
    //#    call on ChannelWindow com.dmdirc.ui.interfaces.UIController:getChannel(Channel)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: ChannelWindow com.dmdirc.ui.interfaces.UIController:getChannel(Channel)
        WindowManager.addWindow(server.getFrame(), window);
    //#Channel.java:128: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.WindowManager:addWindow(Window, Window)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.WindowManager:addWindow(Window, Window)
        window.getInputHandler().setTabCompleter(tabCompleter);
    //#Channel.java:129: Warning: method not available - call not analyzed
    //#    call on InputHandler com.dmdirc.ui.interfaces.ChannelWindow:getInputHandler()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: InputHandler com.dmdirc.ui.interfaces.ChannelWindow:getInputHandler()
    //#Channel.java:129: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.InputHandler:setTabCompleter(TabCompleter)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.InputHandler:setTabCompleter(TabCompleter)

        eventHandler = new ChannelEventHandler(this);

        registerCallbacks();
    //#Channel.java:133: ?!precondition failure
    //#    com/dmdirc/Channel.registerCallbacks: this.eventHandler.owner != null
    //#    severity: HIGH
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    basic block: Entry_BB_1
    //#    assertion: undefined != null
    //#    callee: void com/dmdirc/Channel.registerCallbacks()
    //#    callee assertion: this.eventHandler.owner != null
    //#    callee file: Channel.java
    //#    callee precondition index: [11]
    //#    callee srcpos: 145
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad

        ActionManager.processEvent(CoreActionType.CHANNEL_OPENED, null, this);
    //#Channel.java:135: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Channel
    //#    method: void com.dmdirc.Channel(Server, ChannelInfo)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp

        updateTitle();
        selfJoin();
    }
    //#Channel.java:139: end of method: void com.dmdirc.Channel.com.dmdirc.Channel(Server, ChannelInfo)

    /**
     * Registers callbacks with the parser for this channel.
     */
    private void registerCallbacks() {
        eventHandler.registerCallbacks();
    //#Channel.java:145: method: void com.dmdirc.Channel.registerCallbacks()
    //#input(void registerCallbacks()): ")"._tainted
    //#input(void registerCallbacks()): "."._tainted
    //#input(void registerCallbacks()): "biz"._tainted
    //#input(void registerCallbacks()): "com"._tainted
    //#input(void registerCallbacks()): "getNetwork called when parser is null (state: "._tainted
    //#input(void registerCallbacks()): "info"._tainted
    //#input(void registerCallbacks()): "net"._tainted
    //#input(void registerCallbacks()): "on"._tainted
    //#input(void registerCallbacks()): "org"._tainted
    //#input(void registerCallbacks()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void registerCallbacks()): __Descendant_Table[others]
    //#input(void registerCallbacks()): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void registerCallbacks()): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void registerCallbacks()): com/dmdirc/ChannelEventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void registerCallbacks()): com/dmdirc/ChannelEventHandler.__Descendant_Table[others]
    //#input(void registerCallbacks()): com/dmdirc/ChannelEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void registerCallbacks()): com/dmdirc/ChannelEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void registerCallbacks()): com/dmdirc/ChannelEventHandler.__Dispatch_Table.registerCallbacks()V
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/EventHandler]
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ServerEventHandler]
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Descendant_Table[others]
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void registerCallbacks()): com/dmdirc/EventHandler.com.dmdirc.logger.ErrorLevel.FATAL
    //#input(void registerCallbacks()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void registerCallbacks()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void registerCallbacks()): com/dmdirc/Server.__Dispatch_Table.getIrcd()Ljava/lang/String;
    //#input(void registerCallbacks()): com/dmdirc/Server.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void registerCallbacks()): com/dmdirc/Server.__Dispatch_Table.getNetwork()Ljava/lang/String;
    //#input(void registerCallbacks()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void registerCallbacks()): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void registerCallbacks()): com/dmdirc/ServerEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void registerCallbacks()): com/dmdirc/ServerEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void registerCallbacks()): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void registerCallbacks()): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void registerCallbacks()): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void registerCallbacks()): this
    //#input(void registerCallbacks()): this...__Tag
    //#input(void registerCallbacks()): this...server
    //#input(void registerCallbacks()): this...server.__Tag
    //#input(void registerCallbacks()): this.channelInfo
    //#input(void registerCallbacks()): this.config
    //#input(void registerCallbacks()): this.eventHandler
    //#input(void registerCallbacks()): this.eventHandler.__Tag
    //#input(void registerCallbacks()): this.eventHandler.owner
    //#input(void registerCallbacks()): this.eventHandler.owner.__Tag
    //#input(void registerCallbacks()): this.server
    //#input(void registerCallbacks()): this.server.__Tag
    //#input(void registerCallbacks()): this.server.myState
    //#input(void registerCallbacks()): this.server.myState.__Tag
    //#input(void registerCallbacks()): this.server.myState.state._tainted
    //#input(void registerCallbacks()): this.server.parser
    //#input(void registerCallbacks()): this.server.serverInfo
    //#pre[7] (void registerCallbacks()): this.channelInfo != null
    //#pre[8] (void registerCallbacks()): this.config != null
    //#pre[9] (void registerCallbacks()): this.eventHandler != null
    //#pre[10] (void registerCallbacks()): this.eventHandler.__Tag == com/dmdirc/ChannelEventHandler
    //#pre[11] (void registerCallbacks()): this.eventHandler.owner != null
    //#pre[15] (void registerCallbacks()): this.server != null
    //#pre[16] (void registerCallbacks()): this.server.__Tag == com/dmdirc/Server
    //#pre[22] (void registerCallbacks()): this.server.parser != null
    //#pre[23] (void registerCallbacks()): this.server.serverInfo != null
    //#pre[4] (void registerCallbacks()): (soft) this...server != null
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:getParser
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:getServer
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getCallbackManager
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.Class:getInterfaces
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:addCallback
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.callbacks.CallbackManager:addCallback
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.logger.Logger:appError
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:getChannelInfo
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getIRCD
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:java.lang.IllegalStateException
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getNetworkName
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getServerName
    //#unanalyzed(void registerCallbacks()): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getHost
        getConfigManager().migrate(server.getIrcd(), server.getNetwork(),
    //#Channel.java:146: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void registerCallbacks()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:146: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.config.ConfigManager:migrate(String, String, String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void registerCallbacks()
    //#    unanalyzed callee: void com.dmdirc.config.ConfigManager:migrate(String, String, String, String)
                server.getName(), channelInfo.getName());
    }
    //#Channel.java:148: end of method: void com.dmdirc.Channel.registerCallbacks()

    /**
     * Shows this channel's window.
     */
    public void show() {
        window.open();
    //#Channel.java:154: method: void com.dmdirc.Channel.show()
    //#Channel.java:154: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:open()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void show()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:open()
    //#input(void show()): this
    //#input(void show()): this.window
    //#pre[2] (void show()): this.window != null
    }
    //#Channel.java:155: end of method: void com.dmdirc.Channel.show()

    /** {@inheritDoc} */
    @Override
    public void sendLine(final String line) {
        if (server.getState() != ServerState.CONNECTED
    //#Channel.java:160: method: void com.dmdirc.Channel.sendLine(String)
    //#Channel.java:160: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:160: Warning: method not available - call not analyzed
    //#    call on ChannelInfo com.dmdirc.parser.irc.IRCParser:getChannelInfo(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: ChannelInfo com.dmdirc.parser.irc.IRCParser:getChannelInfo(String)
    //#input(void sendLine(String)): ","._tainted
    //#input(void sendLine(String)): "channelSelfMessage"._tainted
    //#input(void sendLine(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void sendLine(String)): __Descendant_Table[others]
    //#input(void sendLine(String)): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#input(void sendLine(String)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): __Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#44).__Tag
    //#input(void sendLine(String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#44).type
    //#input(void sendLine(String)): com.dmdirc.actions.metatypes.ChannelEvents__static_init.new ChannelEvents(ChannelEvents__static_init#16).__Tag
    //#input(void sendLine(String)): com/dmdirc/ChannelClientProperty.TEXT_BACKGROUND
    //#input(void sendLine(String)): com/dmdirc/ChannelClientProperty.TEXT_FOREGROUND
    //#input(void sendLine(String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/MessageTarget.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/Query.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/Query.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/Raw.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/Raw.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void sendLine(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/Server.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void sendLine(String)): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void sendLine(String)): com/dmdirc/Server.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/ServerState.CONNECTED
    //#input(void sendLine(String)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void sendLine(String)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void sendLine(String)): com/dmdirc/actions/ActionManager.listeners
    //#input(void sendLine(String)): com/dmdirc/actions/CoreActionType.CHANNEL_SELF_MESSAGE
    //#input(void sendLine(String)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void sendLine(String)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getMaxLineLength()I
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendLine(String)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void sendLine(String)): line
    //#input(void sendLine(String)): this
    //#input(void sendLine(String)): this.__Tag
    //#input(void sendLine(String)): this.channelInfo
    //#input(void sendLine(String)): this.server
    //#input(void sendLine(String)): this.server.__Tag
    //#input(void sendLine(String)): this.server.myState
    //#input(void sendLine(String)): this.server.myState.__Tag
    //#input(void sendLine(String)): this.server.myState.state
    //#input(void sendLine(String)): this.server.parser
    //#input(void sendLine(String)): this.window
    //#output(void sendLine(String)): com/dmdirc/ServerManager.me
    //#output(void sendLine(String)): new ArrayList(ServerManager#1) num objects
    //#output(void sendLine(String)): new ServerManager(getServerManager#1) num objects
    //#output(void sendLine(String)): new ServerManager(getServerManager#1).__Tag
    //#output(void sendLine(String)): new ServerManager(getServerManager#1).servers
    //#new obj(void sendLine(String)): new ArrayList(ServerManager#1)
    //#new obj(void sendLine(String)): new ServerManager(getServerManager#1)
    //#pre[9] (void sendLine(String)): this.server != null
    //#pre[10] (void sendLine(String)): this.server.__Tag == com/dmdirc/Server
    //#pre[11] (void sendLine(String)): this.server.myState != null
    //#pre[13] (void sendLine(String)): this.server.myState.__Tag == com/dmdirc/ServerStatus
    //#pre[14] (void sendLine(String)): init'ed(this.server.myState.state)
    //#pre[1] (void sendLine(String)): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#44).type != null
    //#pre[3] (void sendLine(String)): (soft) init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[7] (void sendLine(String)): (soft) this.__Tag == com/dmdirc/Channel
    //#pre[8] (void sendLine(String)): (soft) this.channelInfo != null
    //#pre[15] (void sendLine(String)): (soft) this.server.parser != null
    //#pre[18] (void sendLine(String)): (soft) this.window != null
    //#presumption(void sendLine(String)): com.dmdirc.parser.irc.ChannelInfo:getUser(...)@167 != null
    //#presumption(void sendLine(String)): com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder(...)@169 != null
    //#presumption(void sendLine(String)): com.dmdirc.util.StringTranscoder:encode(...)@169 != null
    //#post(void sendLine(String)): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void sendLine(String)): init'ed(new ArrayList(ServerManager#1) num objects)
    //#post(void sendLine(String)): init'ed(new ServerManager(getServerManager#1) num objects)
    //#post(void sendLine(String)): new ServerManager(getServerManager#1).__Tag not init'ed, if init'ed
    //#post(void sendLine(String)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getNickname
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getClient
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getIdent
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getHost
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getMap
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:getHex
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getState
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getType
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void sendLine(String)): Effects-of-calling:trigger
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getArity
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void sendLine(String)): Effects-of-calling:triggerActions
    //#unanalyzed(void sendLine(String)): Effects-of-calling:splitLine
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getUI
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getFrame
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void sendLine(String)): Effects-of-calling:readTerm
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void sendLine(String)): Effects-of-calling:parseStack
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void sendLine(String)): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void sendLine(String)): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void sendLine(String)): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getServer
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void sendLine(String)): Effects-of-calling:get
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getArgTypes
    //#unanalyzed(void sendLine(String)): Effects-of-calling:test
    //#unanalyzed(void sendLine(String)): Effects-of-calling:evaluate
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void sendLine(String)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.List:add
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.util.List:addAll
    //#unanalyzed(void sendLine(String)): Effects-of-calling:getMaxLineLength
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.String:getBytes
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.Math:min
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:substring
    //#unanalyzed(void sendLine(String)): Effects-of-calling:java.lang.StringBuilder:delete
    //#test_vector(void sendLine(String)): com.dmdirc.parser.irc.IRCParser:getChannelInfo(...)@160: Inverse{null}, Addr_Set{null}
    //#test_vector(void sendLine(String)): java.util.Iterator:hasNext(...)@169: {0}, {1}
                || server.getParser().getChannelInfo(channelInfo.getName()) == null) {
            // We're not in the channel/connected to the server
            return;
        }

        final ClientInfo me = server.getParser().getMyself();
    //#Channel.java:166: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
        final String[] details = getDetails(channelInfo.getUser(me), showColours);
    //#Channel.java:167: Warning: method not available - call not analyzed
    //#    call on ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)

        for (String part : splitLine(window.getTranscoder().encode(line))) {
    //#Channel.java:169: Warning: method not available - call not analyzed
    //#    call on StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#Channel.java:169: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.util.StringTranscoder:encode(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: String com.dmdirc.util.StringTranscoder:encode(String)
            final StringBuffer buff = new StringBuffer("channelSelfMessage");

            ActionManager.processEvent(CoreActionType.CHANNEL_SELF_MESSAGE, buff,
    //#Channel.java:172: Warning: method not available - call not analyzed
    //#    call on ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#Channel.java:172: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    basic block: bb_6
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
                    this, channelInfo.getUser(me), part);

            addLine(buff, details[0], details[1], details[2], details[3],
                    part, channelInfo);

            channelInfo.sendMessage(part);
    //#Channel.java:178: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.ChannelInfo:sendMessage(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendLine(String)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.ChannelInfo:sendMessage(String)
        }
    }
    //#Channel.java:180: end of method: void com.dmdirc.Channel.sendLine(String)

    /** {@inheritDoc} */
    @Override
    public int getMaxLineLength() {
        return server.getState() == ServerState.CONNECTED
    //#Channel.java:185: method: int com.dmdirc.Channel.getMaxLineLength()
    //#Channel.java:185: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: int getMaxLineLength()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:185: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.parser.irc.IRCParser:getMaxLength(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: int getMaxLineLength()
    //#    unanalyzed callee: int com.dmdirc.parser.irc.IRCParser:getMaxLength(String, String)
    //#input(int getMaxLineLength()): __Descendant_Table[com/dmdirc/Channel]
    //#input(int getMaxLineLength()): __Descendant_Table[others]
    //#input(int getMaxLineLength()): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(int getMaxLineLength()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(int getMaxLineLength()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(int getMaxLineLength()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(int getMaxLineLength()): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(int getMaxLineLength()): com/dmdirc/ServerState.CONNECTED
    //#input(int getMaxLineLength()): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(int getMaxLineLength()): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(int getMaxLineLength()): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(int getMaxLineLength()): this
    //#input(int getMaxLineLength()): this.__Tag
    //#input(int getMaxLineLength()): this.channelInfo
    //#input(int getMaxLineLength()): this.server
    //#input(int getMaxLineLength()): this.server.__Tag
    //#input(int getMaxLineLength()): this.server.myState
    //#input(int getMaxLineLength()): this.server.myState.__Tag
    //#input(int getMaxLineLength()): this.server.myState.state
    //#input(int getMaxLineLength()): this.server.parser
    //#output(int getMaxLineLength()): return_value
    //#pre[4] (int getMaxLineLength()): this.server != null
    //#pre[5] (int getMaxLineLength()): this.server.__Tag == com/dmdirc/Server
    //#pre[6] (int getMaxLineLength()): this.server.myState != null
    //#pre[8] (int getMaxLineLength()): this.server.myState.__Tag == com/dmdirc/ServerStatus
    //#pre[9] (int getMaxLineLength()): init'ed(this.server.myState.state)
    //#pre[2] (int getMaxLineLength()): (soft) this.__Tag == com/dmdirc/Channel
    //#pre[3] (int getMaxLineLength()): (soft) this.channelInfo != null
    //#pre[10] (int getMaxLineLength()): (soft) this.server.parser != null
    //#post(int getMaxLineLength()): init'ed(return_value)
    //#Channel.java:185: end of method: int com.dmdirc.Channel.getMaxLineLength()
                ? server.getParser().getMaxLength("PRIVMSG", getChannelInfo().getName())
                : -1;
    }

    /** {@inheritDoc} */
    @Override
    public void sendAction(final String action) {
        if (server.getState() != ServerState.CONNECTED
    //#Channel.java:193: method: void com.dmdirc.Channel.sendAction(String)
    //#Channel.java:193: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:193: Warning: method not available - call not analyzed
    //#    call on ChannelInfo com.dmdirc.parser.irc.IRCParser:getChannelInfo(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: ChannelInfo com.dmdirc.parser.irc.IRCParser:getChannelInfo(String)
    //#input(void sendAction(String)): ","._tainted
    //#input(void sendAction(String)): "channelSelfAction"._tainted
    //#input(void sendAction(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void sendAction(String)): __Descendant_Table[others]
    //#input(void sendAction(String)): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void sendAction(String)): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#input(void sendAction(String)): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendAction(String)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): action
    //#input(void sendAction(String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#45).__Tag
    //#input(void sendAction(String)): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#45).type
    //#input(void sendAction(String)): com.dmdirc.actions.metatypes.ChannelEvents__static_init.new ChannelEvents(ChannelEvents__static_init#16).__Tag
    //#input(void sendAction(String)): com/dmdirc/ChannelClientProperty.TEXT_BACKGROUND
    //#input(void sendAction(String)): com/dmdirc/ChannelClientProperty.TEXT_FOREGROUND
    //#input(void sendAction(String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void sendAction(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void sendAction(String)): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void sendAction(String)): com/dmdirc/ServerState.CONNECTED
    //#input(void sendAction(String)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void sendAction(String)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void sendAction(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void sendAction(String)): com/dmdirc/actions/ActionManager.listeners
    //#input(void sendAction(String)): com/dmdirc/actions/CoreActionType.CHANNEL_SELF_ACTION
    //#input(void sendAction(String)): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void sendAction(String)): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void sendAction(String)): this
    //#input(void sendAction(String)): this.__Tag
    //#input(void sendAction(String)): this.channelInfo
    //#input(void sendAction(String)): this.server
    //#input(void sendAction(String)): this.server.__Tag
    //#input(void sendAction(String)): this.server.myState
    //#input(void sendAction(String)): this.server.myState.__Tag
    //#input(void sendAction(String)): this.server.myState.state
    //#input(void sendAction(String)): this.server.parser
    //#input(void sendAction(String)): this.window
    //#output(void sendAction(String)): com/dmdirc/ServerManager.me
    //#output(void sendAction(String)): new ArrayList(ServerManager#1) num objects
    //#output(void sendAction(String)): new ServerManager(getServerManager#1) num objects
    //#output(void sendAction(String)): new ServerManager(getServerManager#1).__Tag
    //#output(void sendAction(String)): new ServerManager(getServerManager#1).servers
    //#new obj(void sendAction(String)): new ArrayList(ServerManager#1)
    //#new obj(void sendAction(String)): new ServerManager(getServerManager#1)
    //#pre[12] (void sendAction(String)): this.server != null
    //#pre[13] (void sendAction(String)): this.server.__Tag == com/dmdirc/Server
    //#pre[14] (void sendAction(String)): this.server.myState != null
    //#pre[16] (void sendAction(String)): this.server.myState.__Tag == com/dmdirc/ServerStatus
    //#pre[17] (void sendAction(String)): init'ed(this.server.myState.state)
    //#pre[1] (void sendAction(String)): (soft) action != null
    //#pre[5] (void sendAction(String)): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#45).type != null
    //#pre[7] (void sendAction(String)): (soft) init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[8] (void sendAction(String)): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[10] (void sendAction(String)): (soft) this.__Tag == com/dmdirc/Channel
    //#pre[11] (void sendAction(String)): (soft) this.channelInfo != null
    //#pre[18] (void sendAction(String)): (soft) this.server.parser != null
    //#pre[21] (void sendAction(String)): (soft) this.window != null
    //#presumption(void sendAction(String)): com.dmdirc.parser.irc.ChannelInfo:getUser(...)@200 != null
    //#presumption(void sendAction(String)): com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder(...)@211 != null
    //#presumption(void sendAction(String)): com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder(...)@214 != null
    //#post(void sendAction(String)): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void sendAction(String)): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void sendAction(String)): new ServerManager(getServerManager#1) num objects == 0, if init'ed
    //#post(void sendAction(String)): new ServerManager(getServerManager#1).__Tag not init'ed, if init'ed
    //#post(void sendAction(String)): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getNickname
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getClient
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getIdent
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getHost
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getMap
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:getHex
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getState
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getType
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void sendAction(String)): Effects-of-calling:trigger
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getArity
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void sendAction(String)): Effects-of-calling:triggerActions
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getUI
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getFrame
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void sendAction(String)): Effects-of-calling:readTerm
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void sendAction(String)): Effects-of-calling:parseStack
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void sendAction(String)): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void sendAction(String)): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void sendAction(String)): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getServer
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void sendAction(String)): Effects-of-calling:get
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getArgTypes
    //#unanalyzed(void sendAction(String)): Effects-of-calling:test
    //#unanalyzed(void sendAction(String)): Effects-of-calling:evaluate
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void sendAction(String)): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.StringBuffer:append
    //#test_vector(void sendAction(String)): com.dmdirc.parser.irc.IRCParser:getChannelInfo(...)@193: Inverse{null}, Addr_Set{null}
                || server.getParser().getChannelInfo(channelInfo.getName()) == null) {
            // We're not on the server/channel
            return;
        }

        final ClientInfo me = server.getParser().getMyself();
    //#Channel.java:199: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
        final String[] details = getDetails(channelInfo.getUser(me), showColours);
    //#Channel.java:200: Warning: method not available - call not analyzed
    //#    call on ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)

        if (server.getParser().getMaxLength("PRIVMSG", getChannelInfo().getName())
    //#Channel.java:202: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:202: Warning: method not available - call not analyzed
    //#    call on int com.dmdirc.parser.irc.IRCParser:getMaxLength(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: int com.dmdirc.parser.irc.IRCParser:getMaxLength(String, String)
                <= action.length()) {
            addLine("actionTooLong", action.length());
        } else {
            final StringBuffer buff = new StringBuffer("channelSelfAction");

            ActionManager.processEvent(CoreActionType.CHANNEL_SELF_ACTION, buff,
    //#Channel.java:208: Warning: method not available - call not analyzed
    //#    call on ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo:getUser(ClientInfo)
    //#Channel.java:208: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    basic block: bb_6
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp
                    this, channelInfo.getUser(me), action);

            addLine(buff, details[0], details[1], details[2], details[3],
    //#Channel.java:211: Warning: method not available - call not analyzed
    //#    call on StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#Channel.java:211: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.util.StringTranscoder:encode(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: String com.dmdirc.util.StringTranscoder:encode(String)
                    window.getTranscoder().encode(action), channelInfo);

            channelInfo.sendAction(window.getTranscoder().encode(action));
    //#Channel.java:214: Warning: method not available - call not analyzed
    //#    call on StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: StringTranscoder com.dmdirc.ui.interfaces.ChannelWindow:getTranscoder()
    //#Channel.java:214: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.util.StringTranscoder:encode(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: String com.dmdirc.util.StringTranscoder:encode(String)
    //#Channel.java:214: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.ChannelInfo:sendAction(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void sendAction(String)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.ChannelInfo:sendAction(String)
        }
    }
    //#Channel.java:216: end of method: void com.dmdirc.Channel.sendAction(String)

    /**
     * Returns the server object that this channel belongs to.
     *
     * @return The server object
     */
    @Override
    public Server getServer() {
        return server;
    //#Channel.java:225: method: Server com.dmdirc.Channel.getServer()
    //#input(Server getServer()): this
    //#input(Server getServer()): this.server
    //#output(Server getServer()): return_value
    //#pre[2] (Server getServer()): init'ed(this.server)
    //#post(Server getServer()): return_value == this.server
    //#post(Server getServer()): init'ed(return_value)
    //#Channel.java:225: end of method: Server com.dmdirc.Channel.getServer()
    }

    /**
     * Returns the parser's ChannelInfo object that this object is associated
     * with.
     *
     * @return The ChannelInfo object associated with this object
     */
    public ChannelInfo getChannelInfo() {
        return channelInfo;
    //#Channel.java:235: method: ChannelInfo com.dmdirc.Channel.getChannelInfo()
    //#input(ChannelInfo getChannelInfo()): this
    //#input(ChannelInfo getChannelInfo()): this.channelInfo
    //#output(ChannelInfo getChannelInfo()): return_value
    //#pre[2] (ChannelInfo getChannelInfo()): init'ed(this.channelInfo)
    //#post(ChannelInfo getChannelInfo()): return_value == this.channelInfo
    //#post(ChannelInfo getChannelInfo()): init'ed(return_value)
    //#Channel.java:235: end of method: ChannelInfo com.dmdirc.Channel.getChannelInfo()
    }

    /**
     * Sets this object's ChannelInfo reference to the one supplied. This only
     * needs to be done if the channel window (and hence this channel object)
     * has stayed open while the user has been out of the channel.
     *
     * @param newChannelInfo The new ChannelInfo object
     */
    public void setChannelInfo(final ChannelInfo newChannelInfo) {
        channelInfo = newChannelInfo;
    //#Channel.java:246: method: void com.dmdirc.Channel.setChannelInfo(ChannelInfo)
    //#input(void setChannelInfo(ChannelInfo)): ")"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "."._tainted
    //#input(void setChannelInfo(ChannelInfo)): "biz"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "com"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "getNetwork called when parser is null (state: "._tainted
    //#input(void setChannelInfo(ChannelInfo)): "info"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "net"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "on"._tainted
    //#input(void setChannelInfo(ChannelInfo)): "org"._tainted
    //#input(void setChannelInfo(ChannelInfo)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void setChannelInfo(ChannelInfo)): __Descendant_Table[others]
    //#input(void setChannelInfo(ChannelInfo)): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void setChannelInfo(ChannelInfo)): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ChannelEventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ChannelEventHandler.__Descendant_Table[others]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ChannelEventHandler.__Dispatch_Table.registerCallbacks()V
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/EventHandler]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ServerEventHandler]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Descendant_Table[others]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/EventHandler.com.dmdirc.logger.ErrorLevel.FATAL
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getIrcd()Ljava/lang/String;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getName()Ljava/lang/String;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getNetwork()Ljava/lang/String;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/Server.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ServerEventHandler.__Dispatch_Table.addCallback(Lcom/dmdirc/parser/irc/callbacks/CallbackManager;Ljava/lang/String;)V
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ServerEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ServerStatus.__Descendant_Table[com/dmdirc/ServerStatus]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ServerStatus.__Descendant_Table[others]
    //#input(void setChannelInfo(ChannelInfo)): com/dmdirc/ServerStatus.__Dispatch_Table.getState()Lcom/dmdirc/ServerState;
    //#input(void setChannelInfo(ChannelInfo)): newChannelInfo
    //#input(void setChannelInfo(ChannelInfo)): this
    //#input(void setChannelInfo(ChannelInfo)): this...__Tag
    //#input(void setChannelInfo(ChannelInfo)): this...server
    //#input(void setChannelInfo(ChannelInfo)): this...server.__Tag
    //#input(void setChannelInfo(ChannelInfo)): this.config
    //#input(void setChannelInfo(ChannelInfo)): this.eventHandler
    //#input(void setChannelInfo(ChannelInfo)): this.eventHandler.__Tag
    //#input(void setChannelInfo(ChannelInfo)): this.eventHandler.owner
    //#input(void setChannelInfo(ChannelInfo)): this.eventHandler.owner.__Tag
    //#input(void setChannelInfo(ChannelInfo)): this.server
    //#input(void setChannelInfo(ChannelInfo)): this.server.__Tag
    //#input(void setChannelInfo(ChannelInfo)): this.server.myState
    //#input(void setChannelInfo(ChannelInfo)): this.server.myState.__Tag
    //#input(void setChannelInfo(ChannelInfo)): this.server.myState.state._tainted
    //#input(void setChannelInfo(ChannelInfo)): this.server.parser
    //#input(void setChannelInfo(ChannelInfo)): this.server.serverInfo
    //#output(void setChannelInfo(ChannelInfo)): this.channelInfo
    //#pre[1] (void setChannelInfo(ChannelInfo)): newChannelInfo != null
    //#pre[8] (void setChannelInfo(ChannelInfo)): this.config != null
    //#pre[9] (void setChannelInfo(ChannelInfo)): this.eventHandler != null
    //#pre[10] (void setChannelInfo(ChannelInfo)): this.eventHandler.__Tag == com/dmdirc/ChannelEventHandler
    //#pre[11] (void setChannelInfo(ChannelInfo)): this.eventHandler.owner != null
    //#pre[15] (void setChannelInfo(ChannelInfo)): this.server != null
    //#pre[16] (void setChannelInfo(ChannelInfo)): this.server.__Tag == com/dmdirc/Server
    //#pre[22] (void setChannelInfo(ChannelInfo)): this.server.parser != null
    //#pre[23] (void setChannelInfo(ChannelInfo)): this.server.serverInfo != null
    //#pre[5] (void setChannelInfo(ChannelInfo)): (soft) this...server != null
    //#post(void setChannelInfo(ChannelInfo)): this.channelInfo == newChannelInfo
    //#post(void setChannelInfo(ChannelInfo)): this.channelInfo != null
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getConfigManager
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getParser
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getServer
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getCallbackManager
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.Object:getClass
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.Class:getInterfaces
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.Class:getName
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:startsWith
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:addCallback
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.callbacks.CallbackManager:addCallback
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.logger.Logger:appError
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getIrcd
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getNetwork
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getName
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:migrate
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:getChannelInfo
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getIRCD
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:endsWith
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:java.lang.IllegalStateException
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getNetworkName
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getServerName
    //#unanalyzed(void setChannelInfo(ChannelInfo)): Effects-of-calling:com.dmdirc.parser.irc.ServerInfo:getHost
        registerCallbacks();
    }
    //#Channel.java:248: end of method: void com.dmdirc.Channel.setChannelInfo(ChannelInfo)

    /**
     * Returns the internal window belonging to this object.
     *
     * @return This object's internal window
     */
    @Override
    public InputWindow getFrame() {
        return window;
    //#Channel.java:257: method: InputWindow com.dmdirc.Channel.getFrame()
    //#input(InputWindow getFrame()): this
    //#input(InputWindow getFrame()): this.window
    //#output(InputWindow getFrame()): return_value
    //#pre[2] (InputWindow getFrame()): init'ed(this.window)
    //#post(InputWindow getFrame()): return_value == this.window
    //#post(InputWindow getFrame()): init'ed(return_value)
    //#Channel.java:257: end of method: InputWindow com.dmdirc.Channel.getFrame()
    }

    /**
     * Returns the tab completer for this channel.
     *
     * @return This channel's tab completer
     */
    public TabCompleter getTabCompleter() {
        return tabCompleter;
    //#Channel.java:266: method: TabCompleter com.dmdirc.Channel.getTabCompleter()
    //#input(TabCompleter getTabCompleter()): this
    //#input(TabCompleter getTabCompleter()): this.tabCompleter
    //#output(TabCompleter getTabCompleter()): return_value
    //#post(TabCompleter getTabCompleter()): return_value == this.tabCompleter
    //#post(TabCompleter getTabCompleter()): init'ed(return_value)
    //#Channel.java:266: end of method: TabCompleter com.dmdirc.Channel.getTabCompleter()
    }

    /**
     * Called when we join this channel. Just needs to output a message.
     */
    public void selfJoin() {
        onChannel = true;
    //#Channel.java:273: method: void com.dmdirc.Channel.selfJoin()
    //#input(void selfJoin()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void selfJoin()): __Descendant_Table[others]
    //#input(void selfJoin()): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#input(void selfJoin()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void selfJoin()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/Invite.__Descendant_Table[com/dmdirc/Invite]
    //#input(void selfJoin()): com/dmdirc/Invite.__Descendant_Table[others]
    //#input(void selfJoin()): com/dmdirc/Invite.__Dispatch_Table.getChannel()Ljava/lang/String;
    //#input(void selfJoin()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void selfJoin()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void selfJoin()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void selfJoin()): com/dmdirc/Server.__Dispatch_Table.removeInvite(Lcom/dmdirc/Invite;)V
    //#input(void selfJoin()): com/dmdirc/Server.__Dispatch_Table.removeInvites(Ljava/lang/String;)V
    //#input(void selfJoin()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void selfJoin()): this
    //#input(void selfJoin()): this.__Tag
    //#input(void selfJoin()): this.changer
    //#input(void selfJoin()): this.channelInfo
    //#input(void selfJoin()): this.config
    //#input(void selfJoin()): this.listeners
    //#input(void selfJoin()): this.server
    //#input(void selfJoin()): this.server.__Tag
    //#input(void selfJoin()): this.server.invites
    //#input(void selfJoin()): this.server.listeners
    //#input(void selfJoin()): this.server.parser
    //#output(void selfJoin()): this.icon
    //#output(void selfJoin()): this.onChannel
    //#pre[2] (void selfJoin()): this.__Tag == com/dmdirc/Channel
    //#pre[4] (void selfJoin()): this.channelInfo != null
    //#pre[5] (void selfJoin()): this.config != null
    //#pre[6] (void selfJoin()): this.listeners != null
    //#pre[8] (void selfJoin()): this.server != null
    //#pre[9] (void selfJoin()): this.server.__Tag == com/dmdirc/Server
    //#pre[14] (void selfJoin()): this.server.parser != null
    //#pre[10] (void selfJoin()): (soft) this.server.invites != null
    //#pre[12] (void selfJoin()): (soft) this.server.listeners != null
    //#presumption(void selfJoin()): com.dmdirc.parser.irc.IRCParser:getMyself(...)@275 != null
    //#post(void selfJoin()): this.icon == &"channel"
    //#post(void selfJoin()): this.onChannel == 1
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void selfJoin()): Effects-of-calling:getFrame
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.ui.interfaces.Window:addLine
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.lang.String:equals
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.List:remove
    //#unanalyzed(void selfJoin()): Effects-of-calling:com.dmdirc.interfaces.InviteListener:inviteExpired
    //#unanalyzed(void selfJoin()): Effects-of-calling:java.util.ArrayList:iterator

        final ClientInfo me = server.getParser().getMyself();
    //#Channel.java:275: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
        addLine("channelSelfJoin", "", me.getNickname(), me.getIdent(),
    //#Channel.java:276: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getNickname()
    //#Channel.java:276: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getIdent()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getIdent()
    //#Channel.java:276: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getHost()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getHost()
    //#Channel.java:276: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
                me.getHost(), channelInfo.getName());

        setIcon("channel");

        server.removeInvites(channelInfo.getName());
    //#Channel.java:281: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void selfJoin()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    }
    //#Channel.java:282: end of method: void com.dmdirc.Channel.selfJoin()

    /**
     * Updates the title of the channel window, and of the main window if
     * appropriate.
     */
    private void updateTitle() {
        String temp = Styliser.stipControlCodes(channelInfo.getName());
    //#Channel.java:289: method: void com.dmdirc.Channel.updateTitle()
    //#Channel.java:289: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:289: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.messages.Styliser:stipControlCodes(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: String com.dmdirc.ui.messages.Styliser:stipControlCodes(String)
    //#input(void updateTitle()): " - "._tainted
    //#input(void updateTitle()): this
    //#input(void updateTitle()): this.channelInfo
    //#input(void updateTitle()): this.window
    //#pre[2] (void updateTitle()): this.channelInfo != null
    //#pre[3] (void updateTitle()): this.window != null
    //#presumption(void updateTitle()): com.dmdirc.parser.irc.ChannelInfo:getTopic(...)@291 != null
    //#test_vector(void updateTitle()): java.lang.String:isEmpty(...)@291: {1}, {0}

        if (!channelInfo.getTopic().isEmpty()) {
    //#Channel.java:291: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getTopic()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getTopic()
            temp = temp + " - " + Styliser.stipControlCodes(channelInfo.getTopic());
    //#Channel.java:292: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getTopic()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getTopic()
    //#Channel.java:292: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.messages.Styliser:stipControlCodes(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: String com.dmdirc.ui.messages.Styliser:stipControlCodes(String)
        }

        window.setTitle(temp);
    //#Channel.java:295: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:setTitle(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void updateTitle()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:setTitle(String)
    }
    //#Channel.java:296: end of method: void com.dmdirc.Channel.updateTitle()

    /**
     * Joins the specified channel. This only makes sense if used after a call
     * to part().
     */
    public void join() {
        server.getParser().joinChannel(channelInfo.getName());
    //#Channel.java:303: method: void com.dmdirc.Channel.join()
    //#Channel.java:303: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void join()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:303: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.IRCParser:joinChannel(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void join()
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser:joinChannel(String)
    //#input(void join()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void join()): __Descendant_Table[others]
    //#input(void join()): __Dispatch_Table.activateFrame()V
    //#input(void join()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void join()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void join()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void join()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void join()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void join()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void join()): this
    //#input(void join()): this.__Tag
    //#input(void join()): this.changer
    //#input(void join()): this.channelInfo
    //#input(void join()): this.config
    //#input(void join()): this.listeners
    //#input(void join()): this.server
    //#input(void join()): this.server.__Tag
    //#input(void join()): this.server.parser
    //#output(void join()): this.icon
    //#pre[2] (void join()): this.__Tag == com/dmdirc/Channel
    //#pre[4] (void join()): this.channelInfo != null
    //#pre[5] (void join()): this.config != null
    //#pre[6] (void join()): this.listeners != null
    //#pre[8] (void join()): this.server != null
    //#pre[9] (void join()): this.server.__Tag == com/dmdirc/Server
    //#pre[10] (void join()): this.server.parser != null
    //#post(void join()): this.icon == &"channel"
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void join()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void join()): Effects-of-calling:getFrame
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void join()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void join()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void join()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void join()): Effects-of-calling:com.dmdirc.ui.interfaces.Window:activateFrame
        activateFrame();

        setIcon("channel");
    }
    //#Channel.java:307: end of method: void com.dmdirc.Channel.join()

    /**
     * Parts this channel with the specified message. Parting does NOT close the
     * channel window.
     *
     * @param reason The reason for parting the channel
     */
    public void part(final String reason) {
        if (server != null && server.getParser() != null) {
    //#Channel.java:316: method: void com.dmdirc.Channel.part(String)
    //#input(void part(String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void part(String)): __Descendant_Table[others]
    //#input(void part(String)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): __Dispatch_Table.resetWindow()V
    //#input(void part(String)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void part(String)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void part(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void part(String)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void part(String)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void part(String)): reason
    //#input(void part(String)): this
    //#input(void part(String)): this.__Tag
    //#input(void part(String)): this.changer
    //#input(void part(String)): this.channelInfo
    //#input(void part(String)): this.config
    //#input(void part(String)): this.listeners
    //#input(void part(String)): this.server
    //#input(void part(String)): this.server.__Tag
    //#input(void part(String)): this.server.parser
    //#input(void part(String)): this.window
    //#output(void part(String)): this.icon
    //#output(void part(String)): this.onChannel
    //#pre[7] (void part(String)): this.__Tag == com/dmdirc/Channel
    //#pre[10] (void part(String)): this.config != null
    //#pre[11] (void part(String)): this.listeners != null
    //#pre[13] (void part(String)): init'ed(this.server)
    //#pre[16] (void part(String)): this.window != null
    //#pre[9] (void part(String)): (soft) this.channelInfo != null
    //#pre[14] (void part(String)): (soft) this.server.__Tag == com/dmdirc/Server
    //#pre[15] (void part(String)): (soft) init'ed(this.server.parser)
    //#post(void part(String)): this.icon == &"channel-inactive"
    //#post(void part(String)): this.onChannel == 0
    //#unanalyzed(void part(String)): Effects-of-calling:setIcon
    //#unanalyzed(void part(String)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void part(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void part(String)): Effects-of-calling:getFrame
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void part(String)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void part(String)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void part(String)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void part(String)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#test_vector(void part(String)): this.server: Addr_Set{null}, Inverse{null}
    //#test_vector(void part(String)): this.server.parser: Addr_Set{null}, Inverse{null}
            server.getParser().partChannel(channelInfo.getName(), reason);
    //#Channel.java:317: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void part(String)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:317: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.IRCParser:partChannel(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void part(String)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser:partChannel(String, String)
        }

        resetWindow();
    }
    //#Channel.java:321: end of method: void com.dmdirc.Channel.part(String)

    /**
     * Resets the window state after the client has left a channel.
     */
    public void resetWindow() {
        onChannel = false;
    //#Channel.java:327: method: void com.dmdirc.Channel.resetWindow()
    //#Channel.java:327: Warning: suspicious precondition
    //#    The precondition for this.__Tag is not a contiguous range of values
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Channel
    //#    method: void resetWindow()
    //#    suspicious precondition index: [2]
    //#    Attribs:  Soft
    //#input(void resetWindow()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void resetWindow()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void resetWindow()): this
    //#input(void resetWindow()): this.__Tag
    //#input(void resetWindow()): this.changer
    //#input(void resetWindow()): this.config
    //#input(void resetWindow()): this.listeners
    //#input(void resetWindow()): this.window
    //#output(void resetWindow()): this.icon
    //#output(void resetWindow()): this.onChannel
    //#pre[4] (void resetWindow()): this.config != null
    //#pre[5] (void resetWindow()): this.listeners != null
    //#pre[7] (void resetWindow()): this.window != null
    //#pre[2] (void resetWindow()): (soft) this.__Tag in {com/dmdirc/Channel, com/dmdirc/CustomWindow, com/dmdirc/FrameContainer, com/dmdirc/GlobalWindow, com/dmdirc/MessageTarget, com/dmdirc/Query, com/dmdirc/Raw, com/dmdirc/Server, com/dmdirc/WritableFrameContainer, com/dmdirc/addons/dcc/DCCChatWindow, com/dmdirc/addons/dcc/DCCFrame, com/dmdirc/addons/dcc/DCCPlugin$3, com/dmdirc/addons/dcc/DCCSendWindow}
    //#post(void resetWindow()): this.icon == &"channel-inactive"
    //#post(void resetWindow()): this.onChannel == 0
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void resetWindow()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void resetWindow()): Effects-of-calling:getFrame
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void resetWindow()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void resetWindow()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void resetWindow()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void resetWindow()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener

        setIcon("channel-inactive");

        window.updateNames(new ArrayList<ChannelClientInfo>());
    //#Channel.java:331: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:updateNames(List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void resetWindow()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:updateNames(List)
    }
    //#Channel.java:332: end of method: void com.dmdirc.Channel.resetWindow()

    /** {@inheritDoc} */
    @Override
    public void windowClosing() {
        // 1: Make the window non-visible
        window.setVisible(false);
    //#Channel.java:338: method: void com.dmdirc.Channel.windowClosing()
    //#Channel.java:338: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:setVisible(bool)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:setVisible(bool)
    //#input(void windowClosing()): __Descendant_Table[com/dmdirc/Channel]
    //#input(void windowClosing()): __Descendant_Table[others]
    //#input(void windowClosing()): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowClosing()): __Dispatch_Table.part(Ljava/lang/String;)V
    //#input(void windowClosing()): __Dispatch_Table.resetWindow()V
    //#input(void windowClosing()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#41).__Tag
    //#input(void windowClosing()): com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#41).type
    //#input(void windowClosing()): com.dmdirc.actions.metatypes.ChannelEvents__static_init.new ChannelEvents(ChannelEvents__static_init#1).__Tag
    //#input(void windowClosing()): com/dmdirc/ChannelEventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void windowClosing()): com/dmdirc/ChannelEventHandler.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/ChannelEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowClosing()): com/dmdirc/ChannelEventHandler.__Dispatch_Table.unregisterCallbacks()V
    //#input(void windowClosing()): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ChannelEventHandler]
    //#input(void windowClosing()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/EventHandler]
    //#input(void windowClosing()): com/dmdirc/EventHandler.__Descendant_Table[com/dmdirc/ServerEventHandler]
    //#input(void windowClosing()): com/dmdirc/EventHandler.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/EventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void windowClosing()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/Server.__Dispatch_Table.delChannel(Ljava/lang/String;)V
    //#input(void windowClosing()): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void windowClosing()): com/dmdirc/Server.com.dmdirc.ui.input.TabCompletionType.CHANNEL
    //#input(void windowClosing()): com/dmdirc/ServerEventHandler.__Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#input(void windowClosing()): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/actions/ActionManager.killSwitch
    //#input(void windowClosing()): com/dmdirc/actions/ActionManager.listeners
    //#input(void windowClosing()): com/dmdirc/actions/CoreActionType.CHANNEL_CLOSED
    //#input(void windowClosing()): com/dmdirc/actions/CoreActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionMetaType]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ActionEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ChannelEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ClientEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/PluginEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/QueryEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/actions/metatypes/ServerEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCEvents]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionMetaType.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/CoreActionType]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/actions/interfaces/ActionType]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[com/dmdirc/addons/dcc/actions/DCCActions]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionType.__Descendant_Table[others]
    //#input(void windowClosing()): com/dmdirc/actions/interfaces/ActionType.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/ActionEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/ChannelEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/ClientEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/PluginEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/QueryEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/actions/metatypes/ServerEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void windowClosing()): com/dmdirc/addons/dcc/actions/DCCActions.__Dispatch_Table.getType()Lcom/dmdirc/actions/interfaces/ActionMetaType;
    //#input(void windowClosing()): com/dmdirc/addons/dcc/actions/DCCEvents.__Dispatch_Table.getArity()I
    //#input(void windowClosing()): this
    //#input(void windowClosing()): this...__Tag
    //#input(void windowClosing()): this...server
    //#input(void windowClosing()): this...server.__Tag
    //#input(void windowClosing()): this.__Tag
    //#input(void windowClosing()): this.changer
    //#input(void windowClosing()): this.channelInfo
    //#input(void windowClosing()): this.config
    //#input(void windowClosing()): this.eventHandler
    //#input(void windowClosing()): this.eventHandler.__Tag
    //#input(void windowClosing()): this.eventHandler.owner
    //#input(void windowClosing()): this.eventHandler.owner.__Tag
    //#input(void windowClosing()): this.listeners
    //#input(void windowClosing()): this.onChannel
    //#input(void windowClosing()): this.server
    //#input(void windowClosing()): this.server.__Tag
    //#input(void windowClosing()): this.server.channels
    //#input(void windowClosing()): this.server.converter
    //#input(void windowClosing()): this.server.parser
    //#input(void windowClosing()): this.server.tabCompleter
    //#input(void windowClosing()): this.window
    //#output(void windowClosing()): com/dmdirc/ServerManager.me
    //#output(void windowClosing()): new ArrayList(ServerManager#1) num objects
    //#output(void windowClosing()): new ServerManager(getServerManager#1) num objects
    //#output(void windowClosing()): new ServerManager(getServerManager#1).__Tag
    //#output(void windowClosing()): new ServerManager(getServerManager#1).servers
    //#output(void windowClosing()): this.icon
    //#output(void windowClosing()): this.onChannel
    //#output(void windowClosing()): this.server
    //#output(void windowClosing()): this.window
    //#new obj(void windowClosing()): new ArrayList(ServerManager#1)
    //#new obj(void windowClosing()): new ServerManager(getServerManager#1)
    //#pre[3] (void windowClosing()): init'ed(com/dmdirc/actions/ActionManager.killSwitch)
    //#pre[6] (void windowClosing()): init'ed(this.onChannel)
    //#pre[7] (void windowClosing()): this.server != null
    //#pre[8] (void windowClosing()): this.window != null
    //#pre[16] (void windowClosing()): this.channelInfo != null
    //#pre[18] (void windowClosing()): this.eventHandler != null
    //#pre[19] (void windowClosing()): this.eventHandler.__Tag == com/dmdirc/ChannelEventHandler
    //#pre[20] (void windowClosing()): this.eventHandler.owner != null
    //#pre[26] (void windowClosing()): this.server.__Tag == com/dmdirc/Server
    //#pre[27] (void windowClosing()): this.server.channels != null
    //#pre[28] (void windowClosing()): this.server.converter != null
    //#pre[29] (void windowClosing()): init'ed(this.server.parser)
    //#pre[30] (void windowClosing()): this.server.tabCompleter != null
    //#pre[1] (void windowClosing()): (soft) com.dmdirc.actions.CoreActionType__static_init.new CoreActionType(CoreActionType__static_init#41).type != null
    //#pre[4] (void windowClosing()): (soft) init'ed(com/dmdirc/ServerManager.me)
    //#pre[11] (void windowClosing()): (soft) this...server != null
    //#pre[14] (void windowClosing()): (soft) this.__Tag == com/dmdirc/Channel
    //#pre[17] (void windowClosing()): (soft) this.config != null
    //#pre[24] (void windowClosing()): (soft) this.listeners != null
    //#presumption(void windowClosing()): com.dmdirc.parser.irc.IRCParser:getCallbackManager(...)@344 != null
    //#post(void windowClosing()): com/dmdirc/ServerManager.me == old com/dmdirc/ServerManager.me
    //#post(void windowClosing()): this.icon == One-of{old this.icon, &"channel-inactive"}
    //#post(void windowClosing()): this.onChannel == 0
    //#post(void windowClosing()): this.server == null
    //#post(void windowClosing()): this.window == null
    //#post(void windowClosing()): new ArrayList(ServerManager#1) num objects == undefined
    //#post(void windowClosing()): new ArrayList(ServerManager#1) num objects == 0, if init'ed
    //#post(void windowClosing()): new ServerManager(getServerManager#1) num objects == new ArrayList(ServerManager#1) num objects
    //#post(void windowClosing()): new ServerManager(getServerManager#1).__Tag == new ArrayList(ServerManager#1) num objects
    //#post(void windowClosing()): new ServerManager(getServerManager#1).servers == undefined
    //#post(void windowClosing()): new ServerManager(getServerManager#1).servers == null
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void windowClosing()): Effects-of-calling:setIcon
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void windowClosing()): Effects-of-calling:getState
    //#unanalyzed(void windowClosing()): Effects-of-calling:getParser
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.logger.Logger:assertTrue
    //#unanalyzed(void windowClosing()): Effects-of-calling:getType
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.util.MapList:containsKey
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.util.MapList:get
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.ArrayList:iterator
    //#unanalyzed(void windowClosing()): Effects-of-calling:trigger
    //#unanalyzed(void windowClosing()): Effects-of-calling:getArity
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.interfaces.ActionListener:processEvent
    //#unanalyzed(void windowClosing()): Effects-of-calling:triggerActions
    //#unanalyzed(void windowClosing()): Effects-of-calling:getServer
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:getCallbackManager
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.parser.irc.callbacks.CallbackManager:delAllCallback
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.parser.irc.IRCParser:partChannel
    //#unanalyzed(void windowClosing()): Effects-of-calling:getUI
    //#unanalyzed(void windowClosing()): Effects-of-calling:getFrame
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.actions.ConditionTree$OPERATION:ordinal
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.List:size
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:pollFirst
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Character:instanceof
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Character:charValue
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:isEmpty
    //#unanalyzed(void windowClosing()): Effects-of-calling:readTerm
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.ArrayDeque
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:pollLast
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:addFirst
    //#unanalyzed(void windowClosing()): Effects-of-calling:parseStack
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:poll
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:add
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Deque:size
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.String:valueOf
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Integer:parseInt
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder:length
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.config.IdentityManager:getGlobalConfig
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.config.ConfigManager:getOptions
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder:indexOf
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuilder:replace
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Map:entrySet
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Set:iterator
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Map$Entry:getKey
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Map$Entry:getValue
    //#unanalyzed(void windowClosing()): Effects-of-calling:[Ljava.lang.String;:instanceof
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.String:instanceof
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer:length
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer:insert
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer:toString
    //#unanalyzed(void windowClosing()): Effects-of-calling:doServerSubstitutions
    //#unanalyzed(void windowClosing()): Effects-of-calling:doComponentSubstitutions
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ServerState:equals
    //#unanalyzed(void windowClosing()): Effects-of-calling:getCompatibleComponents
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.Object:toString
    //#unanalyzed(void windowClosing()): Effects-of-calling:get
    //#unanalyzed(void windowClosing()): Effects-of-calling:getArgTypes
    //#unanalyzed(void windowClosing()): Effects-of-calling:test
    //#unanalyzed(void windowClosing()): Effects-of-calling:evaluate
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.interfaces.UIController:getActiveWindow
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:instanceof
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.List:get
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.commandparser.parsers.GlobalCommandParser:getGlobalCommandParser
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.interfaces.InputWindow:getCommandParser
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.commandparser.parsers.CommandParser:parseCommand
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer:setLength
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.lang.StringBuffer:append
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.ui.input.TabCompleter:removeEntry
    //#unanalyzed(void windowClosing()): Effects-of-calling:com.dmdirc.parser.irc.IRCStringConverter:toLowerCase
    //#unanalyzed(void windowClosing()): Effects-of-calling:java.util.Map:remove
    //#test_vector(void windowClosing()): this.onChannel: {0}, {1}
    //#test_vector(void windowClosing()): this.server.parser: Addr_Set{null}, Inverse{null}

        // 2: Remove any callbacks or listeners
        eventHandler.unregisterCallbacks();

        if (server.getParser() != null) {
            server.getParser().getCallbackManager().delAllCallback(eventHandler);
    //#Channel.java:344: Warning: method not available - call not analyzed
    //#    call on CallbackManager com.dmdirc.parser.irc.IRCParser:getCallbackManager()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: CallbackManager com.dmdirc.parser.irc.IRCParser:getCallbackManager()
    //#Channel.java:344: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.callbacks.CallbackManager:delAllCallback(ICallbackInterface)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: void com.dmdirc.parser.irc.callbacks.CallbackManager:delAllCallback(ICallbackInterface)
        }

        // 3: Trigger any actions neccessary
        if (onChannel) {
            part(getConfigManager().getOption("general", "partmessage"));
    //#Channel.java:349: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.config.ConfigManager:getOption(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: String com.dmdirc.config.ConfigManager:getOption(String, String)
        }

        // 4: Trigger action for the window closing
        ActionManager.processEvent(CoreActionType.CHANNEL_CLOSED, null, this);
    //#Channel.java:353: ?!precondition failure
    //#    com/dmdirc/actions/ActionManager.processEvent: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    basic block: bb_5
    //#    assertion: (soft) undefined in {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    callee: void com/dmdirc/actions/ActionManager.processEvent(ActionType, StringBuffer, Object[])
    //#    callee assertion: (soft) type.type.__Tag in {com/dmdirc/actions/interfaces/ActionMetaType, com/dmdirc/actions/metatypes/ActionEvents, com/dmdirc/actions/metatypes/ChannelEvents, com/dmdirc/actions/metatypes/ClientEvents, com/dmdirc/actions/metatypes/PluginEvents, com/dmdirc/actions/metatypes/QueryEvents, com/dmdirc/actions/metatypes/ServerEvents, com/dmdirc/addons/dcc/actions/DCCEvents}
    //#    callee file: ActionManager.java
    //#    callee precondition index: [29]
    //#    callee srcpos: 365
    //#    VN: undefined
    //#    Expected: {340_736, 341_760, 342_528, 343_040, 343_552, 344_064, 344_576, 362_496}
    //#    Bad: {0, Invalid}
    //#    Attribs:  Int  Bad singleton  Bad overlaps +/-1000  Soft  Bad < Exp

        // 5: Inform any parents that the window is closing
        server.delChannel(channelInfo.getName());
    //#Channel.java:356: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()

        // 6: Remove the window from the window manager
        WindowManager.removeWindow(window);
    //#Channel.java:359: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.WindowManager:removeWindow(Window)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void windowClosing()
    //#    unanalyzed callee: void com.dmdirc.ui.WindowManager:removeWindow(Window)

        // 7: Remove any references to the window and parents
        window = null; // NOPMD
        server = null; // NOPMD
    }
    //#Channel.java:364: end of method: void com.dmdirc.Channel.windowClosing()

    /**
     * Called every {general.whotime} seconds to check if the channel needs
     * to send a who request.
     */
    public void checkWho() {
        if (onChannel && sendWho) {
    //#Channel.java:371: method: void com.dmdirc.Channel.checkWho()
    //#input(void checkWho()): "WHO :"._tainted
    //#input(void checkWho()): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void checkWho()): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void checkWho()): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void checkWho()): this
    //#input(void checkWho()): this.channelInfo
    //#input(void checkWho()): this.onChannel
    //#input(void checkWho()): this.server
    //#input(void checkWho()): this.server.__Tag
    //#input(void checkWho()): this.server.parser
    //#pre[3] (void checkWho()): init'ed(this.onChannel)
    //#pre[2] (void checkWho()): (soft) this.channelInfo != null
    //#pre[5] (void checkWho()): (soft) this.server != null
    //#pre[6] (void checkWho()): (soft) this.server.__Tag == com/dmdirc/Server
    //#pre[7] (void checkWho()): (soft) this.server.parser != null
    //#test_vector(void checkWho()): this.onChannel: {0}, {1}
    //#test_vector(void checkWho()): this.sendWho: {0}, {1}
            server.getParser().sendLine("WHO :" + channelInfo.getName());
    //#Channel.java:372: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void checkWho()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:372: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.IRCParser:sendLine(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void checkWho()
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser:sendLine(String)
        }
    }
    //#Channel.java:374: end of method: void com.dmdirc.Channel.checkWho()

    /**
     * Adds a ChannelClient to this Channel.
     *
     * @param client The client to be added
     */
    public void addClient(final ChannelClientInfo client) {
        window.addName(client);
    //#Channel.java:382: method: void com.dmdirc.Channel.addClient(ChannelClientInfo)
    //#Channel.java:382: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:addName(ChannelClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void addClient(ChannelClientInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:addName(ChannelClientInfo)
    //#input(void addClient(ChannelClientInfo)): client
    //#input(void addClient(ChannelClientInfo)): com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK
    //#input(void addClient(ChannelClientInfo)): this
    //#input(void addClient(ChannelClientInfo)): this.tabCompleter
    //#input(void addClient(ChannelClientInfo)): this.window
    //#pre[1] (void addClient(ChannelClientInfo)): client != null
    //#pre[3] (void addClient(ChannelClientInfo)): this.tabCompleter != null
    //#pre[4] (void addClient(ChannelClientInfo)): this.window != null
    //#presumption(void addClient(ChannelClientInfo)): init'ed(com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK)
        tabCompleter.addEntry(TabCompletionType.CHANNEL_NICK, client.getNickname());
    //#Channel.java:383: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void addClient(ChannelClientInfo)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#Channel.java:383: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void addClient(ChannelClientInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
    }
    //#Channel.java:384: end of method: void com.dmdirc.Channel.addClient(ChannelClientInfo)

    /**
     * Removes the specified ChannelClient from this channel.
     *
     * @param client The client to be removed
     */
    public void removeClient(final ChannelClientInfo client) {
        window.removeName(client);
    //#Channel.java:392: method: void com.dmdirc.Channel.removeClient(ChannelClientInfo)
    //#Channel.java:392: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:removeName(ChannelClientInfo)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void removeClient(ChannelClientInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:removeName(ChannelClientInfo)
    //#input(void removeClient(ChannelClientInfo)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void removeClient(ChannelClientInfo)): __Descendant_Table[others]
    //#input(void removeClient(ChannelClientInfo)): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): __Dispatch_Table.resetWindow()V
    //#input(void removeClient(ChannelClientInfo)): client
    //#input(void removeClient(ChannelClientInfo)): com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/CustomWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/CustomWindow]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/FrameContainer]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/GlobalWindow]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/MessageTarget]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Query]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Raw]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Server]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/WritableFrameContainer]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCChatWindow]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCFrame]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCPlugin$3]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/addons/dcc/DCCSendWindow]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Descendant_Table[others]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/FrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/GlobalWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/MessageTarget.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Query.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Raw.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Server.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/WritableFrameContainer.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/addons/dcc/DCCChatWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/addons/dcc/DCCFrame.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/addons/dcc/DCCPlugin$3.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): com/dmdirc/addons/dcc/DCCSendWindow.__Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#input(void removeClient(ChannelClientInfo)): this
    //#input(void removeClient(ChannelClientInfo)): this.__Tag
    //#input(void removeClient(ChannelClientInfo)): this.changer
    //#input(void removeClient(ChannelClientInfo)): this.config
    //#input(void removeClient(ChannelClientInfo)): this.listeners
    //#input(void removeClient(ChannelClientInfo)): this.server
    //#input(void removeClient(ChannelClientInfo)): this.server.__Tag
    //#input(void removeClient(ChannelClientInfo)): this.server.parser
    //#input(void removeClient(ChannelClientInfo)): this.tabCompleter
    //#input(void removeClient(ChannelClientInfo)): this.window
    //#output(void removeClient(ChannelClientInfo)): this.icon
    //#output(void removeClient(ChannelClientInfo)): this.onChannel
    //#pre[1] (void removeClient(ChannelClientInfo)): client != null
    //#pre[10] (void removeClient(ChannelClientInfo)): this.server != null
    //#pre[11] (void removeClient(ChannelClientInfo)): this.server.__Tag == com/dmdirc/Server
    //#pre[12] (void removeClient(ChannelClientInfo)): this.server.parser != null
    //#pre[13] (void removeClient(ChannelClientInfo)): this.tabCompleter != null
    //#pre[14] (void removeClient(ChannelClientInfo)): this.window != null
    //#pre[5] (void removeClient(ChannelClientInfo)): (soft) this.__Tag == com/dmdirc/Channel
    //#pre[7] (void removeClient(ChannelClientInfo)): (soft) this.config != null
    //#pre[8] (void removeClient(ChannelClientInfo)): (soft) this.listeners != null
    //#presumption(void removeClient(ChannelClientInfo)): com.dmdirc.parser.irc.ChannelClientInfo:getClient(...)@395 != null
    //#presumption(void removeClient(ChannelClientInfo)): init'ed(com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK)
    //#post(void removeClient(ChannelClientInfo)): this.icon == One-of{old this.icon, &"channel-inactive"}
    //#post(void removeClient(ChannelClientInfo)): possibly_updated(this.onChannel)
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:setIcon
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:java.util.ArrayList
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.ui.IconManager:getIconManager
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.ui.IconManager:getIcon
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:getFrame
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.util.ListenerList:get
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:java.util.List:iterator
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.interfaces.IconChangeListener:iconChanged
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:removeListener
    //#unanalyzed(void removeClient(ChannelClientInfo)): Effects-of-calling:com.dmdirc.config.ConfigManager:addChangeListener
    //#test_vector(void removeClient(ChannelClientInfo)): java.lang.Object:equals(...)@395: {0}, {1}
        tabCompleter.removeEntry(TabCompletionType.CHANNEL_NICK, client.getNickname());
    //#Channel.java:393: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void removeClient(ChannelClientInfo)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#Channel.java:393: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:removeEntry(TabCompletionType, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void removeClient(ChannelClientInfo)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:removeEntry(TabCompletionType, String)

        if (client.getClient().equals(server.getParser().getMyself())) {
    //#Channel.java:395: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void removeClient(ChannelClientInfo)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#Channel.java:395: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void removeClient(ChannelClientInfo)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.IRCParser:getMyself()
            resetWindow();
        }
    }
    //#Channel.java:398: end of method: void com.dmdirc.Channel.removeClient(ChannelClientInfo)

    /**
     * Replaces the list of known clients on this channel with the specified
     * one.
     *
     * @param clients The list of clients to use
     */
    public void setClients(final List<ChannelClientInfo> clients) {
        window.updateNames(clients);
    //#Channel.java:407: method: void com.dmdirc.Channel.setClients(List)
    //#Channel.java:407: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:updateNames(List)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setClients(List)
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:updateNames(List)
    //#input(void setClients(List)): clients
    //#input(void setClients(List)): com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK
    //#input(void setClients(List)): this
    //#input(void setClients(List)): this.tabCompleter
    //#input(void setClients(List)): this.window
    //#pre[1] (void setClients(List)): clients != null
    //#pre[3] (void setClients(List)): this.tabCompleter != null
    //#pre[4] (void setClients(List)): this.window != null
    //#presumption(void setClients(List)): init'ed(com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK)
    //#presumption(void setClients(List)): java.util.Iterator:next(...)@411 != null
    //#test_vector(void setClients(List)): java.util.Iterator:hasNext(...)@411: {0}, {1}

        tabCompleter.clear(TabCompletionType.CHANNEL_NICK);
    //#Channel.java:409: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:clear(TabCompletionType)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setClients(List)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:clear(TabCompletionType)

        for (ChannelClientInfo client : clients) {
            tabCompleter.addEntry(TabCompletionType.CHANNEL_NICK, client.getNickname());
    //#Channel.java:412: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setClients(List)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#Channel.java:412: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setClients(List)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
        }
    }
    //#Channel.java:414: end of method: void com.dmdirc.Channel.setClients(List)

    /**
     * Renames a client that is in this channel.
     *
     * @param oldName The old nickname of the client
     * @param newName The new nickname of the client
     */
    public void renameClient(final String oldName, final String newName) {
        tabCompleter.removeEntry(TabCompletionType.CHANNEL_NICK, oldName);
    //#Channel.java:423: method: void com.dmdirc.Channel.renameClient(String, String)
    //#Channel.java:423: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:removeEntry(TabCompletionType, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void renameClient(String, String)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:removeEntry(TabCompletionType, String)
    //#input(void renameClient(String, String)): __Descendant_Table[com/dmdirc/Channel]
    //#input(void renameClient(String, String)): __Descendant_Table[others]
    //#input(void renameClient(String, String)): __Dispatch_Table.refreshClients()V
    //#input(void renameClient(String, String)): com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK
    //#input(void renameClient(String, String)): newName
    //#input(void renameClient(String, String)): oldName
    //#input(void renameClient(String, String)): this
    //#input(void renameClient(String, String)): this.__Tag
    //#input(void renameClient(String, String)): this.tabCompleter
    //#input(void renameClient(String, String)): this.window
    //#pre[4] (void renameClient(String, String)): this.__Tag == com/dmdirc/Channel
    //#pre[5] (void renameClient(String, String)): this.tabCompleter != null
    //#pre[6] (void renameClient(String, String)): this.window != null
    //#presumption(void renameClient(String, String)): init'ed(com.dmdirc.ui.input.TabCompletionType.CHANNEL_NICK)
    //#unanalyzed(void renameClient(String, String)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:updateNames
        tabCompleter.addEntry(TabCompletionType.CHANNEL_NICK, newName);
    //#Channel.java:424: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void renameClient(String, String)
    //#    unanalyzed callee: void com.dmdirc.ui.input.TabCompleter:addEntry(TabCompletionType, String)
        refreshClients();
    }
    //#Channel.java:426: end of method: void com.dmdirc.Channel.renameClient(String, String)

    /**
     * Refreshes the list of clients stored by this channel. Should be called
     * when (visible) user modes or nicknames change.
     */
    public void refreshClients() {
        window.updateNames();
    //#Channel.java:433: method: void com.dmdirc.Channel.refreshClients()
    //#Channel.java:433: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.ui.interfaces.ChannelWindow:updateNames()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void refreshClients()
    //#    unanalyzed callee: void com.dmdirc.ui.interfaces.ChannelWindow:updateNames()
    //#input(void refreshClients()): this
    //#input(void refreshClients()): this.window
    //#pre[2] (void refreshClients()): this.window != null
    }
    //#Channel.java:434: end of method: void com.dmdirc.Channel.refreshClients()

    /**
     * Returns a string containing the most important mode for the specified
     * client.
     *
     * @param channelClient The channel client to check.
     * @return A string containing the most important mode, or an empty string
     * if there are no (known) modes.
     */
    private String getModes(final ChannelClientInfo channelClient) {
        if (channelClient == null || !showModePrefix) {
    //#Channel.java:445: method: String com.dmdirc.Channel.getModes(ChannelClientInfo)
    //#input(String getModes(ChannelClientInfo)): channelClient
    //#input(String getModes(ChannelClientInfo)): this
    //#output(String getModes(ChannelClientInfo)): return_value
    //#post(String getModes(ChannelClientInfo)): init'ed(return_value)
    //#test_vector(String getModes(ChannelClientInfo)): channelClient: Addr_Set{null}, Inverse{null}
    //#test_vector(String getModes(ChannelClientInfo)): this.showModePrefix: {1}, {0}
            return "";
        } else {
            return channelClient.getImportantModePrefix();
    //#Channel.java:448: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String getModes(ChannelClientInfo)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix()
    //#Channel.java:448: end of method: String com.dmdirc.Channel.getModes(ChannelClientInfo)
        }
    }

    /**
     * Adds the specified topic to this channel's topic list.
     *
     * @param topic The topic to be added.
     */
    public void addTopic(final Topic topic) {
        topics.add(topic);
    //#Channel.java:458: method: void com.dmdirc.Channel.addTopic(Topic)
    //#Channel.java:458: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.util.RollingList:add(Object)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void addTopic(Topic)
    //#    unanalyzed callee: bool com.dmdirc.util.RollingList:add(Object)
    //#input(void addTopic(Topic)): " - "._tainted
    //#input(void addTopic(Topic)): this
    //#input(void addTopic(Topic)): this.channelInfo
    //#input(void addTopic(Topic)): this.topics
    //#input(void addTopic(Topic)): this.window
    //#input(void addTopic(Topic)): topic
    //#pre[2] (void addTopic(Topic)): this.channelInfo != null
    //#pre[3] (void addTopic(Topic)): this.topics != null
    //#pre[4] (void addTopic(Topic)): this.window != null
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getName
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:com.dmdirc.ui.messages.Styliser:stipControlCodes
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:com.dmdirc.parser.irc.ChannelInfo:getTopic
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void addTopic(Topic)): Effects-of-calling:com.dmdirc.ui.interfaces.ChannelWindow:setTitle
        updateTitle();
    }
    //#Channel.java:460: end of method: void com.dmdirc.Channel.addTopic(Topic)

    /**
     * Retrieve the topics that have been seen on this channel.
     *
     * @return A list of topics that have been seen on this channel, including
     * the current one.
     */
    public List<Topic> getTopics() {
        return topics.getList();
    //#Channel.java:469: method: List com.dmdirc.Channel.getTopics()
    //#Channel.java:469: Warning: method not available - call not analyzed
    //#    call on List com.dmdirc.util.RollingList:getList()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: List getTopics()
    //#    unanalyzed callee: List com.dmdirc.util.RollingList:getList()
    //#input(List getTopics()): this
    //#input(List getTopics()): this.topics
    //#output(List getTopics()): return_value
    //#pre[2] (List getTopics()): this.topics != null
    //#post(List getTopics()): init'ed(return_value)
    //#Channel.java:469: end of method: List com.dmdirc.Channel.getTopics()
    }

    /**
     * Returns this channel's name.
     *
     * @return A string representation of this channel (i.e., its name)
     */
    @Override
    public String toString() {
        return channelInfo.getName();
    //#Channel.java:479: method: String com.dmdirc.Channel.toString()
    //#Channel.java:479: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String toString()
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#input(String toString()): this
    //#input(String toString()): this.channelInfo
    //#output(String toString()): return_value
    //#pre[2] (String toString()): this.channelInfo != null
    //#post(String toString()): init'ed(return_value)
    //#Channel.java:479: end of method: String com.dmdirc.Channel.toString()
    }

    /** {@inheritDoc} */
    @Override
    public void configChanged(final String domain, final String key) {
        if ("sendwho".equals(key)) {
    //#Channel.java:485: method: void com.dmdirc.Channel.configChanged(String, String)
    //#input(void configChanged(String, String)): key
    //#input(void configChanged(String, String)): this
    //#input(void configChanged(String, String)): this.config
    //#output(void configChanged(String, String)): this.sendWho
    //#output(void configChanged(String, String)): this.showColours
    //#output(void configChanged(String, String)): this.showModePrefix
    //#pre[6] (void configChanged(String, String)): (soft) this.config != null
    //#post(void configChanged(String, String)): possibly_updated(this.sendWho)
    //#post(void configChanged(String, String)): possibly_updated(this.showColours)
    //#post(void configChanged(String, String)): possibly_updated(this.showModePrefix)
    //#test_vector(void configChanged(String, String)): java.lang.String:equals(...)@485: {0}, {1}
    //#test_vector(void configChanged(String, String)): java.lang.String:equals(...)@487: {0}, {1}
    //#test_vector(void configChanged(String, String)): java.lang.String:equals(...)@489: {0}, {1}
            sendWho = getConfigManager().getOptionBool("channel", "sendwho");
    //#Channel.java:486: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        } else if ("showmodeprefix".equals(key)) {
            showModePrefix = getConfigManager().getOptionBool("channel", "showmodeprefix");
    //#Channel.java:488: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        } else if ("shownickcoloursintext".equals(key)) {
            showColours = getConfigManager().getOptionBool("ui", "shownickcoloursintext");
    //#Channel.java:490: Warning: method not available - call not analyzed
    //#    call on bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void configChanged(String, String)
    //#    unanalyzed callee: bool com.dmdirc.config.ConfigManager:getOptionBool(String, String)
        }
    }
    //#Channel.java:492: end of method: void com.dmdirc.Channel.configChanged(String, String)

    /**
     * Returns a string[] containing the nickname/ident/host of a channel
     * client.
     *
     * @param client The channel client to check
     * @param showColours Whether or not to show colours
     * @return A string[] containing displayable components
     */
    private String[] getDetails(final ChannelClientInfo client,
            final boolean showColours) {
        if (client == null) {
    //#Channel.java:504: method: String[] com.dmdirc.Channel.getDetails(ChannelClientInfo, bool)
    //#input(String[] getDetails(ChannelClientInfo, bool)): ","._tainted
    //#input(String[] getDetails(ChannelClientInfo, bool)): client
    //#input(String[] getDetails(ChannelClientInfo, bool)): com/dmdirc/ChannelClientProperty.TEXT_BACKGROUND
    //#input(String[] getDetails(ChannelClientInfo, bool)): com/dmdirc/ChannelClientProperty.TEXT_FOREGROUND
    //#input(String[] getDetails(ChannelClientInfo, bool)): showColours
    //#input(String[] getDetails(ChannelClientInfo, bool)): this
    //#output(String[] getDetails(ChannelClientInfo, bool)): java.lang.StringBuilder:toString(...)._tainted
    //#output(String[] getDetails(ChannelClientInfo, bool)): new String[](getDetails#1) num objects
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value.length
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value[0]
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value[1]
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value[2]
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value[3]
    //#output(String[] getDetails(ChannelClientInfo, bool)): return_value
    //#new obj(String[] getDetails(ChannelClientInfo, bool)): java.lang.StringBuilder:toString(...)
    //#new obj(String[] getDetails(ChannelClientInfo, bool)): new String[](getDetails#1)
    //#pre[1] (String[] getDetails(ChannelClientInfo, bool)): client != null
    //#presumption(String[] getDetails(ChannelClientInfo, bool)): com.dmdirc.parser.irc.ChannelClientInfo:getClient(...)@513 != null
    //#presumption(String[] getDetails(ChannelClientInfo, bool)): com.dmdirc.parser.irc.ChannelClientInfo:getClient(...)@514 != null
    //#presumption(String[] getDetails(ChannelClientInfo, bool)): com.dmdirc.parser.irc.ChannelClientInfo:getMap(...)@517 != null
    //#post(String[] getDetails(ChannelClientInfo, bool)): java.lang.StringBuilder:toString(...)._tainted == 0
    //#post(String[] getDetails(ChannelClientInfo, bool)): return_value == &new String[](getDetails#1)
    //#post(String[] getDetails(ChannelClientInfo, bool)): new String[](getDetails#1) num objects == 1
    //#post(String[] getDetails(ChannelClientInfo, bool)): return_value.length == 4
    //#post(String[] getDetails(ChannelClientInfo, bool)): init'ed(return_value[0])
    //#post(String[] getDetails(ChannelClientInfo, bool)): return_value[1] in Addr_Set{&java.lang.StringBuilder:toString(...),&java.lang.StringBuilder:toString(...)}
    //#post(String[] getDetails(ChannelClientInfo, bool)): init'ed(return_value[2])
    //#post(String[] getDetails(ChannelClientInfo, bool)): init'ed(return_value[3])
    //#unanalyzed(String[] getDetails(ChannelClientInfo, bool)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix
    //#test_vector(String[] getDetails(ChannelClientInfo, bool)): showColours: {0}, {1}
    //#test_vector(String[] getDetails(ChannelClientInfo, bool)): java.util.Map:containsKey(...)@521: {0}, {1}
    //#test_vector(String[] getDetails(ChannelClientInfo, bool)): java.util.Map:containsKey(...)@524: {0}, {1}
            // WTF?
            throw new UnsupportedOperationException("getDetails called with"
                     + " null ChannelClientInfo");
        }

        final String[] res = new String[4];
        res[0] = getModes(client);
        res[1] = Styliser.CODE_NICKNAME + client.getNickname() + Styliser.CODE_NICKNAME;
    //#Channel.java:512: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelClientInfo:getNickname()
        res[2] = client.getClient().getIdent();
    //#Channel.java:513: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#Channel.java:513: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getIdent()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getIdent()
        res[3] = client.getClient().getHost();
    //#Channel.java:514: Warning: method not available - call not analyzed
    //#    call on ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: ClientInfo com.dmdirc.parser.irc.ChannelClientInfo:getClient()
    //#Channel.java:514: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getHost()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getHost()

        if (showColours) {
            final Map map = client.getMap();
    //#Channel.java:517: Warning: method not available - call not analyzed
    //#    call on Map com.dmdirc.parser.irc.ChannelClientInfo:getMap()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: Map com.dmdirc.parser.irc.ChannelClientInfo:getMap()
            String prefix = null;
            Color colour;

            if (map.containsKey(ChannelClientProperty.TEXT_FOREGROUND)) {
                colour = (Color) map.get(ChannelClientProperty.TEXT_FOREGROUND);
                prefix = Styliser.CODE_HEXCOLOUR + ColourManager.getHex(colour);
    //#Channel.java:523: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.messages.ColourManager:getHex(Color)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: String com.dmdirc.ui.messages.ColourManager:getHex(Color)
                if (map.containsKey(ChannelClientProperty.TEXT_BACKGROUND)) {
                    colour = (Color) map.get(ChannelClientProperty.TEXT_BACKGROUND);
                    prefix = "," + ColourManager.getHex(colour);
    //#Channel.java:526: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.ui.messages.ColourManager:getHex(Color)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: String[] getDetails(ChannelClientInfo, bool)
    //#    unanalyzed callee: String com.dmdirc.ui.messages.ColourManager:getHex(Color)
                }
            }

            if (prefix != null) {
                res[1] = prefix + res[1] + Styliser.CODE_HEXCOLOUR;
            }
        }

        return res;
    //#Channel.java:535: end of method: String[] com.dmdirc.Channel.getDetails(ChannelClientInfo, bool)
    }

    /** {@inheritDoc} */
    @Override
    protected boolean processNotificationArg(final Object arg, final List<Object> args) {
        if (arg instanceof ClientInfo) {
    //#Channel.java:541: method: bool com.dmdirc.Channel.processNotificationArg(Object, List)
    //#input(bool processNotificationArg(Object, List)): ","._tainted
    //#input(bool processNotificationArg(Object, List)): arg
    //#input(bool processNotificationArg(Object, List)): arg.__Tag
    //#input(bool processNotificationArg(Object, List)): arg.client
    //#input(bool processNotificationArg(Object, List)): arg.time
    //#input(bool processNotificationArg(Object, List)): arg.topic
    //#input(bool processNotificationArg(Object, List)): args
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/ChannelClientProperty.TEXT_BACKGROUND
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/ChannelClientProperty.TEXT_FOREGROUND
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/Topic.__Descendant_Table[com/dmdirc/Topic]
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/Topic.__Descendant_Table[others]
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/Topic.__Dispatch_Table.getClient()Ljava/lang/String;
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/Topic.__Dispatch_Table.getTime()J
    //#input(bool processNotificationArg(Object, List)): com/dmdirc/Topic.__Dispatch_Table.getTopic()Ljava/lang/String;
    //#input(bool processNotificationArg(Object, List)): this
    //#output(bool processNotificationArg(Object, List)): return_value
    //#pre[4] (bool processNotificationArg(Object, List)): (soft) arg.time in {-9_223_372_036_854_775..18_446_744_073_709_551}
    //#pre[6] (bool processNotificationArg(Object, List)): (soft) args != null
    //#post(bool processNotificationArg(Object, List)): init'ed(return_value)
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getNickname
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getImportantModePrefix
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getClient
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getIdent
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ClientInfo:getHost
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo:getMap
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(bool processNotificationArg(Object, List)): Effects-of-calling:com.dmdirc.ui.messages.ColourManager:getHex
            // Format ClientInfos

            final ClientInfo clientInfo = (ClientInfo) arg;
            args.add(clientInfo.getNickname());
    //#Channel.java:545: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getNickname()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: bool processNotificationArg(Object, List)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getNickname()
            args.add(clientInfo.getIdent());
    //#Channel.java:546: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getIdent()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: bool processNotificationArg(Object, List)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getIdent()
            args.add(clientInfo.getHost());
    //#Channel.java:547: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ClientInfo:getHost()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: bool processNotificationArg(Object, List)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ClientInfo:getHost()

            return true;
        } else if (arg instanceof ChannelClientInfo) {
            // Format ChannelClientInfos

            final ChannelClientInfo clientInfo = (ChannelClientInfo) arg;
            args.addAll(Arrays.asList(getDetails(clientInfo, showColours)));
    //#Channel.java:554: Warning: unused assignment in callee
    //#    Unused assignment to (new String[](getDetails#1)[0], new String[](getDetails#1)[1], new String[](getDetails#1)[2], new String[](getDetails#1)[3], java.lang.StringBuilder:toString(...)._tainted) in getDetails
    //#    severity: LOW
    //#    class: com.dmdirc.Channel
    //#    method: bool processNotificationArg(Object, List)

            return true;
        } else if (arg instanceof Topic) {
            // Format topics

            args.add("");
            args.addAll(Arrays.asList(ClientInfo.parseHostFull(((Topic) arg).getClient())));
    //#Channel.java:561: Warning: method not available - call not analyzed
    //#    call on String[] com.dmdirc.parser.irc.ClientInfo:parseHostFull(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: bool processNotificationArg(Object, List)
    //#    unanalyzed callee: String[] com.dmdirc.parser.irc.ClientInfo:parseHostFull(String)
            args.add(((Topic) arg).getTopic());
            args.add(((Topic) arg).getTime() * 1000);

            return true;
        } else {
            // Everything else - default formatting

            return super.processNotificationArg(arg, args);
    //#Channel.java:569: end of method: bool com.dmdirc.Channel.processNotificationArg(Object, List)
        }
    }

    /** {@inheritDoc} */
    @Override
    protected void modifyNotificationArgs(final List<Object> actionArgs,
            final List<Object> messageArgs) {
        messageArgs.add(channelInfo.getName());
    //#Channel.java:577: method: void com.dmdirc.Channel.modifyNotificationArgs(List, List)
    //#Channel.java:577: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void modifyNotificationArgs(List, List)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#input(void modifyNotificationArgs(List, List)): messageArgs
    //#input(void modifyNotificationArgs(List, List)): this
    //#input(void modifyNotificationArgs(List, List)): this.channelInfo
    //#pre[1] (void modifyNotificationArgs(List, List)): messageArgs != null
    //#pre[3] (void modifyNotificationArgs(List, List)): this.channelInfo != null
    }
    //#Channel.java:578: end of method: void com.dmdirc.Channel.modifyNotificationArgs(List, List)

    // ------------------------------------------ PARSER METHOD DELEGATION -----

    /**
     * Attempts to set the topic of this channel.
     *
     * @param topic The new topic to be used. An empty string will clear the
     * current topic
     */
    public void setTopic(final String topic) {
        server.getParser().sendLine("TOPIC " + channelInfo.getName() + " :" + topic);
    //#Channel.java:589: method: void com.dmdirc.Channel.setTopic(String)
    //#Channel.java:589: Warning: method not available - call not analyzed
    //#    call on String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setTopic(String)
    //#    unanalyzed callee: String com.dmdirc.parser.irc.ChannelInfo:getName()
    //#Channel.java:589: Warning: method not available - call not analyzed
    //#    call on void com.dmdirc.parser.irc.IRCParser:sendLine(String)
    //#    severity: INFORMATIONAL
    //#    class: com.dmdirc.Channel
    //#    method: void setTopic(String)
    //#    unanalyzed callee: void com.dmdirc.parser.irc.IRCParser:sendLine(String)
    //#input(void setTopic(String)): " :"._tainted
    //#input(void setTopic(String)): "TOPIC "._tainted
    //#input(void setTopic(String)): com/dmdirc/Server.__Descendant_Table[com/dmdirc/Server]
    //#input(void setTopic(String)): com/dmdirc/Server.__Descendant_Table[others]
    //#input(void setTopic(String)): com/dmdirc/Server.__Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#input(void setTopic(String)): this
    //#input(void setTopic(String)): this.channelInfo
    //#input(void setTopic(String)): this.server
    //#input(void setTopic(String)): this.server.__Tag
    //#input(void setTopic(String)): this.server.parser
    //#input(void setTopic(String)): topic
    //#input(void setTopic(String)): topic._tainted
    //#pre[2] (void setTopic(String)): this.channelInfo != null
    //#pre[3] (void setTopic(String)): this.server != null
    //#pre[4] (void setTopic(String)): this.server.__Tag == com/dmdirc/Server
    //#pre[5] (void setTopic(String)): this.server.parser != null
    }
    //#Channel.java:590: end of method: void com.dmdirc.Channel.setTopic(String)
}
    //#output(com.dmdirc.Channel__static_init): __Descendant_Table[com/dmdirc/Channel]
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.activateFrame()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ChannelClientInfo;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.addTopic(Lcom/dmdirc/Topic;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.checkWho()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.clearNotification()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.close()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.doNotification(Ljava/lang/String;Lcom/dmdirc/actions/interfaces/ActionType;[Ljava/lang/Object;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getDetails(Lcom/dmdirc/parser/irc/ChannelClientInfo;Z)[Ljava/lang/String;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getMaxLineLength()I
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getModes(Lcom/dmdirc/parser/irc/ChannelClientInfo;)Ljava/lang/String;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getNumLines(Ljava/lang/String;)I
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.getTopics()Ljava/util/List;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.iconUpdated()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.join()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.part(Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.refreshClients()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.registerCallbacks()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ChannelClientInfo;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.renameClient(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.resetWindow()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.selfJoin()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.setChannelInfo(Lcom/dmdirc/parser/irc/ChannelInfo;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.setClients(Ljava/util/List;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.setTopic(Ljava/lang/String;)V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.show()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.updateTitle()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.windowActivated()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.windowClosed()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.windowClosing()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.windowDeactivated()V
    //#output(com.dmdirc.Channel__static_init): __Dispatch_Table.windowOpened()V
    //#output(com.dmdirc.Channel__static_init): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#output(com.dmdirc.Channel__static_init): com/dmdirc/MessageTarget.__Descendant_Table[com/dmdirc/Channel]
    //#output(com.dmdirc.Channel__static_init): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Channel]
    //#post(com.dmdirc.Channel__static_init): __Descendant_Table[com/dmdirc/Channel] == &__Dispatch_Table
    //#post(com.dmdirc.Channel__static_init): com/dmdirc/FrameContainer.__Descendant_Table[com/dmdirc/Channel] == &__Dispatch_Table
    //#post(com.dmdirc.Channel__static_init): com/dmdirc/MessageTarget.__Descendant_Table[com/dmdirc/Channel] == &__Dispatch_Table
    //#post(com.dmdirc.Channel__static_init): com/dmdirc/WritableFrameContainer.__Descendant_Table[com/dmdirc/Channel] == &__Dispatch_Table
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.activateFrame()V == &com/dmdirc/FrameContainer.activateFrame
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ChannelClientInfo;)V == &addClient
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &com/dmdirc/FrameContainer.addIconChangeListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addLine(Ljava/lang/String;[Ljava/lang/Object;)V == &com/dmdirc/FrameContainer.addLine
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addLine(Ljava/lang/StringBuffer;[Ljava/lang/Object;)V == &com/dmdirc/FrameContainer.addLine
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &com/dmdirc/FrameContainer.addNotificationListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &com/dmdirc/FrameContainer.addSelectionListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.addTopic(Lcom/dmdirc/Topic;)V == &addTopic
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.checkWho()V == &checkWho
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.clearNotification()V == &com/dmdirc/FrameContainer.clearNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.close()V == &com/dmdirc/FrameContainer.close
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.configChanged(Ljava/lang/String;Ljava/lang/String;)V == &configChanged
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.despatchNotification(Ljava/lang/String;Ljava/lang/String;[Ljava/lang/Object;)V == &com/dmdirc/WritableFrameContainer.despatchNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.doNotification(Ljava/lang/String;Lcom/dmdirc/actions/interfaces/ActionType;[Ljava/lang/Object;)V == &com/dmdirc/WritableFrameContainer.doNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getChannelInfo()Lcom/dmdirc/parser/irc/ChannelInfo; == &getChannelInfo
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getConfigManager()Lcom/dmdirc/config/ConfigManager; == &com/dmdirc/FrameContainer.getConfigManager
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getDetails(Lcom/dmdirc/parser/irc/ChannelClientInfo;Z)[Ljava/lang/String; == &getDetails
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/InputWindow; == &getFrame
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getFrame()Lcom/dmdirc/ui/interfaces/Window; == &getFrame
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getIcon()Ljavax/swing/Icon; == &com/dmdirc/FrameContainer.getIcon
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getMaxLineLength()I == &getMaxLineLength
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getModes(Lcom/dmdirc/parser/irc/ChannelClientInfo;)Ljava/lang/String; == &getModes
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getNotification()Ljava/awt/Color; == &com/dmdirc/FrameContainer.getNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getNumLines(Ljava/lang/String;)I == &com/dmdirc/WritableFrameContainer.getNumLines
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getServer()Lcom/dmdirc/Server; == &getServer
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getTabCompleter()Lcom/dmdirc/ui/input/TabCompleter; == &getTabCompleter
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.getTopics()Ljava/util/List; == &getTopics
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.handleNotification(Ljava/lang/String;[Ljava/lang/Object;)V == &com/dmdirc/WritableFrameContainer.handleNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.iconUpdated()V == &com/dmdirc/FrameContainer.iconUpdated
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.join()V == &join
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.modifyNotificationArgs(Ljava/util/List;Ljava/util/List;)V == &modifyNotificationArgs
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.ownsFrame(Lcom/dmdirc/ui/interfaces/Window;)Z == &com/dmdirc/FrameContainer.ownsFrame
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.part(Ljava/lang/String;)V == &part
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.processNotificationArg(Ljava/lang/Object;Ljava/util/List;)Z == &processNotificationArg
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.refreshClients()V == &refreshClients
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.registerCallbacks()V == &registerCallbacks
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ChannelClientInfo;)V == &removeClient
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.removeIconChangeListener(Lcom/dmdirc/interfaces/IconChangeListener;)V == &com/dmdirc/FrameContainer.removeIconChangeListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.removeNotificationListener(Lcom/dmdirc/interfaces/NotificationListener;)V == &com/dmdirc/FrameContainer.removeNotificationListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.removeSelectionListener(Lcom/dmdirc/interfaces/SelectionListener;)V == &com/dmdirc/FrameContainer.removeSelectionListener
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.renameClient(Ljava/lang/String;Ljava/lang/String;)V == &renameClient
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.resetWindow()V == &resetWindow
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.selfJoin()V == &selfJoin
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;)V == &sendAction
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.sendLine(Ljava/lang/String;)V == &sendLine
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.sendNotification(Ljava/awt/Color;)V == &com/dmdirc/FrameContainer.sendNotification
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.setChannelInfo(Lcom/dmdirc/parser/irc/ChannelInfo;)V == &setChannelInfo
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.setClients(Ljava/util/List;)V == &setClients
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.setIcon(Ljava/lang/String;)V == &com/dmdirc/FrameContainer.setIcon
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.setTopic(Ljava/lang/String;)V == &setTopic
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.show()V == &show
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.splitLine(Ljava/lang/String;)Ljava/util/List; == &com/dmdirc/WritableFrameContainer.splitLine
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.updateTitle()V == &updateTitle
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.windowActivated()V == &com/dmdirc/FrameContainer.windowActivated
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.windowClosed()V == &com/dmdirc/FrameContainer.windowClosed
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.windowClosing()V == &windowClosing
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.windowDeactivated()V == &com/dmdirc/FrameContainer.windowDeactivated
    //#post(com.dmdirc.Channel__static_init): __Dispatch_Table.windowOpened()V == &com/dmdirc/FrameContainer.windowOpened
    //#Channel.java:: end of method: com.dmdirc.Channel.com.dmdirc.Channel__static_init
    //#Channel.java:: end of class: com.dmdirc.Channel
