//# 32 errors, 2,391 messages
//#
/*
    //#ChannelInfo.java:1:1: class: com.dmdirc.parser.irc.ChannelInfo
    //#ChannelInfo.java:1:1: method: com.dmdirc.parser.irc.ChannelInfo.com.dmdirc.parser.irc.ChannelInfo__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.parser.irc;

import java.util.ArrayList;
import java.util.Hashtable;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Queue;

/**
 * Contains Channel information.
 * 
 * @author Shane Mc Cormack
 * @author Chris Smith
 * @see IRCParser
 */
public class ChannelInfo {
	/**
	 * Boolean repreenting the status of names requests.
	 * When this is false, any new names reply will cause current known channelclients to be removed.
	 */
	private boolean bAddingNames = true;
	
	/** Unixtimestamp representing time when the channel was created. */
	private long nCreateTime = 0;
	
	/** Current known topic in the channel. */
	private String sTopic = "";
	/** Last known user to set the topic (Full host where possible). */
	private String sTopicUser = "";
	/** Unixtimestamp representing time when the topic was set. */
	private long nTopicTime = 0;
	
	/** Known boolean-modes for channel. */
	private long nModes;
	/** Reference to the parser object that owns this channel, Used for modes. */
	private final IRCParser myParser; // Reference to parser object that owns this channel. Used for Modes
	
	/** Channel Name. */
	private final String sName;
	
	/** Hashtable containing references to ChannelClients. */
	private final Map<String, ChannelClientInfo> hChannelUserList = new Hashtable<String, ChannelClientInfo>();
	/** Hashtable storing values for modes set in the channel that use parameters. */
	private final Map<Character, String> hParamModes = new Hashtable<Character, String>();
	/** Hashtable storing list modes. */
	private final Map<Character, ArrayList<ChannelListModeItem>> hListModes = new Hashtable<Character, ArrayList<ChannelListModeItem>>();
	/**
	 * LinkedList storing status of mode adding.
	 * if an item is in this list for a mode, we are expecting new items for the list
	 */
	private final List<Character> lAddingModes = new LinkedList<Character>();
	/** Modes waiting to be sent to the server. */
	private final List<String> lModeQueue = new LinkedList<String>();
	/** A Map to allow applications to attach misc data to this object */
	private Map myMap;
	
	/** Queue of requested list modes */
	private final Queue<Character> listModeQueue = new LinkedList<Character>();
	/** Listmode Queue Time */
	private long listModeQueueTime = System.currentTimeMillis();
	/** Have we asked the server for the list modes for this channel yet? */
	private boolean askedForListModes = false;
	/** Has OnChannelGotListModes ever been called for this channel? */
	private boolean hasGotListModes = false;

	/**
	 * Create a new channel object.
	 *
	 * @param tParser Refernce to parser that owns this channelclient (used for modes)	 
	 * @param name Channel name.
	 */
	public ChannelInfo(final IRCParser tParser, final String name) {
    //#ChannelInfo.java:96: method: void com.dmdirc.parser.irc.ChannelInfo.com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)
    //#input(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): name
    //#input(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): tParser
    //#input(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new HashMap(ChannelInfo#7) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#1) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#2) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#3) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#4) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#5) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#6) num objects
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.askedForListModes
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.bAddingNames
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hChannelUserList
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hListModes
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hParamModes
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hasGotListModes
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.lAddingModes
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.lModeQueue
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.listModeQueue
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.listModeQueueTime
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.myMap
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.myParser
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.nCreateTime
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.nTopicTime
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sName
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sTopic
    //#output(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sTopicUser
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new HashMap(ChannelInfo#7)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#1)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#2)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#3)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#4)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#5)
    //#new obj(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#6)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.askedForListModes == 0
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hasGotListModes == 0
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.nCreateTime == 0
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.nTopicTime == 0
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.bAddingNames == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new HashMap(ChannelInfo#7) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#1) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#2) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new Hashtable(ChannelInfo#3) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#4) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#5) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): new LinkedList(ChannelInfo#6) num objects == 1
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hChannelUserList == &new Hashtable(ChannelInfo#1)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hListModes == &new Hashtable(ChannelInfo#3)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.hParamModes == &new Hashtable(ChannelInfo#2)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.lAddingModes == &new LinkedList(ChannelInfo#4)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.lModeQueue == &new LinkedList(ChannelInfo#5)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.listModeQueue == &new LinkedList(ChannelInfo#6)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): init'ed(this.listModeQueueTime)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.myMap == &new HashMap(ChannelInfo#7)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.myParser == tParser
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): init'ed(this.myParser)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sName == name
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): init'ed(this.sName)
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sTopic == &""
    //#post(void com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)): this.sTopicUser == &""
		myMap = new HashMap<Object, Object>();
		myParser = tParser;
		sName = name;
	}
    //#ChannelInfo.java:100: end of method: void com.dmdirc.parser.irc.ChannelInfo.com.dmdirc.parser.irc.ChannelInfo(IRCParser, String)
	
	/**
	 * Get the listModeQueue.
	 *
	 * @return The listModeQueue
	 */
	public Queue<Character> getListModeQueue() {
		Queue<Character> result = listModeQueue;
    //#ChannelInfo.java:108: method: Queue com.dmdirc.parser.irc.ChannelInfo.getListModeQueue()
    //#input(Queue getListModeQueue()): "Callback not found: "._tainted
    //#input(Queue getListModeQueue()): "OnDebugInfo"._tainted
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(Queue getListModeQueue()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(Queue getListModeQueue()): this
    //#input(Queue getListModeQueue()): this.listModeQueue
    //#input(Queue getListModeQueue()): this.listModeQueueTime
    //#input(Queue getListModeQueue()): this.myParser
    //#input(Queue getListModeQueue()): this.myParser.__Tag
    //#input(Queue getListModeQueue()): this.myParser.myCallbackManager
    //#input(Queue getListModeQueue()): this.myParser.myCallbackManager.callbackHash
    //#output(Queue getListModeQueue()): new LinkedList(getListModeQueue#1) num objects
    //#output(Queue getListModeQueue()): return_value
    //#output(Queue getListModeQueue()): this.listModeQueueTime
    //#new obj(Queue getListModeQueue()): new LinkedList(getListModeQueue#1)
    //#pre[1] (Queue getListModeQueue()): init'ed(this.listModeQueueTime)
    //#pre[4] (Queue getListModeQueue()): (soft) this.myParser != null
    //#pre[5] (Queue getListModeQueue()): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (Queue getListModeQueue()): (soft) this.myParser.myCallbackManager != null
    //#pre[7] (Queue getListModeQueue()): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#post(Queue getListModeQueue()): return_value == One-of{this.listModeQueue, &new LinkedList(getListModeQueue#1)}
    //#post(Queue getListModeQueue()): init'ed(return_value)
    //#post(Queue getListModeQueue()): init'ed(this.listModeQueueTime)
    //#post(Queue getListModeQueue()): new LinkedList(getListModeQueue#1) num objects <= 1
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:call
    //#unanalyzed(Queue getListModeQueue()): Effects-of-calling:java.lang.Integer:valueOf
		final long now = System.currentTimeMillis();
		// Incase of breakage, if getListModeQueue() was last called greater than
		// 60 seconds ago, we reset the list.
		if (now-(30*1000) > listModeQueueTime) {
			result = new LinkedList<Character>();
			myParser.callDebugInfo(IRCParser.DEBUG_LMQ, "Resetting LMQ");
		}
		listModeQueueTime = now;
		return result;
    //#ChannelInfo.java:117: end of method: Queue com.dmdirc.parser.irc.ChannelInfo.getListModeQueue()
	}
	
	/**
	 * Ask the server for all the list modes for this channel.
	 */
	public void requestListModes() {
		final ChannelClientInfo me = getUser(myParser.getMyself());
    //#ChannelInfo.java:124: method: void com.dmdirc.parser.irc.ChannelInfo.requestListModes()
    //#input(void requestListModes()): " "._tainted
    //#input(void requestListModes()): " for mode "._tainted
    //#input(void requestListModes()): ""._tainted
    //#input(void requestListModes()): "Callback not found: "._tainted
    //#input(void requestListModes()): "Intercepted mode request for "._tainted
    //#input(void requestListModes()): "LISTMODE "._tainted
    //#input(void requestListModes()): "MODE "._tainted
    //#input(void requestListModes()): "OnDataOut"._tainted
    //#input(void requestListModes()): "OnDebugInfo"._tainted
    //#input(void requestListModes()): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void requestListModes()): __Descendant_Table[others]
    //#input(void requestListModes()): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void requestListModes()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void requestListModes()): __Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void requestListModes()): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(void requestListModes()): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(void requestListModes()): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void requestListModes()): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getImportantModeValue()J
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void requestListModes()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void requestListModes()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void requestListModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void requestListModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void requestListModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void requestListModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void requestListModes()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void requestListModes()): this
    //#input(void requestListModes()): this.__Tag
    //#input(void requestListModes()): this.hChannelUserList
    //#input(void requestListModes()): this.myParser
    //#input(void requestListModes()): this.myParser.__Tag
    //#input(void requestListModes()): this.myParser.cMyself
    //#input(void requestListModes()): this.myParser.currentSocketState
    //#input(void requestListModes()): this.myParser.h005Info
    //#input(void requestListModes()): this.myParser.hChanModesOther
    //#input(void requestListModes()): this.myParser.hChannelList
    //#input(void requestListModes()): this.myParser.hPrefixModes
    //#input(void requestListModes()): this.myParser.myCallbackManager
    //#input(void requestListModes()): this.myParser.myCallbackManager.callbackHash
    //#input(void requestListModes()): this.myParser.out
    //#input(void requestListModes()): this.myParser.sNetworkName
    //#input(void requestListModes()): this.myParser.stringConverter
    //#input(void requestListModes()): this.myParser.stringConverter.__Tag
    //#input(void requestListModes()): this.myParser.stringConverter.lowercase
    //#input(void requestListModes()): this.myParser.stringConverter.lowercase.length
    //#input(void requestListModes()): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void requestListModes()): this.sName
    //#input(void requestListModes()): this.sName._tainted
    //#output(void requestListModes()): java.lang.String:substring(...)._tainted
    //#output(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void requestListModes()): new char[](IRCStringConverter#1) num objects
    //#output(void requestListModes()): new char[](IRCStringConverter#1).length
    //#output(void requestListModes()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void requestListModes()): new char[](IRCStringConverter#2) num objects
    //#output(void requestListModes()): new char[](IRCStringConverter#2).length
    //#output(void requestListModes()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void requestListModes()): this.askedForListModes
    //#output(void requestListModes()): this.myParser.cMyself.myAwayReason
    //#output(void requestListModes()): this.myParser.stringConverter
    //#new obj(void requestListModes()): java.lang.String:substring(...)
    //#new obj(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void requestListModes()): new char[](IRCStringConverter#1)
    //#new obj(void requestListModes()): new char[](IRCStringConverter#2)
    //#pre[5] (void requestListModes()): this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[6] (void requestListModes()): this.hChannelUserList != null
    //#pre[7] (void requestListModes()): this.myParser != null
    //#pre[8] (void requestListModes()): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[3] (void requestListModes()): (soft) init'ed(this.myParser.stringConverter)
    //#pre[9] (void requestListModes()): (soft) this.myParser.cMyself != null
    //#pre[10] (void requestListModes()): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[11] (void requestListModes()): (soft) this.myParser.h005Info != null
    //#pre[12] (void requestListModes()): (soft) this.myParser.hChanModesOther != null
    //#pre[13] (void requestListModes()): (soft) this.myParser.hChannelList != null
    //#pre[15] (void requestListModes()): (soft) this.myParser.hPrefixModes != null
    //#pre[16] (void requestListModes()): (soft) this.myParser.myCallbackManager != null
    //#pre[17] (void requestListModes()): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[18] (void requestListModes()): (soft) init'ed(this.myParser.out)
    //#pre[19] (void requestListModes()): (soft) this.myParser.sNetworkName != null
    //#presumption(void requestListModes()): java.util.Iterator:next(...)@159 != null
    //#presumption(void requestListModes()): java.util.Map:get(...)@141 != null
    //#presumption(void requestListModes()): java.util.Map:get(...)@160 != null
    //#presumption(void requestListModes()): java.util.Map:keySet(...)@159 != null
    //#presumption(void requestListModes()): me.myParser@124 != null
    //#post(void requestListModes()): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void requestListModes()): possibly_updated(this.askedForListModes)
    //#post(void requestListModes()): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void requestListModes()): init'ed(this.myParser.stringConverter)
    //#post(void requestListModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1) num objects)
    //#post(void requestListModes()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void requestListModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void requestListModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void requestListModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void requestListModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#1) num objects)
    //#post(void requestListModes()): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void requestListModes()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#2) num objects)
    //#post(void requestListModes()): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void requestListModes()): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#post(void requestListModes()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void requestListModes()): Effects-of-calling:getClient
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void requestListModes()): Effects-of-calling:call
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void requestListModes()): Effects-of-calling:doSendString
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void requestListModes()): Effects-of-calling:setAwayReason
    //#unanalyzed(void requestListModes()): Effects-of-calling:getListModeQueue
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void requestListModes()): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void requestListModes()): java.lang.Byte:byteValue(...)@160: {-128..0, 2..255}, {1}
    //#test_vector(void requestListModes()): java.lang.Character:charValue(...)@162: {101}, {0..100, 102..65_535}
    //#test_vector(void requestListModes()): java.lang.Character:charValue(...)@162: {0..72, 74..65_535}, {73}
    //#test_vector(void requestListModes()): java.lang.Character:charValue(...)@165: {0..71, 73..65_535}, {72}
    //#test_vector(void requestListModes()): java.lang.String:equals(...)@134: {1}, {0}
    //#test_vector(void requestListModes()): java.lang.String:equals(...)@135: {0}, {1}
    //#test_vector(void requestListModes()): java.lang.String:equals(...)@137: {0}, {1}
    //#test_vector(void requestListModes()): java.util.Iterator:hasNext(...)@159: {0}, {1}
    //#test_vector(void requestListModes()): java.util.Map:containsKey(...)@155: {1}, {0}
    //#test_vector(void requestListModes()): java.util.Map:get(...)@141: Addr_Set{null}, Inverse{null}
		if (me == null) {
			// In a normal situation of non bouncer-brokenness this won't happen
			return;
		}
		
		askedForListModes = true;
		
		final String thisIRCD = myParser.getIRCD(true).toLowerCase();
		final boolean isFreenode = (thisIRCD.equals("hyperion") || thisIRCD.equals("dancer"));
		final boolean isUnreal = thisIRCD.equals("unreal");
		final boolean isStarChat = thisIRCD.equals("starchat");
		final boolean isHybrid = thisIRCD.equals("hybrid") || thisIRCD.equals("oftc-hybrid");
		final boolean isCharybdis = thisIRCD.equals("charybdis");
		
		// We are considered opped if we have a mode higher than voice (or if we have any modes if voice doesn't exist)
		long voiceValue = 0;
		if (myParser.hPrefixModes.get('v') != null) { voiceValue = myParser.hPrefixModes.get('v');}
		final boolean isOpped = me.getImportantModeValue() > voiceValue;
    //#ChannelInfo.java:142: ?use of default init
    //#    init'ed(me.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void requestListModes()
    //#    basic block: bb_13
    //#    assertion: init'ed(me.__Tag)
    //#    VN: me.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ChannelInfo.java:142: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[me.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void requestListModes()
    //#    basic block: bb_13
    //#    assertion: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[me.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[me.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
		
		int modecount = 1;
		if (!isUnreal) {
			try { 
				modecount = Integer.parseInt(myParser.h005Info.get("MODES"));
			} catch (NumberFormatException e) { /* use default modecount */}
		}
		
		// Support for potential future decent mode listing in the protocol
		//
		// See my proposal: http://shane.dmdirc.com/listmodes.php
		// Add listmode handler
		final boolean supportLISTMODE = myParser.h005Info.containsKey("LISTMODE");
		
		String listmodes = "";
		int i = 0;
		for (Character cTemp : myParser.hChanModesOther.keySet()) {
			final int nTemp = myParser.hChanModesOther.get(cTemp);
			if (nTemp == IRCParser.MODE_LIST) {
				if ((isFreenode || isHybrid || isCharybdis) && (cTemp == 'e' || cTemp == 'I') && !isOpped) {
					// IRCD doesn't allow non-ops to ask for these modes.
					continue;
				} else if (isStarChat && cTemp == 'H') {
					// IRCD Denies the mode exists
					continue;
				}
				i++;
    //#ChannelInfo.java:169: ?overflow
    //#    i in {-2_147_483_649..4_294_967_294}
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void requestListModes()
    //#    basic block: bb_33
    //#    assertion: i in {-2_147_483_649..4_294_967_294}
    //#    VN: i + 1
    //#    Expected: {-2_147_483_648..4_294_967_295, Invalid}
    //#    Bad: {4_294_967_296}
    //#    Attribs:  Int  Bad singleton  Bad > Exp
				listmodes = listmodes + cTemp;
				if (i >= modecount && !supportLISTMODE) {
					myParser.sendString("MODE "+getName()+" "+listmodes);
					i = 0;
					listmodes = "";
				}
			}
		}
		if (i > 0) {
			if (supportLISTMODE) {
				myParser.sendString("LISTMODE "+getName()+" "+listmodes);
			} else {
				myParser.sendString("MODE "+getName()+" "+listmodes);
			}
		}
	}
    //#ChannelInfo.java:185: end of method: void com.dmdirc.parser.irc.ChannelInfo.requestListModes()
	
	/**
	 * Have we ever asked the server for this channels listmodes?
	 *
	 * @return True if requestListModes() has ever been used, else false
	 */
	public boolean hasAskedForListModes() {
		return askedForListModes;
    //#ChannelInfo.java:193: method: bool com.dmdirc.parser.irc.ChannelInfo.hasAskedForListModes()
    //#input(bool hasAskedForListModes()): this
    //#input(bool hasAskedForListModes()): this.askedForListModes
    //#output(bool hasAskedForListModes()): return_value
    //#pre[2] (bool hasAskedForListModes()): init'ed(this.askedForListModes)
    //#post(bool hasAskedForListModes()): return_value == this.askedForListModes
    //#post(bool hasAskedForListModes()): init'ed(return_value)
    //#ChannelInfo.java:193: end of method: bool com.dmdirc.parser.irc.ChannelInfo.hasAskedForListModes()
	}
	
	/**
	 * Returns true if OnChannelGotListModes ever been called for this channel.
	 *
	 * @return True if OnChannelGotListModes ever been called for this channel.
	 */
	public boolean hasGotListModes() {
		return hasGotListModes;
    //#ChannelInfo.java:202: method: bool com.dmdirc.parser.irc.ChannelInfo.hasGotListModes()
    //#input(bool hasGotListModes()): this
    //#input(bool hasGotListModes()): this.hasGotListModes
    //#output(bool hasGotListModes()): return_value
    //#pre[2] (bool hasGotListModes()): init'ed(this.hasGotListModes)
    //#post(bool hasGotListModes()): return_value == this.hasGotListModes
    //#post(bool hasGotListModes()): init'ed(return_value)
    //#ChannelInfo.java:202: end of method: bool com.dmdirc.parser.irc.ChannelInfo.hasGotListModes()
	}
	
	/**
	 * Set if OnChannelGotListModes ever been called for this channel.
	 *
	 * @param newValue new value for if OnChannelGotListModes ever been called for this channel.
	 */
	protected void setHasGotListModes(final boolean newValue) {
		hasGotListModes = newValue;
    //#ChannelInfo.java:211: method: void com.dmdirc.parser.irc.ChannelInfo.setHasGotListModes(bool)
    //#input(void setHasGotListModes(bool)): newValue
    //#input(void setHasGotListModes(bool)): this
    //#output(void setHasGotListModes(bool)): this.hasGotListModes
    //#post(void setHasGotListModes(bool)): this.hasGotListModes == newValue
    //#post(void setHasGotListModes(bool)): init'ed(this.hasGotListModes)
	}
    //#ChannelInfo.java:212: end of method: void com.dmdirc.parser.irc.ChannelInfo.setHasGotListModes(bool)
	
	/**
	 * Set the Map object attatched to this object.
	 *
	 * @param newMap New Map to attatch.
	 */
	public void setMap(final Map newMap) {
		myMap = newMap;
    //#ChannelInfo.java:220: method: void com.dmdirc.parser.irc.ChannelInfo.setMap(Map)
    //#input(void setMap(Map)): newMap
    //#input(void setMap(Map)): this
    //#output(void setMap(Map)): this.myMap
    //#post(void setMap(Map)): this.myMap == newMap
    //#post(void setMap(Map)): init'ed(this.myMap)
	}
    //#ChannelInfo.java:221: end of method: void com.dmdirc.parser.irc.ChannelInfo.setMap(Map)
	
	/**
	 * Get the Map object attatched to this object.
	 *
	 * @return Map to attatched to this.
	 */
	public Map getMap() {
		return myMap;
    //#ChannelInfo.java:229: method: Map com.dmdirc.parser.irc.ChannelInfo.getMap()
    //#input(Map getMap()): this
    //#input(Map getMap()): this.myMap
    //#output(Map getMap()): return_value
    //#pre[2] (Map getMap()): init'ed(this.myMap)
    //#post(Map getMap()): return_value == this.myMap
    //#post(Map getMap()): init'ed(return_value)
    //#ChannelInfo.java:229: end of method: Map com.dmdirc.parser.irc.ChannelInfo.getMap()
	}
	
	/**
	 * Set if we are getting a names request or not.
	 *
	 * @param newValue if false, any new names reply will cause current known channelclients to be removed.
	 */
	public void setAddingNames(final boolean newValue) { bAddingNames = newValue; }
    //#ChannelInfo.java:237: method: void com.dmdirc.parser.irc.ChannelInfo.setAddingNames(bool)
    //#input(void setAddingNames(bool)): newValue
    //#input(void setAddingNames(bool)): this
    //#output(void setAddingNames(bool)): this.bAddingNames
    //#post(void setAddingNames(bool)): this.bAddingNames == newValue
    //#post(void setAddingNames(bool)): init'ed(this.bAddingNames)
    //#ChannelInfo.java:237: end of method: void com.dmdirc.parser.irc.ChannelInfo.setAddingNames(bool)
	
	/**
	 * Get if we are getting a names request or not.
	 *
	 * @return if false, any new names reply will cause current known channelclients to be removed.
	 */
	public boolean isAddingNames() { return bAddingNames; }
    //#ChannelInfo.java:244: method: bool com.dmdirc.parser.irc.ChannelInfo.isAddingNames()
    //#input(bool isAddingNames()): this
    //#input(bool isAddingNames()): this.bAddingNames
    //#output(bool isAddingNames()): return_value
    //#pre[2] (bool isAddingNames()): init'ed(this.bAddingNames)
    //#post(bool isAddingNames()): return_value == this.bAddingNames
    //#post(bool isAddingNames()): init'ed(return_value)
    //#ChannelInfo.java:244: end of method: bool com.dmdirc.parser.irc.ChannelInfo.isAddingNames()
	
	/**
	 * Get the name of this channel object.
	 *
	 * @return Channel name.
	 */	
	public String getName() { return sName; }
    //#ChannelInfo.java:251: method: String com.dmdirc.parser.irc.ChannelInfo.getName()
    //#input(String getName()): this
    //#input(String getName()): this.sName
    //#output(String getName()): return_value
    //#post(String getName()): return_value == this.sName
    //#post(String getName()): init'ed(return_value)
    //#ChannelInfo.java:251: end of method: String com.dmdirc.parser.irc.ChannelInfo.getName()
	/**
	 * Get the number of users known on this channel.
	 *
	 * @return Channel user count.
	 */
	public int getUserCount() { return hChannelUserList.size(); }
    //#ChannelInfo.java:257: method: int com.dmdirc.parser.irc.ChannelInfo.getUserCount()
    //#input(int getUserCount()): this
    //#input(int getUserCount()): this.hChannelUserList
    //#output(int getUserCount()): return_value
    //#pre[2] (int getUserCount()): this.hChannelUserList != null
    //#post(int getUserCount()): init'ed(return_value)
    //#ChannelInfo.java:257: end of method: int com.dmdirc.parser.irc.ChannelInfo.getUserCount()
	
	/**
	 * Get the channel users.
	 *
	 * @return ArrayList of ChannelClients
	 */
	public List<ChannelClientInfo> getChannelClients() {
		return new ArrayList<ChannelClientInfo>(hChannelUserList.values());
    //#ChannelInfo.java:265: method: List com.dmdirc.parser.irc.ChannelInfo.getChannelClients()
    //#input(List getChannelClients()): this
    //#input(List getChannelClients()): this.hChannelUserList
    //#output(List getChannelClients()): new ArrayList(getChannelClients#1) num objects
    //#output(List getChannelClients()): return_value
    //#new obj(List getChannelClients()): new ArrayList(getChannelClients#1)
    //#pre[2] (List getChannelClients()): this.hChannelUserList != null
    //#post(List getChannelClients()): return_value == &new ArrayList(getChannelClients#1)
    //#post(List getChannelClients()): new ArrayList(getChannelClients#1) num objects == 1
    //#ChannelInfo.java:265: end of method: List com.dmdirc.parser.irc.ChannelInfo.getChannelClients()
	}
	
	/**
	 * Empty the channel (Remove all known channelclients).
	 */
	protected void emptyChannel() {
		ClientInfo cTemp = null;
    //#ChannelInfo.java:272: method: void com.dmdirc.parser.irc.ChannelInfo.emptyChannel()
    //#ChannelInfo.java:272: Warning: unused assignment
    //#    Unused assignment into cTemp
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void emptyChannel()
    //#    Attribs:  Uncertain
    //#input(void emptyChannel()): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void emptyChannel()): __Descendant_Table[others]
    //#input(void emptyChannel()): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void emptyChannel()): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void emptyChannel()): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.forceRemoveClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void emptyChannel()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void emptyChannel()): this
    //#input(void emptyChannel()): this.hChannelUserList
    //#input(void emptyChannel()): this.myParser
    //#input(void emptyChannel()): this.myParser.__Tag
    //#input(void emptyChannel()): this.myParser.cMyself
    //#input(void emptyChannel()): this.myParser.hClientList
    //#input(void emptyChannel()): this.myParser.stringConverter
    //#input(void emptyChannel()): this.myParser.stringConverter.__Tag
    //#input(void emptyChannel()): this.myParser.stringConverter.lowercase
    //#input(void emptyChannel()): this.myParser.stringConverter.lowercase.length
    //#input(void emptyChannel()): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void emptyChannel()): new char[](IRCStringConverter#1) num objects
    //#output(void emptyChannel()): new char[](IRCStringConverter#1).length
    //#output(void emptyChannel()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void emptyChannel()): new char[](IRCStringConverter#2) num objects
    //#output(void emptyChannel()): new char[](IRCStringConverter#2).length
    //#output(void emptyChannel()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void emptyChannel()): this.myParser.stringConverter
    //#new obj(void emptyChannel()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void emptyChannel()): new char[](IRCStringConverter#1)
    //#new obj(void emptyChannel()): new char[](IRCStringConverter#2)
    //#pre[3] (void emptyChannel()): this.hChannelUserList != null
    //#pre[1] (void emptyChannel()): (soft) init'ed(this.myParser.stringConverter)
    //#pre[4] (void emptyChannel()): (soft) this.myParser != null
    //#pre[5] (void emptyChannel()): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (void emptyChannel()): (soft) init'ed(this.myParser.cMyself)
    //#pre[7] (void emptyChannel()): (soft) this.myParser.hClientList != null
    //#pre[8] (void emptyChannel()): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[10] (void emptyChannel()): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#presumption(void emptyChannel()): cTemp.myChannelClientInfos@273 != null
    //#presumption(void emptyChannel()): cTemp.myParser.__Tag@273 == com/dmdirc/parser/irc/IRCParser
    //#presumption(void emptyChannel()): cTemp.myParser.stringConverter.__Tag@273 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void emptyChannel()): cTemp.myParser.stringConverter.lowercase@273 != null
    //#presumption(void emptyChannel()): cTemp.myParser@273 != null
    //#presumption(void emptyChannel()): cTemp.sNickname != null
    //#presumption(void emptyChannel()): client.cClient@273 != null
    //#presumption(void emptyChannel()): client.myChannel.__Tag@273 == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void emptyChannel()): client.myChannel.sName@273 != null
    //#presumption(void emptyChannel()): client.myChannel@273 != null
    //#presumption(void emptyChannel()): java.util.Iterator:next(...).__Tag@273 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(void emptyChannel()): java.util.Iterator:next(...)@273 != null
    //#presumption(void emptyChannel()): java.util.Map:values(...)@273 != null
    //#presumption(void emptyChannel()): this.myParser.stringConverter.__Tag@273 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void emptyChannel()): this.myParser.stringConverter.lowercase@277 != null
    //#post(void emptyChannel()): init'ed(this.myParser.stringConverter)
    //#post(void emptyChannel()): init'ed(new IRCStringConverter(getIRCStringConverter#1) num objects)
    //#post(void emptyChannel()): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void emptyChannel()): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void emptyChannel()): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void emptyChannel()): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#1) num objects)
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#2) num objects)
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void emptyChannel()): init'ed(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void emptyChannel()): Effects-of-calling:getChannel
    //#unanalyzed(void emptyChannel()): Effects-of-calling:getName
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.lang.String
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void emptyChannel()): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void emptyChannel()): Effects-of-calling:getNickname
    //#unanalyzed(void emptyChannel()): Effects-of-calling:forceRemoveClient
    //#test_vector(void emptyChannel()): java.util.Iterator:hasNext(...)@273: {0}, {1}
		for (ChannelClientInfo client : hChannelUserList.values()) {
			cTemp = client.getClient();
			cTemp.delChannelClientInfo(client);
			if (cTemp != myParser.getMyself() && !cTemp.checkVisibility()) {
				myParser.removeClient(cTemp);
    //#ChannelInfo.java:277: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.removeClient: (soft) this.stringConverter.lowercase != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void emptyChannel()
    //#    basic block: bb_5
    //#    assertion: (soft) this.myParser.stringConverter.lowercase != null
    //#    callee: void com/dmdirc/parser/irc/IRCParser.removeClient(ClientInfo)
    //#    callee assertion: (soft) this.stringConverter.lowercase != null
    //#    callee file: IRCParser.java
    //#    callee precondition index: [10]
    //#    callee srcpos: 1986
    //#    VN: this.myParser.stringConverter.lowercase
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad  Soft
    //#ChannelInfo.java:277: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCParser.removeClient: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void emptyChannel()
    //#    basic block: bb_5
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: void com/dmdirc/parser/irc/IRCParser.removeClient(ClientInfo)
    //#    callee assertion: (soft) init'ed(this.stringConverter.lowercase[0..65_535])
    //#    callee file: IRCParser.java
    //#    callee precondition index: [12]
    //#    callee srcpos: 1986
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
			}
		}
		hChannelUserList.clear();
	}
    //#ChannelInfo.java:281: end of method: void com.dmdirc.parser.irc.ChannelInfo.emptyChannel()

	/**
	 * Get the ChannelClientInfo object associated with a nickname.
	 *
	 * @param sWho Nickname to return channelclient for
	 * @return ChannelClientInfo object requested, or null if not found
	 */
	public ChannelClientInfo getUser(final String sWho) {
		return getUser(sWho, false);
    //#ChannelInfo.java:290: method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(String)
    //#ChannelInfo.java:290: ?precondition failure
    //#    com/dmdirc/parser/irc/ChannelInfo.getUser: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo getUser(String)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee: ChannelClientInfo com/dmdirc/parser/irc/ChannelInfo.getUser(String, bool)
    //#    callee assertion: (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#    callee file: ChannelInfo.java
    //#    callee precondition index: [13]
    //#    callee srcpos: 302
    //#    VN: this.myParser.stringConverter.lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ChannelClientInfo getUser(String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(ChannelClientInfo getUser(String)): __Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(ChannelClientInfo getUser(String)): __Dispatch_Table.getUser(Ljava/lang/String;Z)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ChannelClientInfo getUser(String)): sWho
    //#input(ChannelClientInfo getUser(String)): sWho._tainted
    //#input(ChannelClientInfo getUser(String)): this
    //#input(ChannelClientInfo getUser(String)): this.__Tag
    //#input(ChannelClientInfo getUser(String)): this.hChannelUserList
    //#input(ChannelClientInfo getUser(String)): this.myParser
    //#input(ChannelClientInfo getUser(String)): this.myParser.__Tag
    //#input(ChannelClientInfo getUser(String)): this.myParser.stringConverter
    //#input(ChannelClientInfo getUser(String)): this.myParser.stringConverter.__Tag
    //#input(ChannelClientInfo getUser(String)): this.myParser.stringConverter.lowercase
    //#input(ChannelClientInfo getUser(String)): this.myParser.stringConverter.lowercase.length
    //#input(ChannelClientInfo getUser(String)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(ChannelClientInfo getUser(String)): this.sName
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*) num objects
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*).__Tag
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*).cClient
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*).myChannel
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*).myMap
    //#output(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*).myParser
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*) num objects
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).__Tag
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).bIsFake
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).lModeQueue
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).myAwayReason
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).myChannelClientInfos
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).myMap
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).myParser
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).sHost
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).sIdent
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).sNickname
    //#output(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*).sRealName
    //#output(ChannelClientInfo getUser(String)): new HashMap(ChannelClientInfo#1) num objects
    //#output(ChannelClientInfo getUser(String)): new HashMap(ClientInfo#3) num objects
    //#output(ChannelClientInfo getUser(String)): new Hashtable(ClientInfo#1) num objects
    //#output(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ChannelClientInfo getUser(String)): new LinkedList(ClientInfo#2) num objects
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#1) num objects
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#1).length
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#2) num objects
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#2).length
    //#output(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ChannelClientInfo getUser(String)): return_value
    //#output(ChannelClientInfo getUser(String)): this.myParser.stringConverter
    //#new obj(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*)
    //#new obj(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*)
    //#new obj(ChannelClientInfo getUser(String)): new HashMap(ChannelClientInfo#1)
    //#new obj(ChannelClientInfo getUser(String)): new HashMap(ClientInfo#3)
    //#new obj(ChannelClientInfo getUser(String)): new Hashtable(ClientInfo#1)
    //#new obj(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ChannelClientInfo getUser(String)): new LinkedList(ClientInfo#2)
    //#new obj(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#1)
    //#new obj(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#2)
    //#pre[1] (ChannelClientInfo getUser(String)): init'ed(this.myParser.stringConverter)
    //#pre[2] (ChannelClientInfo getUser(String)): sWho != null
    //#pre[5] (ChannelClientInfo getUser(String)): this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[6] (ChannelClientInfo getUser(String)): this.hChannelUserList != null
    //#pre[7] (ChannelClientInfo getUser(String)): this.myParser != null
    //#pre[8] (ChannelClientInfo getUser(String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (ChannelClientInfo getUser(String)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[10] (ChannelClientInfo getUser(String)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[12] (ChannelClientInfo getUser(String)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#pre[13] (ChannelClientInfo getUser(String)): (soft) this.sName != null
    //#post(ChannelClientInfo getUser(String)): init'ed(return_value)
    //#post(ChannelClientInfo getUser(String)): this.myParser.stringConverter != null
    //#post(ChannelClientInfo getUser(String)): new ChannelClientInfo(getUser#1*) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new ClientInfo(getUser#2*) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new HashMap(ChannelClientInfo#1) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new HashMap(ClientInfo#3) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new Hashtable(ClientInfo#1) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new LinkedList(ClientInfo#2) num objects == 0
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ChannelClientInfo(getUser#1*).__Tag)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ChannelClientInfo(getUser#1*).cClient)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ChannelClientInfo(getUser#1*).myChannel)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ChannelClientInfo(getUser#1*).myMap)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ChannelClientInfo(getUser#1*).myParser)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).myParser)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).__Tag)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).bIsFake)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).lModeQueue)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).myAwayReason)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).sRealName)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).myChannelClientInfos)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).myMap)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).sHost)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new ClientInfo(getUser#2*).sIdent)
    //#post(ChannelClientInfo getUser(String)): init'ed(new ClientInfo(getUser#2*).sNickname)
    //#post(ChannelClientInfo getUser(String)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#1) num objects == 0
    //#post(ChannelClientInfo getUser(String)): new char[](IRCStringConverter#2) num objects == 0
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new char[](IRCStringConverter#1).length)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new char[](IRCStringConverter#2).length)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(ChannelClientInfo getUser(String)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(ChannelClientInfo getUser(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelClientInfo getUser(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:getChannel
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:getName
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:com.dmdirc.parser.irc.ChannelClientInfo
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(ChannelClientInfo getUser(String)): Effects-of-calling:java.util.Map:put
    //#ChannelInfo.java:290: end of method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(String)
	}
	
	/**
	 * Get the ChannelClientInfo object associated with a nickname.
	 *
	 * @param sWho Nickname to return channelclient for
	 * @param createFake Create a fake client if not found
	 * @return ChannelClientInfo object requested
	 * @since 0.6
	 */
	public ChannelClientInfo getUser(final String sWho, final boolean createFake) {
		final String who = myParser.getIRCStringConverter().toLowerCase(ClientInfo.parseHost(sWho));
    //#ChannelInfo.java:302: method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(String, bool)
    //#ChannelInfo.java:302: ?use of default init
    //#    init'ed(Obj_Id#4570:parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo getUser(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(Obj_Id#4570:parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ChannelInfo.java:302: ?use of default init
    //#    init'ed(parseHost(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo getUser(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: init'ed(parseHost(...))
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ChannelInfo.java:302: ?!precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: input != null
    //#    severity: HIGH
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo getUser(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: undefined != null
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: input != null
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [1]
    //#    callee srcpos: 86
    //#    VN: undefined
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null, Invalid}
    //#    Attribs:  Ptr  null in Bad
    //#ChannelInfo.java:302: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo getUser(String, bool)
    //#    basic block: Entry_BB_1
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
    //#input(ChannelClientInfo getUser(String, bool)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(ChannelClientInfo getUser(String, bool)): __Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String, bool)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(String, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ChannelClientInfo getUser(String, bool)): createFake
    //#input(ChannelClientInfo getUser(String, bool)): sWho
    //#input(ChannelClientInfo getUser(String, bool)): sWho._tainted
    //#input(ChannelClientInfo getUser(String, bool)): this
    //#input(ChannelClientInfo getUser(String, bool)): this.__Tag
    //#input(ChannelClientInfo getUser(String, bool)): this.hChannelUserList
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.__Tag
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter.__Tag
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter.lowercase
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter.lowercase.length
    //#input(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(ChannelClientInfo getUser(String, bool)): this.sName
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).__Tag
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).cClient
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myChannel
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myMap
    //#output(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myParser
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).__Tag
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).bIsFake
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).lModeQueue
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myAwayReason
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myChannelClientInfos
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myMap
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myParser
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sHost
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sIdent
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sNickname
    //#output(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sRealName
    //#output(ChannelClientInfo getUser(String, bool)): new HashMap(ChannelClientInfo#1) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new HashMap(ClientInfo#3) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new Hashtable(ClientInfo#1) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ChannelClientInfo getUser(String, bool)): new LinkedList(ClientInfo#2) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1).length
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2) num objects
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2).length
    //#output(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ChannelClientInfo getUser(String, bool)): return_value
    //#output(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter
    //#new obj(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1)
    //#new obj(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2)
    //#new obj(ChannelClientInfo getUser(String, bool)): new HashMap(ChannelClientInfo#1)
    //#new obj(ChannelClientInfo getUser(String, bool)): new HashMap(ClientInfo#3)
    //#new obj(ChannelClientInfo getUser(String, bool)): new Hashtable(ClientInfo#1)
    //#new obj(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ChannelClientInfo getUser(String, bool)): new LinkedList(ClientInfo#2)
    //#new obj(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1)
    //#new obj(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2)
    //#pre[2] (ChannelClientInfo getUser(String, bool)): init'ed(this.myParser.stringConverter)
    //#pre[3] (ChannelClientInfo getUser(String, bool)): sWho != null
    //#pre[7] (ChannelClientInfo getUser(String, bool)): this.hChannelUserList != null
    //#pre[8] (ChannelClientInfo getUser(String, bool)): this.myParser != null
    //#pre[9] (ChannelClientInfo getUser(String, bool)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[6] (ChannelClientInfo getUser(String, bool)): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[10] (ChannelClientInfo getUser(String, bool)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[11] (ChannelClientInfo getUser(String, bool)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[13] (ChannelClientInfo getUser(String, bool)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#pre[14] (ChannelClientInfo getUser(String, bool)): (soft) this.sName != null
    //#presumption(ChannelClientInfo getUser(String, bool)): java.util.Map:get(...).__Tag@304 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(ChannelClientInfo getUser(String, bool)): setFake(...).myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(ChannelClientInfo getUser(String, bool)): setFake(...).myParser.stringConverter.lowercase != null
    //#post(ChannelClientInfo getUser(String, bool)): init'ed(return_value)
    //#post(ChannelClientInfo getUser(String, bool)): this.myParser.stringConverter != null
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).__Tag == com/dmdirc/parser/irc/ChannelClientInfo
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).cClient == &new ClientInfo(getUser#2)
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myChannel == this
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myChannel != null
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myMap == &new HashMap(ChannelClientInfo#1)
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myParser == this.myParser
    //#post(ChannelClientInfo getUser(String, bool)): new ChannelClientInfo(getUser#1).myParser != null
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).__Tag == com/dmdirc/parser/irc/ClientInfo
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).bIsFake == 1
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).lModeQueue == &new LinkedList(ClientInfo#2)
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myAwayReason == &""
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myChannelClientInfos == &new Hashtable(ClientInfo#1)
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myMap == &new HashMap(ClientInfo#3)
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myParser == this.myParser
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).myParser != null
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sHost in Addr_Set{null,&""}
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sIdent in Addr_Set{null,&""}
    //#post(ChannelClientInfo getUser(String, bool)): init'ed(new ClientInfo(getUser#2).sNickname)
    //#post(ChannelClientInfo getUser(String, bool)): new ClientInfo(getUser#2).sRealName == &""
    //#post(ChannelClientInfo getUser(String, bool)): new HashMap(ChannelClientInfo#1) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new HashMap(ClientInfo#3) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new Hashtable(ClientInfo#1) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2) num objects == new IRCStringConverter(getIRCStringConverter#1) num objects
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects == 0
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(ChannelClientInfo getUser(String, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(ChannelClientInfo getUser(String, bool)): new LinkedList(ClientInfo#2) num objects <= 1
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1) num objects == 0
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#1).length == 127
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2).length == 127
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new char[](IRCStringConverter#1).length)
    //#post(ChannelClientInfo getUser(String, bool)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelClientInfo getUser(String, bool)): new char[](IRCStringConverter#2) num objects == 0
    //#post(ChannelClientInfo getUser(String, bool)): not_init'ed(new char[](IRCStringConverter#2).length)
    //#post(ChannelClientInfo getUser(String, bool)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:getChannel
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:getName
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.util.Hashtable
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(ChannelClientInfo getUser(String, bool)): Effects-of-calling:java.util.Map:put
    //#test_vector(ChannelClientInfo getUser(String, bool)): createFake: {0}, {1}
    //#test_vector(ChannelClientInfo getUser(String, bool)): java.util.Map:containsKey(...)@303: {0}, {1}
		if (hChannelUserList.containsKey(who)) {
			return hChannelUserList.get(who);
		}
		if (createFake) {
			return new ChannelClientInfo(myParser, (new ClientInfo(myParser, sWho)).setFake(true), this);
		} else {
			return null;
    //#ChannelInfo.java:309: end of method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(String, bool)
		}
	}
	
	/**
	 * Get the ChannelClientInfo object associated with a ClientInfo object.
	 *
	 * @param cWho ClientInfo to return ChannelClient for
	 * @return ChannelClientInfo object requested, or null if not found
	 */	
	public ChannelClientInfo getUser(final ClientInfo cWho) {
		for (ChannelClientInfo client : hChannelUserList.values()) {
    //#ChannelInfo.java:320: method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(ClientInfo)
    //#input(ChannelClientInfo getUser(ClientInfo)): cWho
    //#input(ChannelClientInfo getUser(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(ChannelClientInfo getUser(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(ChannelClientInfo getUser(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(ChannelClientInfo getUser(ClientInfo)): this
    //#input(ChannelClientInfo getUser(ClientInfo)): this.hChannelUserList
    //#output(ChannelClientInfo getUser(ClientInfo)): return_value
    //#pre[3] (ChannelClientInfo getUser(ClientInfo)): this.hChannelUserList != null
    //#presumption(ChannelClientInfo getUser(ClientInfo)): java.util.Iterator:next(...).__Tag@320 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(ChannelClientInfo getUser(ClientInfo)): java.util.Iterator:next(...)@320 != null
    //#presumption(ChannelClientInfo getUser(ClientInfo)): java.util.Map:values(...)@320 != null
    //#post(ChannelClientInfo getUser(ClientInfo)): init'ed(return_value)
    //#test_vector(ChannelClientInfo getUser(ClientInfo)): java.util.Iterator:hasNext(...)@320: {0}, {1}
			if (client.getClient() == cWho) {
				return client;
			}
		}
		return null;
    //#ChannelInfo.java:325: end of method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.getUser(ClientInfo)
	}
	
	/**
	 * Get the ChannelClientInfo object associated with a ClientInfo object.
	 *
	 * @param cClient Client object to be added to channel
	 * @return ChannelClientInfo object added, or an existing object if already known on channel
	 */
	protected ChannelClientInfo addClient(final ClientInfo cClient) {
		ChannelClientInfo cTemp = getUser(cClient);
    //#ChannelInfo.java:335: method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.addClient(ClientInfo)
    //#input(ChannelClientInfo addClient(ClientInfo)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(ChannelClientInfo addClient(ClientInfo)): __Descendant_Table[others]
    //#input(ChannelClientInfo addClient(ClientInfo)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(ChannelClientInfo addClient(ClientInfo)): __Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myChannelClientInfos
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.__Tag
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter.__Tag
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter.lowercase
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter.lowercase.length
    //#input(ChannelClientInfo addClient(ClientInfo)): cClient.sNickname
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getNickname()Ljava/lang/String;
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(ChannelClientInfo addClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(ChannelClientInfo addClient(ClientInfo)): this
    //#input(ChannelClientInfo addClient(ClientInfo)): this.__Tag
    //#input(ChannelClientInfo addClient(ClientInfo)): this.hChannelUserList
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.__Tag
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter.__Tag
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter.lowercase
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter.lowercase.length
    //#input(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(ChannelClientInfo addClient(ClientInfo)): this.sName
    //#output(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1) num objects
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).__Tag
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).cClient
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myChannel
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myMap
    //#output(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myParser
    //#output(ChannelClientInfo addClient(ClientInfo)): new HashMap(ChannelClientInfo#1) num objects
    //#output(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#1).length
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#2).length
    //#output(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(ChannelClientInfo addClient(ClientInfo)): return_value
    //#output(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter
    //#new obj(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1)
    //#new obj(ChannelClientInfo addClient(ClientInfo)): new HashMap(ChannelClientInfo#1)
    //#new obj(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#2)
    //#pre[12] (ChannelClientInfo addClient(ClientInfo)): this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[1] (ChannelClientInfo addClient(ClientInfo)): (soft) cClient != null
    //#pre[2] (ChannelClientInfo addClient(ClientInfo)): (soft) cClient.myChannelClientInfos != null
    //#pre[3] (ChannelClientInfo addClient(ClientInfo)): (soft) cClient.myParser != null
    //#pre[4] (ChannelClientInfo addClient(ClientInfo)): (soft) cClient.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (ChannelClientInfo addClient(ClientInfo)): (soft) init'ed(cClient.myParser.stringConverter)
    //#pre[10] (ChannelClientInfo addClient(ClientInfo)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[13] (ChannelClientInfo addClient(ClientInfo)): (soft) this.hChannelUserList != null
    //#pre[14] (ChannelClientInfo addClient(ClientInfo)): (soft) this.myParser != null
    //#pre[16] (ChannelClientInfo addClient(ClientInfo)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[17] (ChannelClientInfo addClient(ClientInfo)): (soft) this.sName != null
    //#presumption(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter.__Tag@335 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter.lowercase@335 != null
    //#presumption(ChannelClientInfo addClient(ClientInfo)): cTemp.cClient.sNickname != null
    //#presumption(ChannelClientInfo addClient(ClientInfo)): getIRCStringConverter(...).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(ChannelClientInfo addClient(ClientInfo)): getIRCStringConverter(...).lowercase != null
    //#post(ChannelClientInfo addClient(ClientInfo)): cClient.myParser.stringConverter == One-of{old cClient.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1), old this.myParser.stringConverter}
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(cClient.myParser.stringConverter)
    //#post(ChannelClientInfo addClient(ClientInfo)): return_value != null
    //#post(ChannelClientInfo addClient(ClientInfo)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, old cClient.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(this.myParser.stringConverter)
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1) num objects <= 1
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).__Tag == com/dmdirc/parser/irc/ChannelClientInfo
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).cClient == cClient
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).cClient != null
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myChannel == this
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myChannel != null
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myMap == &new HashMap(ChannelClientInfo#1)
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myParser == this.myParser
    //#post(ChannelClientInfo addClient(ClientInfo)): new ChannelClientInfo(addClient#1).myParser != null
    //#post(ChannelClientInfo addClient(ClientInfo)): new HashMap(ChannelClientInfo#1) num objects <= 1
    //#post(ChannelClientInfo addClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelClientInfo addClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(ChannelClientInfo addClient(ClientInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(ChannelClientInfo addClient(ClientInfo)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(ChannelClientInfo addClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:getClient
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:getChannel
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:getName
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.lang.String
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.HashMap
    //#unanalyzed(ChannelClientInfo addClient(ClientInfo)): Effects-of-calling:java.util.Map:put
		if (cTemp == null) { 
			cTemp = new ChannelClientInfo(myParser, cClient, this);
			hChannelUserList.put(myParser.getIRCStringConverter().toLowerCase(cTemp.getNickname()), cTemp);
    //#ChannelInfo.java:338: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: ChannelClientInfo addClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		}
		return cTemp;
    //#ChannelInfo.java:340: end of method: ChannelClientInfo com.dmdirc.parser.irc.ChannelInfo.addClient(ClientInfo)
	}
	
	/**
	 * Remove ChannelClientInfo object associated with a ClientInfo object.
	 *
	 * @param cClient Client object to be removed from channel
	 */	
	protected void delClient(final ClientInfo cClient) {
		ChannelClientInfo cTemp = null;
    //#ChannelInfo.java:349: method: void com.dmdirc.parser.irc.ChannelInfo.delClient(ClientInfo)
    //#ChannelInfo.java:349: Warning: unused assignment
    //#    Unused assignment into cTemp
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    Attribs:  Uncertain
    //#input(void delClient(ClientInfo)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void delClient(ClientInfo)): __Descendant_Table[others]
    //#input(void delClient(ClientInfo)): __Dispatch_Table.getName()Ljava/lang/String;
    //#input(void delClient(ClientInfo)): __Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#input(void delClient(ClientInfo)): cClient
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getChannel()Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getClient()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getNickname()Ljava/lang/String;
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.forceRemoveClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getMyself()Lcom/dmdirc/parser/irc/ClientInfo;
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.removeClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void delClient(ClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void delClient(ClientInfo)): this
    //#input(void delClient(ClientInfo)): this.__Tag
    //#input(void delClient(ClientInfo)): this.hChannelUserList
    //#input(void delClient(ClientInfo)): this.myParser
    //#input(void delClient(ClientInfo)): this.myParser.__Tag
    //#input(void delClient(ClientInfo)): this.myParser.cMyself
    //#input(void delClient(ClientInfo)): this.myParser.hClientList
    //#input(void delClient(ClientInfo)): this.myParser.stringConverter
    //#input(void delClient(ClientInfo)): this.myParser.stringConverter.__Tag
    //#input(void delClient(ClientInfo)): this.myParser.stringConverter.lowercase
    //#input(void delClient(ClientInfo)): this.myParser.stringConverter.lowercase.length
    //#input(void delClient(ClientInfo)): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#1).length
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#2).length
    //#output(void delClient(ClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void delClient(ClientInfo)): this.myParser.stringConverter
    //#new obj(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void delClient(ClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(void delClient(ClientInfo)): new char[](IRCStringConverter#2)
    //#pre[4] (void delClient(ClientInfo)): this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[5] (void delClient(ClientInfo)): this.hChannelUserList != null
    //#pre[2] (void delClient(ClientInfo)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void delClient(ClientInfo)): (soft) this.myParser != null
    //#pre[7] (void delClient(ClientInfo)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void delClient(ClientInfo)): (soft) init'ed(this.myParser.cMyself)
    //#pre[9] (void delClient(ClientInfo)): (soft) this.myParser.hClientList != null
    //#presumption(void delClient(ClientInfo)): cTemp.cClient.sNickname != null
    //#presumption(void delClient(ClientInfo)): cTemp.myChannel.__Tag@350 == com/dmdirc/parser/irc/ChannelInfo
    //#presumption(void delClient(ClientInfo)): cTemp.myChannel.sName@350 != null
    //#presumption(void delClient(ClientInfo)): cTemp.myChannel@350 != null
    //#presumption(void delClient(ClientInfo)): clTemp.myChannelClientInfos@350 != null
    //#presumption(void delClient(ClientInfo)): clTemp.myParser.__Tag@350 == com/dmdirc/parser/irc/IRCParser
    //#presumption(void delClient(ClientInfo)): clTemp.myParser.stringConverter.__Tag@350 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void delClient(ClientInfo)): clTemp.myParser.stringConverter.lowercase@350 != null
    //#presumption(void delClient(ClientInfo)): clTemp.myParser@350 != null
    //#presumption(void delClient(ClientInfo)): clTemp.sNickname != null
    //#presumption(void delClient(ClientInfo)): getIRCStringConverter(...).__Tag@350 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void delClient(ClientInfo)): getIRCStringConverter(...).__Tag@355 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void delClient(ClientInfo)): getIRCStringConverter(...).lowercase@350 != null
    //#presumption(void delClient(ClientInfo)): getIRCStringConverter(...).lowercase@355 != null
    //#presumption(void delClient(ClientInfo)): this.myParser.stringConverter.__Tag@350 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void delClient(ClientInfo)): this.myParser.stringConverter.lowercase@350 != null
    //#post(void delClient(ClientInfo)): init'ed(this.myParser.stringConverter)
    //#post(void delClient(ClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void delClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void delClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void delClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void delClient(ClientInfo)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void delClient(ClientInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void delClient(ClientInfo)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void delClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void delClient(ClientInfo)): init'ed(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void delClient(ClientInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void delClient(ClientInfo)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void delClient(ClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Map:values
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Collection:iterator
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Iterator:hasNext
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Iterator:next
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:getClient
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:getChannel
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:getName
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.lang.String
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Map:remove
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:java.util.Map:isEmpty
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:getNickname
    //#unanalyzed(void delClient(ClientInfo)): Effects-of-calling:forceRemoveClient
		cTemp = getUser(cClient);
		if (cTemp != null) {
			final ClientInfo clTemp = cTemp.getClient();
    //#ChannelInfo.java:352: ?use of default init
    //#    init'ed(cTemp.__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: init'ed(cTemp.__Tag)
    //#    VN: cTemp.__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ChannelInfo.java:352: ?null dereference
    //#    com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[cTemp.__Tag] != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[cTemp.__Tag] != null
    //#    VN: com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[cTemp.__Tag]
    //#    Expected: Inverse{null}
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
    //#ChannelInfo.java:352: ?use of default init
    //#    init'ed(Obj_Id#5157:getClient(...))
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: init'ed(Obj_Id#5157:getClient(...))
    //#    VN: cTemp.cClient
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
			clTemp.delChannelClientInfo(cTemp);
    //#ChannelInfo.java:353: ?null dereference
    //#    clTemp != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    basic block: bb_2
    //#    assertion: clTemp != null
    //#    VN: cTemp.cClient
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			if (clTemp != myParser.getMyself() && !clTemp.checkVisibility()) {
				myParser.removeClient(clTemp);
			}
			hChannelUserList.remove(myParser.getIRCStringConverter().toLowerCase(cTemp.getNickname()));
    //#ChannelInfo.java:357: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void delClient(ClientInfo)
    //#    basic block: bb_5
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
		}
	}	
    //#ChannelInfo.java:359: end of method: void com.dmdirc.parser.irc.ChannelInfo.delClient(ClientInfo)
	
	/**
	 * Rename a channelClient.
	 *
	 * @param oldNickname Nickname client used to be known as
	 * @param cChannelClient ChannelClient object with updated client object
	 */	
	protected void renameClient(final String oldNickname, final ChannelClientInfo cChannelClient) {
		ChannelClientInfo cTemp = null;
    //#ChannelInfo.java:368: method: void com.dmdirc.parser.irc.ChannelInfo.renameClient(String, ChannelClientInfo)
    //#ChannelInfo.java:368: Warning: unused assignment
    //#    Unused assignment into cTemp
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void renameClient(String, ChannelClientInfo)
    //#    Attribs:  Uncertain
    //#input(void renameClient(String, ChannelClientInfo)): cChannelClient
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[com/dmdirc/parser/irc/ChannelClientInfo]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Descendant_Table[others]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/ChannelClientInfo.__Dispatch_Table.getNickname()Ljava/lang/String;
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void renameClient(String, ChannelClientInfo)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void renameClient(String, ChannelClientInfo)): oldNickname
    //#input(void renameClient(String, ChannelClientInfo)): this
    //#input(void renameClient(String, ChannelClientInfo)): this.hChannelUserList
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.__Tag
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter.__Tag
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter.lowercase
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter.lowercase.length
    //#input(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1) num objects
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1).length
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2) num objects
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2).length
    //#output(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter
    //#new obj(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1)
    //#new obj(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2)
    //#pre[5] (void renameClient(String, ChannelClientInfo)): this.hChannelUserList != null
    //#pre[2] (void renameClient(String, ChannelClientInfo)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void renameClient(String, ChannelClientInfo)): (soft) this.myParser != null
    //#pre[7] (void renameClient(String, ChannelClientInfo)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void renameClient(String, ChannelClientInfo)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[9] (void renameClient(String, ChannelClientInfo)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[11] (void renameClient(String, ChannelClientInfo)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#presumption(void renameClient(String, ChannelClientInfo)): cTemp.cClient.sNickname@370 != null
    //#presumption(void renameClient(String, ChannelClientInfo)): cTemp.cClient@370 != null
    //#presumption(void renameClient(String, ChannelClientInfo)): java.util.Map:get(...).__Tag@370 == com/dmdirc/parser/irc/ChannelClientInfo
    //#presumption(void renameClient(String, ChannelClientInfo)): java.util.Map:get(...)@370 != null
    //#post(void renameClient(String, ChannelClientInfo)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void renameClient(String, ChannelClientInfo)): init'ed(this.myParser.stringConverter)
    //#post(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#post(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).limit == 4
    //#post(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).lowercase == &new char[](IRCStringConverter#1)
    //#post(void renameClient(String, ChannelClientInfo)): new IRCStringConverter(getIRCStringConverter#1).uppercase == &new char[](IRCStringConverter#2)
    //#post(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#1).length == 127
    //#post(void renameClient(String, ChannelClientInfo)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void renameClient(String, ChannelClientInfo)): new char[](IRCStringConverter#2).length == 127
    //#post(void renameClient(String, ChannelClientInfo)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void renameClient(String, ChannelClientInfo)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void renameClient(String, ChannelClientInfo)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void renameClient(String, ChannelClientInfo)): Effects-of-calling:java.lang.String
    //#test_vector(void renameClient(String, ChannelClientInfo)): java.util.Map:containsKey(...)@369: {0}, {1}
		if (hChannelUserList.containsKey(oldNickname)) {
			cTemp = hChannelUserList.get(oldNickname);
			if (cTemp == cChannelClient) {
				// Remove the old key
				hChannelUserList.remove(oldNickname);
				// Add with the new key. (getNickname will return the new name not the
				// old one)
				hChannelUserList.put(myParser.getIRCStringConverter().toLowerCase(cTemp.getNickname()), cTemp);
    //#ChannelInfo.java:376: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.toLowerCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void renameClient(String, ChannelClientInfo)
    //#    basic block: bb_3
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: String com/dmdirc/parser/irc/IRCStringConverter.toLowerCase(String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [5]
    //#    callee srcpos: 86
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
			}
		}
	}
    //#ChannelInfo.java:379: end of method: void com.dmdirc.parser.irc.ChannelInfo.renameClient(String, ChannelClientInfo)
	
	/**
	 * Set the create time.
	 *
	 * @param nNewTime New unixtimestamp time for the channel creation (Seconds since epoch, not milliseconds)
	 */
	protected void setCreateTime(final long nNewTime) { nCreateTime = nNewTime; }
    //#ChannelInfo.java:386: method: void com.dmdirc.parser.irc.ChannelInfo.setCreateTime(long)
    //#input(void setCreateTime(long)): nNewTime
    //#input(void setCreateTime(long)): this
    //#output(void setCreateTime(long)): this.nCreateTime
    //#post(void setCreateTime(long)): this.nCreateTime == nNewTime
    //#post(void setCreateTime(long)): init'ed(this.nCreateTime)
    //#ChannelInfo.java:386: end of method: void com.dmdirc.parser.irc.ChannelInfo.setCreateTime(long)
	/**
	 * Get the Create time.
	 *
	 * @return Unixtimestamp time for the channel creation (Seconds since epoch, not milliseconds)
	 */
	public long getCreateTime() { return nCreateTime; }	
    //#ChannelInfo.java:392: method: long com.dmdirc.parser.irc.ChannelInfo.getCreateTime()
    //#input(long getCreateTime()): this
    //#input(long getCreateTime()): this.nCreateTime
    //#output(long getCreateTime()): return_value
    //#pre[2] (long getCreateTime()): init'ed(this.nCreateTime)
    //#post(long getCreateTime()): return_value == this.nCreateTime
    //#post(long getCreateTime()): init'ed(return_value)
    //#ChannelInfo.java:392: end of method: long com.dmdirc.parser.irc.ChannelInfo.getCreateTime()
	
	/**
	 * Set the topic time.
	 *
	 * @param nNewTime New unixtimestamp time for the topic (Seconds since epoch, not milliseconds)
	 */
	protected void setTopicTime(final long nNewTime) { nTopicTime = nNewTime; }
    //#ChannelInfo.java:399: method: void com.dmdirc.parser.irc.ChannelInfo.setTopicTime(long)
    //#input(void setTopicTime(long)): nNewTime
    //#input(void setTopicTime(long)): this
    //#output(void setTopicTime(long)): this.nTopicTime
    //#post(void setTopicTime(long)): this.nTopicTime == nNewTime
    //#post(void setTopicTime(long)): init'ed(this.nTopicTime)
    //#ChannelInfo.java:399: end of method: void com.dmdirc.parser.irc.ChannelInfo.setTopicTime(long)
	/**
	 * Get the topic time.
	 *
	 * @return Unixtimestamp time for the topic (Seconds since epoch, not milliseconds)
	 */
	public long getTopicTime() { return nTopicTime; }	
    //#ChannelInfo.java:405: method: long com.dmdirc.parser.irc.ChannelInfo.getTopicTime()
    //#input(long getTopicTime()): this
    //#input(long getTopicTime()): this.nTopicTime
    //#output(long getTopicTime()): return_value
    //#pre[2] (long getTopicTime()): init'ed(this.nTopicTime)
    //#post(long getTopicTime()): return_value == this.nTopicTime
    //#post(long getTopicTime()): init'ed(return_value)
    //#ChannelInfo.java:405: end of method: long com.dmdirc.parser.irc.ChannelInfo.getTopicTime()
	
	/**
	 * Set the topic.
	 *
	 * @param sNewTopic New contents of topic
	 */	
	protected void setTopic(final String sNewTopic) { sTopic = sNewTopic; }
    //#ChannelInfo.java:412: method: void com.dmdirc.parser.irc.ChannelInfo.setTopic(String)
    //#input(void setTopic(String)): sNewTopic
    //#input(void setTopic(String)): this
    //#output(void setTopic(String)): this.sTopic
    //#post(void setTopic(String)): this.sTopic == sNewTopic
    //#post(void setTopic(String)): init'ed(this.sTopic)
    //#ChannelInfo.java:412: end of method: void com.dmdirc.parser.irc.ChannelInfo.setTopic(String)
	/**
	 * Get the topic.
	 *
	 * @return contents of topic
	 */	
	public String getTopic() { return sTopic; }	
    //#ChannelInfo.java:418: method: String com.dmdirc.parser.irc.ChannelInfo.getTopic()
    //#input(String getTopic()): this
    //#input(String getTopic()): this.sTopic
    //#output(String getTopic()): return_value
    //#pre[2] (String getTopic()): init'ed(this.sTopic)
    //#post(String getTopic()): return_value == this.sTopic
    //#post(String getTopic()): init'ed(return_value)
    //#ChannelInfo.java:418: end of method: String com.dmdirc.parser.irc.ChannelInfo.getTopic()

	/**
	 * Set the topic creator.
	 *
	 * @param sNewUser New user who set the topic (nickname if gotten on connect, full host if seen by parser)
	 */	
	protected void setTopicUser(final String sNewUser) { sTopicUser = sNewUser; }
    //#ChannelInfo.java:425: method: void com.dmdirc.parser.irc.ChannelInfo.setTopicUser(String)
    //#input(void setTopicUser(String)): sNewUser
    //#input(void setTopicUser(String)): this
    //#output(void setTopicUser(String)): this.sTopicUser
    //#post(void setTopicUser(String)): this.sTopicUser == sNewUser
    //#post(void setTopicUser(String)): init'ed(this.sTopicUser)
    //#ChannelInfo.java:425: end of method: void com.dmdirc.parser.irc.ChannelInfo.setTopicUser(String)
	/**
	 * Get the topic creator.
	 *
	 * @return user who set the topic (nickname if gotten on connect, full host if seen by parser)
	 */	
	public String getTopicUser() { return sTopicUser; }
    //#ChannelInfo.java:431: method: String com.dmdirc.parser.irc.ChannelInfo.getTopicUser()
    //#input(String getTopicUser()): this
    //#input(String getTopicUser()): this.sTopicUser
    //#output(String getTopicUser()): return_value
    //#pre[2] (String getTopicUser()): init'ed(this.sTopicUser)
    //#post(String getTopicUser()): return_value == this.sTopicUser
    //#post(String getTopicUser()): init'ed(return_value)
    //#ChannelInfo.java:431: end of method: String com.dmdirc.parser.irc.ChannelInfo.getTopicUser()
	
	/**
	 * Set the channel modes (as an integer).
	 *
	 * @param nNewMode new long representing channel modes. (Boolean only)
	 */	
	protected void setMode(final long nNewMode) { nModes = nNewMode; }
    //#ChannelInfo.java:438: method: void com.dmdirc.parser.irc.ChannelInfo.setMode(long)
    //#input(void setMode(long)): nNewMode
    //#input(void setMode(long)): this
    //#output(void setMode(long)): this.nModes
    //#post(void setMode(long)): this.nModes == nNewMode
    //#post(void setMode(long)): init'ed(this.nModes)
    //#ChannelInfo.java:438: end of method: void com.dmdirc.parser.irc.ChannelInfo.setMode(long)
	/**
	 * Get the channel modes (as an integer).
	 *
	 * @return long representing channel modes. (Boolean only)
	 */	
	public long getMode() { return nModes; }	
    //#ChannelInfo.java:444: method: long com.dmdirc.parser.irc.ChannelInfo.getMode()
    //#input(long getMode()): this
    //#input(long getMode()): this.nModes
    //#output(long getMode()): return_value
    //#pre[2] (long getMode()): init'ed(this.nModes)
    //#post(long getMode()): return_value == this.nModes
    //#post(long getMode()): init'ed(return_value)
    //#ChannelInfo.java:444: end of method: long com.dmdirc.parser.irc.ChannelInfo.getMode()
	
	/**
	 * Get the channel modes (as a string representation).
	 *
	 * @return string representing modes. (boolean and non-list)
	 */	
	public String getModeStr() {
		final StringBuilder sModes = new StringBuilder("+");
    //#ChannelInfo.java:452: method: String com.dmdirc.parser.irc.ChannelInfo.getModeStr()
    //#input(String getModeStr()): " "._tainted
    //#input(String getModeStr()): ""._tainted
    //#input(String getModeStr()): "+"._tainted
    //#input(String getModeStr()): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(String getModeStr()): __Descendant_Table[others]
    //#input(String getModeStr()): __Dispatch_Table.getMode()J
    //#input(String getModeStr()): __Dispatch_Table.getModeParam(Ljava/lang/Character;)Ljava/lang/String;
    //#input(String getModeStr()): this
    //#input(String getModeStr()): this.__Tag
    //#input(String getModeStr()): this.hParamModes
    //#input(String getModeStr()): this.myParser
    //#input(String getModeStr()): this.myParser.hChanModesBool
    //#input(String getModeStr()): this.nModes
    //#output(String getModeStr()): java.lang.StringBuilder:toString(...)._tainted
    //#output(String getModeStr()): return_value
    //#new obj(String getModeStr()): java.lang.StringBuilder:toString(...)
    //#pre[2] (String getModeStr()): this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[3] (String getModeStr()): this.hParamModes != null
    //#pre[4] (String getModeStr()): this.myParser != null
    //#pre[5] (String getModeStr()): this.myParser.hChanModesBool != null
    //#pre[6] (String getModeStr()): init'ed(this.nModes)
    //#presumption(String getModeStr()): java.util.Iterator:next(...)@457 != null
    //#presumption(String getModeStr()): java.util.Iterator:next(...)@461 != null
    //#presumption(String getModeStr()): java.util.Map:get(...)@458 != null
    //#presumption(String getModeStr()): java.util.Map:get(...)@462 != null
    //#presumption(String getModeStr()): java.util.Map:keySet(...)@457 != null
    //#presumption(String getModeStr()): java.util.Map:keySet(...)@461 != null
    //#post(String getModeStr()): init'ed(java.lang.StringBuilder:toString(...)._tainted)
    //#post(String getModeStr()): return_value == &java.lang.StringBuilder:toString(...)
    //#unanalyzed(String getModeStr()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(String getModeStr()): Effects-of-calling:java.util.Map:get
    //#test_vector(String getModeStr()): java.lang.String:isEmpty(...)@463: {1}, {0}
    //#test_vector(String getModeStr()): java.util.Iterator:hasNext(...)@457: {0}, {1}
    //#test_vector(String getModeStr()): java.util.Iterator:hasNext(...)@461: {0}, {1}
		final StringBuilder sModeParams = new StringBuilder();
		String sTemp = "";
    //#ChannelInfo.java:454: Warning: unused assignment
    //#    Unused assignment into sTemp
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: String getModeStr()
		long nTemp = 0;
    //#ChannelInfo.java:455: Warning: unused assignment
    //#    Unused assignment into nTemp
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: String getModeStr()
    //#    Attribs:  Uncertain
		final long nChanModes = this.getMode();
		for (char cTemp : myParser.hChanModesBool.keySet()) {
			nTemp = myParser.hChanModesBool.get(cTemp);
			if ((nChanModes & nTemp) == nTemp) { sModes.append(cTemp); }
		}
		for (char cTemp : hParamModes.keySet()) {
			sTemp = hParamModes.get(cTemp);
			if (!sTemp.isEmpty()) {
				sModes.append(cTemp);
				sModeParams.append(" ").append(this.getModeParam(cTemp));
 			}
		}
		
		return sModes.append(sModeParams).toString();
    //#ChannelInfo.java:469: end of method: String com.dmdirc.parser.irc.ChannelInfo.getModeStr()
	}	
	
	/**
	 * Set a channel mode that requires a parameter.
	 *
	 * @param cMode Character representing mode
	 * @param sValue String repreenting value (if "" mode is unset)
	 */	
	protected void setModeParam(final Character cMode, final String sValue) { 
		if (sValue.isEmpty()) {
    //#ChannelInfo.java:479: method: void com.dmdirc.parser.irc.ChannelInfo.setModeParam(Character, String)
    //#input(void setModeParam(Character, String)): cMode
    //#input(void setModeParam(Character, String)): sValue
    //#input(void setModeParam(Character, String)): this
    //#input(void setModeParam(Character, String)): this.hParamModes
    //#pre[2] (void setModeParam(Character, String)): sValue != null
    //#pre[4] (void setModeParam(Character, String)): this.hParamModes != null
    //#test_vector(void setModeParam(Character, String)): java.lang.String:isEmpty(...)@479: {0}, {1}
    //#test_vector(void setModeParam(Character, String)): java.util.Map:containsKey(...)@480: {0}, {1}
			if (hParamModes.containsKey(cMode)) {
				hParamModes.remove(cMode);
			}
		} else {
			hParamModes.put(cMode, sValue);
		}
	}
    //#ChannelInfo.java:486: end of method: void com.dmdirc.parser.irc.ChannelInfo.setModeParam(Character, String)
	/**
	 * Get the value of a mode that requires a parameter.
	 *
	 * @param cMode Character representing mode
	 * @return string representing the value of the mode ("" if mode not set)
	 */	
	public String getModeParam(final Character cMode) { 
		if (hParamModes.containsKey(cMode)) { 
    //#ChannelInfo.java:494: method: String com.dmdirc.parser.irc.ChannelInfo.getModeParam(Character)
    //#input(String getModeParam(Character)): cMode
    //#input(String getModeParam(Character)): this
    //#input(String getModeParam(Character)): this.hParamModes
    //#output(String getModeParam(Character)): return_value
    //#pre[3] (String getModeParam(Character)): this.hParamModes != null
    //#post(String getModeParam(Character)): init'ed(return_value)
    //#test_vector(String getModeParam(Character)): java.util.Map:containsKey(...)@494: {0}, {1}
			return hParamModes.get(cMode); 
		}
		return "";
    //#ChannelInfo.java:497: end of method: String com.dmdirc.parser.irc.ChannelInfo.getModeParam(Character)
	}
	
	/**
	 * Add/Remove a value to a channel list.
	 *
	 * @param givenMode Character representing mode
	 * @param givenItem ChannelListModeItem representing the item
	 * @param bAdd Add or remove the value. (true for add, false for remove)
	 */
	protected void setListModeParam(final Character givenMode, final ChannelListModeItem givenItem, final boolean bAdd) { 
		Character cMode = givenMode;
    //#ChannelInfo.java:508: method: void com.dmdirc.parser.irc.ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): bAdd
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/ChannelListModeItem.__Descendant_Table[com/dmdirc/parser/irc/ChannelListModeItem]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/ChannelListModeItem.__Descendant_Table[others]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCD(Z)Ljava/lang/String;
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.equalsIgnoreCase(Ljava/lang/String;Ljava/lang/String;)Z
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem.myItem
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem.myItem._tainted
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem.myOwner
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem.myOwner._tainted
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenItem.myTime
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): givenMode
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.hListModes
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.__Tag
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.h005Info
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.hChanModesOther
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.sNetworkName
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter.__Tag
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter.lowercase
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter.lowercase.length
    //#input(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter.lowercase[0..65_535]
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#1) num objects
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#1).length
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#2) num objects
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#2).length
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.stringConverter
    //#new obj(void setListModeParam(Character, ChannelListModeItem, bool)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#1)
    //#new obj(void setListModeParam(Character, ChannelListModeItem, bool)): new char[](IRCStringConverter#2)
    //#pre[12] (void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser != null
    //#pre[15] (void setListModeParam(Character, ChannelListModeItem, bool)): this.myParser.hChanModesOther != null
    //#pre[2] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) givenItem != null
    //#pre[3] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) givenItem.myItem != null
    //#pre[5] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) givenItem.myOwner != null
    //#pre[8] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) givenMode != null
    //#pre[9] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.stringConverter != null
    //#pre[11] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.hListModes != null
    //#pre[13] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[14] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.h005Info != null
    //#pre[16] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.sNetworkName != null
    //#pre[17] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.stringConverter.__Tag == com/dmdirc/parser/irc/IRCStringConverter
    //#pre[18] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.stringConverter.lowercase != null
    //#pre[19] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) this.myParser.stringConverter.lowercase.length >= 1
    //#pre[20] (void setListModeParam(Character, ChannelListModeItem, bool)): (soft) init'ed(this.myParser.stringConverter.lowercase[0..65_535])
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): getIRCStringConverter(...).__Tag@514 == com/dmdirc/parser/irc/IRCStringConverter
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): getIRCStringConverter(...).lowercase.length@514 >= 1
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): getIRCStringConverter(...).lowercase@514 != null
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.ArrayList:get(...).__Tag@532 == com/dmdirc/parser/irc/ChannelListModeItem
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.ArrayList:get(...)@532 != null
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.Map:get(...)@510 != null
    //#presumption(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.Map:get(...)@530 != null
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): init'ed(this.myParser.stringConverter)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): init'ed(new IRCStringConverter(getIRCStringConverter#1) num objects)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): init'ed(new char[](IRCStringConverter#1) num objects)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new char[](IRCStringConverter#1).length)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): init'ed(new char[](IRCStringConverter#2) num objects)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new char[](IRCStringConverter#2).length)
    //#post(void setListModeParam(Character, ChannelListModeItem, bool)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void setListModeParam(Character, ChannelListModeItem, bool)): Effects-of-calling:java.lang.String:substring
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): bAdd: {0}, {1}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.Byte:byteValue(...)@510: {1}, {-128..0, 2..255}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.Character:charValue(...)@513: {98}, {0..97, 99..65_535}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.Character:charValue(...)@513: {0..112, 114..65_535}, {113}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.Character:charValue(...)@516: {0..97, 99..65_535}, {98}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.Character:charValue(...)@518: {0..112, 114..65_535}, {113}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.String:charAt(...)@516: {0..36, 38..65_535}, {37}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.String:charAt(...)@518: {37}, {0..36, 38..65_535}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.String:charAt(...)@521: {0..36, 38..65_535}, {37}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.String:equals(...)@515: {1}, {0}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.lang.String:equals(...)@515: {0}, {1}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.Map:containsKey(...)@510: {0}, {1}
    //#test_vector(void setListModeParam(Character, ChannelListModeItem, bool)): java.util.Map:containsKey(...)@527: {1}, {0}
		ChannelListModeItem newItem = givenItem;
		if (!myParser.hChanModesOther.containsKey(cMode) || myParser.hChanModesOther.get(cMode) != IRCParser.MODE_LIST) { return; }
		
		// Hyperion sucks.
		if (cMode == 'b' || cMode == 'q') {
			final String thisIRCD = myParser.getIRCD(true).toLowerCase();
			if ((thisIRCD.equals("hyperion") || thisIRCD.equals("dancer"))) {
				if (cMode == 'b' && givenItem.getItem().charAt(0) == '%') {
					cMode = 'q';
				} else if (cMode == 'q' && givenItem.getItem().charAt(0) != '%') {
					cMode = 'b';
				}
				if (givenItem.getItem().charAt(0) == '%') {
					newItem = new ChannelListModeItem(givenItem.getItem().substring(1), givenItem.getOwner(), givenItem.getTime());
				}
			}
		}
		
		if (!hListModes.containsKey(cMode)) { 
			hListModes.put(cMode, new ArrayList<ChannelListModeItem>());	
		}
		final ArrayList<ChannelListModeItem> lModes = hListModes.get(cMode);
		for (int i = 0; i < lModes.size(); i++) {
			if (myParser.getIRCStringConverter().equalsIgnoreCase(lModes.get(i).getItem(), newItem.getItem())) { 
    //#ChannelInfo.java:532: ?use of default init
    //#    init'ed(getIRCStringConverter(...).__Tag)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void setListModeParam(Character, ChannelListModeItem, bool)
    //#    basic block: bb_28
    //#    assertion: init'ed(getIRCStringConverter(...).__Tag)
    //#    VN: getIRCStringConverter(...).__Tag
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid  Uncertain
    //#ChannelInfo.java:532: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase: (soft) this.lowercase != null
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void setListModeParam(Character, ChannelListModeItem, bool)
    //#    basic block: bb_28
    //#    assertion: (soft) getIRCStringConverter(...).lowercase != null
    //#    callee: bool com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase(String, String)
    //#    callee assertion: (soft) this.lowercase != null
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [11]
    //#    callee srcpos: 123
    //#    VN: getIRCStringConverter(...).lowercase
    //#    Expected: Inverse{null}
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Soft  Bad only invalid
    //#ChannelInfo.java:532: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase: (soft) this.lowercase.length >= 1
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void setListModeParam(Character, ChannelListModeItem, bool)
    //#    basic block: bb_28
    //#    assertion: (soft) getIRCStringConverter(...).lowercase.length >= 1
    //#    callee: bool com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase(String, String)
    //#    callee assertion: (soft) this.lowercase.length >= 1
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [12]
    //#    callee srcpos: 123
    //#    VN: getIRCStringConverter(...).lowercase.length
    //#    Expected: {1..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid  Uncertain
    //#ChannelInfo.java:532: ?precondition failure
    //#    com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase: (soft) init'ed(this.lowercase[0..65_535])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void setListModeParam(Character, ChannelListModeItem, bool)
    //#    basic block: bb_28
    //#    assertion: (soft) init'ed(getIRCStringConverter(...).lowercase[0..65_535])
    //#    callee: bool com/dmdirc/parser/irc/IRCStringConverter.equalsIgnoreCase(String, String)
    //#    callee assertion: (soft) init'ed(this.lowercase[0..65_535])
    //#    callee file: IRCStringConverter.java
    //#    callee precondition index: [13]
    //#    callee srcpos: 123
    //#    VN: getIRCStringConverter(...).lowercase[0..65_535]
    //#    Expected: {0..65_535}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Soft  Bad only invalid
				if (bAdd) { return; }
				else { 
					lModes.remove(i);
					break;
				}
			}
		}
		if (bAdd) { lModes.add(newItem); }
	}
    //#ChannelInfo.java:541: end of method: void com.dmdirc.parser.irc.ChannelInfo.setListModeParam(Character, ChannelListModeItem, bool)
	
	/**
	 * Get the list object representing a channel mode.
	 *
	 * @param cMode Character representing mode
	 * @return ArrayList containing ChannelListModeItem in the list, or null if mode is invalid
	 */
	public List<ChannelListModeItem> getListModeParam(final Character cMode) {
		if (!myParser.hChanModesOther.containsKey(cMode) || myParser.hChanModesOther.get(cMode) != myParser.MODE_LIST) { return null; }
    //#ChannelInfo.java:550: method: List com.dmdirc.parser.irc.ChannelInfo.getListModeParam(Character)
    //#input(List getListModeParam(Character)): cMode
    //#input(List getListModeParam(Character)): this
    //#input(List getListModeParam(Character)): this.hListModes
    //#input(List getListModeParam(Character)): this.myParser
    //#input(List getListModeParam(Character)): this.myParser.hChanModesOther
    //#output(List getListModeParam(Character)): return_value
    //#pre[4] (List getListModeParam(Character)): this.myParser != null
    //#pre[5] (List getListModeParam(Character)): this.myParser.hChanModesOther != null
    //#pre[3] (List getListModeParam(Character)): (soft) this.hListModes != null
    //#presumption(List getListModeParam(Character)): java.util.Map:get(...)@550 != null
    //#post(List getListModeParam(Character)): init'ed(return_value)
    //#test_vector(List getListModeParam(Character)): java.lang.Byte:byteValue(...)@550: {1}, {-128..0, 2..255}
    //#test_vector(List getListModeParam(Character)): java.util.Map:containsKey(...)@550: {0}, {1}
    //#test_vector(List getListModeParam(Character)): java.util.Map:containsKey(...)@552: {1}, {0}
		
		if (!hListModes.containsKey(cMode)) { 
			hListModes.put(cMode, new ArrayList<ChannelListModeItem>());
		}
		return hListModes.get(cMode);
    //#ChannelInfo.java:555: end of method: List com.dmdirc.parser.irc.ChannelInfo.getListModeParam(Character)
	}
	
	/**
	 * Get the "adding state" of a list mode.
	 * 
	 * @param cMode Character representing mode 
	 * @return false if we are not expecting a 367 etc, else true.
	 */
	public boolean getAddState(final Character cMode) { 
		synchronized (lAddingModes) {
    //#ChannelInfo.java:565: method: bool com.dmdirc.parser.irc.ChannelInfo.getAddState(Character)
    //#input(bool getAddState(Character)): cMode
    //#input(bool getAddState(Character)): this
    //#input(bool getAddState(Character)): this.lAddingModes
    //#input(bool getAddState(Character)): this.lAddingModes.__Lock
    //#output(bool getAddState(Character)): return_value
    //#pre[3] (bool getAddState(Character)): this.lAddingModes != null
    //#post(bool getAddState(Character)): init'ed(return_value)
			return lAddingModes.contains(cMode);
		}
    //#ChannelInfo.java:567: end of method: bool com.dmdirc.parser.irc.ChannelInfo.getAddState(Character)
	}
	
	/**
	 * Get the "adding state" of a list mode.
	 * 
	 * @param cMode Character representing mode
	 * @param newState change the value returned by getAddState
	 */
	protected void setAddState(final Character cMode, final boolean newState) { 
		synchronized (lAddingModes) {
    //#ChannelInfo.java:577: method: void com.dmdirc.parser.irc.ChannelInfo.setAddState(Character, bool)
    //#input(void setAddState(Character, bool)): cMode
    //#input(void setAddState(Character, bool)): newState
    //#input(void setAddState(Character, bool)): this
    //#input(void setAddState(Character, bool)): this.lAddingModes
    //#input(void setAddState(Character, bool)): this.lAddingModes.__Lock
    //#pre[4] (void setAddState(Character, bool)): this.lAddingModes != null
    //#test_vector(void setAddState(Character, bool)): newState: {0}, {1}
			if (newState) {
				lAddingModes.add(cMode);
			} else {
				if (lAddingModes.contains(cMode)) { lAddingModes.remove(cMode); }
			}
		}
	}
    //#ChannelInfo.java:584: end of method: void com.dmdirc.parser.irc.ChannelInfo.setAddState(Character, bool)
	
	/**
	 * Reset the "adding state" of *all* list modes.
	 */
	protected void resetAddState() {
		synchronized (lAddingModes) {
    //#ChannelInfo.java:590: method: void com.dmdirc.parser.irc.ChannelInfo.resetAddState()
    //#input(void resetAddState()): this
    //#input(void resetAddState()): this.lAddingModes
    //#input(void resetAddState()): this.lAddingModes.__Lock
    //#pre[2] (void resetAddState()): this.lAddingModes != null
			lAddingModes.clear();
		}
	}
    //#ChannelInfo.java:593: end of method: void com.dmdirc.parser.irc.ChannelInfo.resetAddState()
	
	/**
	 * Adjust the channel modes on a channel.
	 * This function will queue modes up to be sent in one go, according to 005 params.
	 * If less modes are altered than the queue accepts, sendModes() must be called.<br><br>
	 * sendModes is automatically called if you attempt to add more modes than is allowed
	 * to be queued
	 *
	 * @param positive Is this a positive mode change, or a negative mode change
	 * @param mode Character representing the mode to change
	 * @param parameter Parameter needed to make change (not used if mode doesn't need a parameter)
	 */
	public void alterMode(final boolean positive, final Character mode, final String parameter) { 
		int modecount = 1;
    //#ChannelInfo.java:607: method: void com.dmdirc.parser.irc.ChannelInfo.alterMode(bool, Character, String)
    //#input(void alterMode(bool, Character, String)): " "._tainted
    //#input(void alterMode(bool, Character, String)): " for mode "._tainted
    //#input(void alterMode(bool, Character, String)): ""._tainted
    //#input(void alterMode(bool, Character, String)): "+"._tainted
    //#input(void alterMode(bool, Character, String)): "-"._tainted
    //#input(void alterMode(bool, Character, String)): ".*"._tainted
    //#input(void alterMode(bool, Character, String)): "Callback not found: "._tainted
    //#input(void alterMode(bool, Character, String)): "Intercepted mode request for "._tainted
    //#input(void alterMode(bool, Character, String)): "MODE "._tainted
    //#input(void alterMode(bool, Character, String)): "OnDataOut"._tainted
    //#input(void alterMode(bool, Character, String)): "OnDebugInfo"._tainted
    //#input(void alterMode(bool, Character, String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void alterMode(bool, Character, String)): __Descendant_Table[others]
    //#input(void alterMode(bool, Character, String)): __Dispatch_Table.clearModeQueue()V
    //#input(void alterMode(bool, Character, String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void alterMode(bool, Character, String)): __Dispatch_Table.getModeParam(Ljava/lang/Character;)Ljava/lang/String;
    //#input(void alterMode(bool, Character, String)): __Dispatch_Table.sendModes()V
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.isUserSettable(Ljava/lang/Character;)Z
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void alterMode(bool, Character, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void alterMode(bool, Character, String)): mode
    //#input(void alterMode(bool, Character, String)): mode._tainted
    //#input(void alterMode(bool, Character, String)): parameter
    //#input(void alterMode(bool, Character, String)): parameter._tainted
    //#input(void alterMode(bool, Character, String)): positive
    //#input(void alterMode(bool, Character, String)): this
    //#input(void alterMode(bool, Character, String)): this.__Tag
    //#input(void alterMode(bool, Character, String)): this.hParamModes
    //#input(void alterMode(bool, Character, String)): this.lModeQueue
    //#input(void alterMode(bool, Character, String)): this.myParser
    //#input(void alterMode(bool, Character, String)): this.myParser.__Tag
    //#input(void alterMode(bool, Character, String)): this.myParser.cMyself
    //#input(void alterMode(bool, Character, String)): this.myParser.currentSocketState
    //#input(void alterMode(bool, Character, String)): this.myParser.h005Info
    //#input(void alterMode(bool, Character, String)): this.myParser.hChanModesBool
    //#input(void alterMode(bool, Character, String)): this.myParser.hChanModesOther
    //#input(void alterMode(bool, Character, String)): this.myParser.hChannelList
    //#input(void alterMode(bool, Character, String)): this.myParser.hPrefixModes
    //#input(void alterMode(bool, Character, String)): this.myParser.myCallbackManager
    //#input(void alterMode(bool, Character, String)): this.myParser.myCallbackManager.callbackHash
    //#input(void alterMode(bool, Character, String)): this.myParser.out
    //#input(void alterMode(bool, Character, String)): this.myParser.stringConverter
    //#input(void alterMode(bool, Character, String)): this.myParser.stringConverter.__Tag
    //#input(void alterMode(bool, Character, String)): this.myParser.stringConverter.lowercase
    //#input(void alterMode(bool, Character, String)): this.myParser.stringConverter.lowercase.length
    //#input(void alterMode(bool, Character, String)): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void alterMode(bool, Character, String)): this.sName
    //#input(void alterMode(bool, Character, String)): this.sName._tainted
    //#output(void alterMode(bool, Character, String)): java.lang.String:substring(...)._tainted
    //#output(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#1) num objects
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#1).length
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#2) num objects
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#2).length
    //#output(void alterMode(bool, Character, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void alterMode(bool, Character, String)): this.myParser.cMyself.myAwayReason
    //#output(void alterMode(bool, Character, String)): this.myParser.stringConverter
    //#new obj(void alterMode(bool, Character, String)): java.lang.String:substring(...)
    //#new obj(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void alterMode(bool, Character, String)): new char[](IRCStringConverter#1)
    //#new obj(void alterMode(bool, Character, String)): new char[](IRCStringConverter#2)
    //#pre[12] (void alterMode(bool, Character, String)): this.myParser != null
    //#pre[13] (void alterMode(bool, Character, String)): this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[16] (void alterMode(bool, Character, String)): this.myParser.h005Info != null
    //#pre[4] (void alterMode(bool, Character, String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[9] (void alterMode(bool, Character, String)): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[10] (void alterMode(bool, Character, String)): (soft) this.hParamModes != null
    //#pre[11] (void alterMode(bool, Character, String)): (soft) this.lModeQueue != null
    //#pre[14] (void alterMode(bool, Character, String)): (soft) this.myParser.cMyself != null
    //#pre[15] (void alterMode(bool, Character, String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[17] (void alterMode(bool, Character, String)): (soft) this.myParser.hChanModesBool != null
    //#pre[18] (void alterMode(bool, Character, String)): (soft) this.myParser.hChanModesOther != null
    //#pre[19] (void alterMode(bool, Character, String)): (soft) this.myParser.hChannelList != null
    //#pre[21] (void alterMode(bool, Character, String)): (soft) this.myParser.hPrefixModes != null
    //#pre[22] (void alterMode(bool, Character, String)): (soft) this.myParser.myCallbackManager != null
    //#pre[23] (void alterMode(bool, Character, String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[24] (void alterMode(bool, Character, String)): (soft) init'ed(this.myParser.out)
    //#presumption(void alterMode(bool, Character, String)): java.util.Map:get(...)@633 != null
    //#post(void alterMode(bool, Character, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void alterMode(bool, Character, String)): possibly_updated(java.lang.String:substring(...)._tainted)
    //#post(void alterMode(bool, Character, String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void alterMode(bool, Character, String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void alterMode(bool, Character, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void alterMode(bool, Character, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void alterMode(bool, Character, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void alterMode(bool, Character, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void alterMode(bool, Character, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void alterMode(bool, Character, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void alterMode(bool, Character, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void alterMode(bool, Character, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void alterMode(bool, Character, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void alterMode(bool, Character, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void alterMode(bool, Character, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.List:clear
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:matches
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:call
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:callDebugInfo
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.List:size
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:doSendString
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.LinkedList:offer
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.List:isEmpty
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.util.List:get
    //#unanalyzed(void alterMode(bool, Character, String)): Effects-of-calling:java.lang.StringBuilder:length
    //#test_vector(void alterMode(bool, Character, String)): positive: {1}, {0}
    //#test_vector(void alterMode(bool, Character, String)): java.lang.String:isEmpty(...)@643: {1}, {0}
    //#test_vector(void alterMode(bool, Character, String)): java.lang.String:matches(...)@1730: {1}, {0}
    //#test_vector(void alterMode(bool, Character, String)): java.util.List:contains(...)@622: {0}, {1}
    //#test_vector(void alterMode(bool, Character, String)): java.util.Map:containsKey(...)@610: {0}, {1}
    //#test_vector(void alterMode(bool, Character, String)): java.util.Map:containsKey(...)@620: {0}, {1}
    //#test_vector(void alterMode(bool, Character, String)): java.util.Map:containsKey(...)@630: {0}, {1}
		int modeint = 0;
    //#ChannelInfo.java:608: Warning: unused assignment
    //#    Unused assignment into modeint
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void alterMode(bool, Character, String)
    //#    Attribs:  Uncertain
		String modestr = "";
    //#ChannelInfo.java:609: Warning: unused assignment
    //#    Unused assignment into modestr
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void alterMode(bool, Character, String)
		if (myParser.h005Info.containsKey("MODES")) {
			try {
				modecount = Integer.parseInt(myParser.h005Info.get("MODES")); 
			} catch (NumberFormatException e) { 
				modecount = 1; 
			}
		}
		if (!myParser.isUserSettable(mode)) { return; }

		modestr = ((positive) ? "+" : "-") + mode;
		if (myParser.hChanModesBool.containsKey(mode)) {
			final String teststr = ((positive) ? "-" : "+") + mode;
			if (lModeQueue.contains(teststr)) {
				lModeQueue.remove(teststr);
				return;
			} else if (lModeQueue.contains(modestr)) {
				return;
			}
		} else {
			// May need a param
			if (myParser.hPrefixModes.containsKey(mode)) {
				modestr = modestr + " " + parameter;
			} else {
				modeint = myParser.hChanModesOther.get(mode);
				if ((modeint & IRCParser.MODE_LIST) == IRCParser.MODE_LIST) {
					modestr = modestr + " " + parameter;
				} else if (!positive && ((modeint & IRCParser.MODE_UNSET) == IRCParser.MODE_UNSET)) {
					modestr = modestr + " " + parameter;
				} else if (positive && ((modeint & IRCParser.MODE_SET) == IRCParser.MODE_SET)) {
					// Does mode require a param to unset aswell?
					// We might need to queue an unset first
					if (((modeint & IRCParser.MODE_UNSET) == IRCParser.MODE_UNSET)) {
						final String existingParam = getModeParam(mode);
						if (!existingParam.isEmpty()) {
    //#ChannelInfo.java:643: ?null dereference
    //#    existingParam != null
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void alterMode(bool, Character, String)
    //#    basic block: bb_29
    //#    assertion: existingParam != null
    //#    VN: getModeParam(...)
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
							final String reverseModeStr = "-" + mode + " " + existingParam;
							
							myParser.callDebugInfo(IRCParser.DEBUG_INFO, "Queueing mode: %s", reverseModeStr);
							lModeQueue.add(reverseModeStr);
							if (lModeQueue.size() == modecount) { sendModes(); }
						}
					}
					modestr = modestr + " " + parameter;
				}
			}
		}
		myParser.callDebugInfo(IRCParser.DEBUG_INFO, "Queueing mode: %s", modestr);
		lModeQueue.add(modestr);
		if (lModeQueue.size() == modecount) { sendModes(); }
	}
    //#ChannelInfo.java:658: end of method: void com.dmdirc.parser.irc.ChannelInfo.alterMode(bool, Character, String)
	
	/**
	 * This function will send modes that are currently queued up to send.
	 * This assumes that the queue only contains the amount that are alowed to be sent
	 * and thus will try to send the entire queue in one go.<br><br>
	 * Modes are always sent negative then positive and not mixed.
	 */
	public void sendModes() { 
		if (lModeQueue.isEmpty()) { return; }
    //#ChannelInfo.java:667: method: void com.dmdirc.parser.irc.ChannelInfo.sendModes()
    //#input(void sendModes()): " "._tainted
    //#input(void sendModes()): " for mode "._tainted
    //#input(void sendModes()): "+"._tainted
    //#input(void sendModes()): "-"._tainted
    //#input(void sendModes()): "Callback not found: "._tainted
    //#input(void sendModes()): "Intercepted mode request for "._tainted
    //#input(void sendModes()): "MODE "._tainted
    //#input(void sendModes()): "OnDataOut"._tainted
    //#input(void sendModes()): "OnDebugInfo"._tainted
    //#input(void sendModes()): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendModes()): __Descendant_Table[others]
    //#input(void sendModes()): __Dispatch_Table.clearModeQueue()V
    //#input(void sendModes()): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;[Ljava/lang/Object;)Z
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendLine(Ljava/lang/String;)V
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendModes()): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendModes()): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendModes()): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendModes()): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendModes()): this
    //#input(void sendModes()): this.__Tag
    //#input(void sendModes()): this.lModeQueue
    //#input(void sendModes()): this.myParser
    //#input(void sendModes()): this.myParser.__Tag
    //#input(void sendModes()): this.myParser.cMyself
    //#input(void sendModes()): this.myParser.currentSocketState
    //#input(void sendModes()): this.myParser.hChanModesOther
    //#input(void sendModes()): this.myParser.hChannelList
    //#input(void sendModes()): this.myParser.myCallbackManager
    //#input(void sendModes()): this.myParser.myCallbackManager.callbackHash
    //#input(void sendModes()): this.myParser.out
    //#input(void sendModes()): this.myParser.stringConverter
    //#input(void sendModes()): this.myParser.stringConverter.__Tag
    //#input(void sendModes()): this.myParser.stringConverter.lowercase
    //#input(void sendModes()): this.myParser.stringConverter.lowercase.length
    //#input(void sendModes()): this.myParser.stringConverter.lowercase[0..65_535]
    //#input(void sendModes()): this.sName
    //#input(void sendModes()): this.sName._tainted
    //#output(void sendModes()): java.lang.String:substring(...)._tainted
    //#output(void sendModes()): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendModes()): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendModes()): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendModes()): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendModes()): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendModes()): new char[](IRCStringConverter#1) num objects
    //#output(void sendModes()): new char[](IRCStringConverter#1).length
    //#output(void sendModes()): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendModes()): new char[](IRCStringConverter#2) num objects
    //#output(void sendModes()): new char[](IRCStringConverter#2).length
    //#output(void sendModes()): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendModes()): this.myParser.cMyself.myAwayReason
    //#output(void sendModes()): this.myParser.stringConverter
    //#new obj(void sendModes()): java.lang.String:substring(...)
    //#new obj(void sendModes()): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendModes()): new char[](IRCStringConverter#1)
    //#new obj(void sendModes()): new char[](IRCStringConverter#2)
    //#pre[5] (void sendModes()): this.lModeQueue != null
    //#pre[2] (void sendModes()): (soft) init'ed(this.myParser.stringConverter)
    //#pre[4] (void sendModes()): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[6] (void sendModes()): (soft) this.myParser != null
    //#pre[7] (void sendModes()): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void sendModes()): (soft) this.myParser.cMyself != null
    //#pre[9] (void sendModes()): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[10] (void sendModes()): (soft) this.myParser.hChanModesOther != null
    //#pre[11] (void sendModes()): (soft) this.myParser.hChannelList != null
    //#pre[13] (void sendModes()): (soft) this.myParser.myCallbackManager != null
    //#pre[14] (void sendModes()): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[15] (void sendModes()): (soft) init'ed(this.myParser.out)
    //#presumption(void sendModes()): java.util.List:get(...)@677 != null
    //#post(void sendModes()): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendModes()): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendModes()): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendModes()): init'ed(this.myParser.stringConverter)
    //#post(void sendModes()): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendModes()): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendModes()): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendModes()): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendModes()): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendModes()): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendModes()): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendModes()): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.List:clear
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendModes()): Effects-of-calling:call
    //#unanalyzed(void sendModes()): Effects-of-calling:callDebugInfo
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:format
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendModes()): Effects-of-calling:doSendString
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendModes()): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendModes()): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendModes()): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendModes()): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendModes()): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendModes()): java.lang.String:charAt(...)@679: {0..42, 44..65_535}, {43}
    //#test_vector(void sendModes()): java.lang.StringBuilder:length(...)@688: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void sendModes()): java.lang.StringBuilder:length(...)@689: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void sendModes()): java.lang.StringBuilder:length(...)@690: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void sendModes()): java.lang.StringBuilder:length(...)@691: {-2_147_483_648..0}, {1..4_294_967_295}
    //#test_vector(void sendModes()): java.util.List:isEmpty(...)@667: {0}, {1}
		final StringBuilder positivemode = new StringBuilder();
		final StringBuilder positiveparam = new StringBuilder();
		final StringBuilder negativemode = new StringBuilder();
		final StringBuilder negativeparam = new StringBuilder();
		final StringBuilder sendModeStr = new StringBuilder();
		String modestr;
		String[] modeparam;
		boolean positive;
		for (int i = 0; i < lModeQueue.size(); ++i) {
			modeparam = lModeQueue.get(i).split(" ");
			modestr = modeparam[0];
    //#ChannelInfo.java:678: ?use of default init
    //#    init'ed(modeparam.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_5
    //#    assertion: init'ed(modeparam.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ChannelInfo.java:678: ?use of default init
    //#    init'ed(modeparam[0])
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_5
    //#    assertion: init'ed(modeparam[0])
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
			positive = modestr.charAt(0) == '+';
    //#ChannelInfo.java:679: ?use of default init
    //#    init'ed(modestr)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_5
    //#    assertion: init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ChannelInfo.java:679: ?null dereference
    //#    not_init'ed(modestr)
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_5
    //#    assertion: not_init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
			if (positive) {
				positivemode.append(modestr.charAt(1));
    //#ChannelInfo.java:681: ?use of default init
    //#    init'ed(modestr)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_9
    //#    assertion: init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ChannelInfo.java:681: ?null dereference
    //#    not_init'ed(modestr)
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_9
    //#    assertion: not_init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
				if (modeparam.length > 1) { positiveparam.append(" ").append(modeparam[1]); }
    //#ChannelInfo.java:682: ?use of default init
    //#    init'ed(modeparam.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_9
    //#    assertion: init'ed(modeparam.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ChannelInfo.java:682: Warning: test always goes same way
    //#    Test predetermined because modeparam.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    from bb: bb_9
    //#    live edge: bb_9-->bb_13
    //#    tested vn: undefined - 1
    //#    tested vn values: {-1}
    //#ChannelInfo.java:682: Warning: dead code
    //#    Dead code here because modeparam.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    dead bb: bb_10
			} else {
				negativemode.append(modestr.charAt(1));
    //#ChannelInfo.java:684: ?use of default init
    //#    init'ed(modestr)
    //#    severity: SUPPRESSED
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_11
    //#    assertion: init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Univ-VN-Set
    //#    Bad: {Invalid}
    //#    Attribs:  Ptr  Bad only invalid
    //#ChannelInfo.java:684: ?null dereference
    //#    not_init'ed(modestr)
    //#    severity: MEDIUM
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_11
    //#    assertion: not_init'ed(modestr)
    //#    VN: undefined
    //#    Expected: Inverse{null} or Invalid
    //#    Bad: Addr_Set{null}
    //#    Attribs:  Ptr  null in Bad
				if (modeparam.length > 1) { negativeparam.append(" ").append(modeparam[1]); }
    //#ChannelInfo.java:685: ?use of default init
    //#    init'ed(modeparam.length)
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    basic block: bb_11
    //#    assertion: init'ed(modeparam.length)
    //#    VN: undefined
    //#    Expected: {-Inf..+Inf}
    //#    Bad: {Invalid}
    //#    Attribs:  Int  Bad only invalid
    //#ChannelInfo.java:685: Warning: test always goes same way
    //#    Test predetermined because modeparam.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    from bb: bb_11
    //#    live edge: bb_11-->bb_13
    //#    tested vn: undefined - 1
    //#    tested vn values: {-1}
    //#ChannelInfo.java:685: Warning: dead code
    //#    Dead code here because modeparam.length == 0
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendModes()
    //#    dead bb: bb_12
			}
		}
		if (negativemode.length() > 0) { sendModeStr.append("-").append(negativemode); }
		if (positivemode.length() > 0) { sendModeStr.append("+").append(positivemode); }
		if (negativeparam.length() > 0) { sendModeStr.append(negativeparam); }
		if (positiveparam.length() > 0) { sendModeStr.append(positiveparam); }
		myParser.callDebugInfo(IRCParser.DEBUG_INFO, "Sending mode: %s", sendModeStr.toString());
		myParser.sendLine("MODE " + sName + " " + sendModeStr.toString());
		clearModeQueue();
	}
    //#ChannelInfo.java:695: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendModes()
	
	/**
	 * This function will clear the mode queue (WITHOUT Sending).
	 */
	public void clearModeQueue() { 
		lModeQueue.clear();
    //#ChannelInfo.java:701: method: void com.dmdirc.parser.irc.ChannelInfo.clearModeQueue()
    //#input(void clearModeQueue()): this
    //#input(void clearModeQueue()): this.lModeQueue
    //#pre[2] (void clearModeQueue()): this.lModeQueue != null
	}
    //#ChannelInfo.java:702: end of method: void com.dmdirc.parser.irc.ChannelInfo.clearModeQueue()
	
	/**
	 * Send a private message to the channel.
	 *
	 * @param sMessage Message to send
	 */
	public void sendMessage(final String sMessage) { 
		if (sMessage.isEmpty()) { return; }
    //#ChannelInfo.java:710: method: void com.dmdirc.parser.irc.ChannelInfo.sendMessage(String)
    //#input(void sendMessage(String)): " :"._tainted
    //#input(void sendMessage(String)): " for mode "._tainted
    //#input(void sendMessage(String)): "Callback not found: "._tainted
    //#input(void sendMessage(String)): "Intercepted mode request for "._tainted
    //#input(void sendMessage(String)): "OnDataOut"._tainted
    //#input(void sendMessage(String)): "OnDebugInfo"._tainted
    //#input(void sendMessage(String)): "PRIVMSG "._tainted
    //#input(void sendMessage(String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendMessage(String)): __Descendant_Table[others]
    //#input(void sendMessage(String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendMessage(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendMessage(String)): sMessage
    //#input(void sendMessage(String)): sMessage._tainted
    //#input(void sendMessage(String)): this
    //#input(void sendMessage(String)): this.myParser
    //#input(void sendMessage(String)): this.myParser.__Tag
    //#input(void sendMessage(String)): this.myParser.cMyself
    //#input(void sendMessage(String)): this.myParser.currentSocketState
    //#input(void sendMessage(String)): this.myParser.hChanModesOther
    //#input(void sendMessage(String)): this.myParser.hChannelList
    //#input(void sendMessage(String)): this.myParser.myCallbackManager
    //#input(void sendMessage(String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendMessage(String)): this.myParser.out
    //#input(void sendMessage(String)): this.myParser.stringConverter
    //#input(void sendMessage(String)): this.myParser.stringConverter.__Tag
    //#input(void sendMessage(String)): this.myParser.stringConverter.lowercase
    //#input(void sendMessage(String)): this.myParser.stringConverter.lowercase.length
    //#input(void sendMessage(String)): this.sName
    //#input(void sendMessage(String)): this.sName._tainted
    //#output(void sendMessage(String)): java.lang.String:substring(...)._tainted
    //#output(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendMessage(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendMessage(String)): new char[](IRCStringConverter#1).length
    //#output(void sendMessage(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendMessage(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendMessage(String)): new char[](IRCStringConverter#2).length
    //#output(void sendMessage(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendMessage(String)): this.myParser.cMyself.myAwayReason
    //#output(void sendMessage(String)): this.myParser.stringConverter
    //#new obj(void sendMessage(String)): java.lang.String:substring(...)
    //#new obj(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendMessage(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendMessage(String)): new char[](IRCStringConverter#2)
    //#pre[3] (void sendMessage(String)): sMessage != null
    //#pre[2] (void sendMessage(String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void sendMessage(String)): (soft) this.myParser != null
    //#pre[7] (void sendMessage(String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void sendMessage(String)): (soft) this.myParser.cMyself != null
    //#pre[9] (void sendMessage(String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[10] (void sendMessage(String)): (soft) this.myParser.hChanModesOther != null
    //#pre[11] (void sendMessage(String)): (soft) this.myParser.hChannelList != null
    //#pre[13] (void sendMessage(String)): (soft) this.myParser.myCallbackManager != null
    //#pre[14] (void sendMessage(String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[15] (void sendMessage(String)): (soft) init'ed(this.myParser.out)
    //#post(void sendMessage(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendMessage(String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendMessage(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendMessage(String)): init'ed(this.myParser.stringConverter)
    //#post(void sendMessage(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendMessage(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendMessage(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendMessage(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendMessage(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendMessage(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendMessage(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendMessage(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendMessage(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendMessage(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendMessage(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:call
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendMessage(String)): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendMessage(String)): java.lang.String:isEmpty(...)@710: {0}, {1}
		
		myParser.sendString("PRIVMSG " + sName + " :" + sMessage);	
	}
    //#ChannelInfo.java:713: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendMessage(String)
	
	/**
	 * Send a notice message to a target.
	 *
	 * @param sMessage Message to send
	 */
	public void sendNotice(final String sMessage) { 
		if (sMessage.isEmpty()) { return; }
    //#ChannelInfo.java:721: method: void com.dmdirc.parser.irc.ChannelInfo.sendNotice(String)
    //#input(void sendNotice(String)): " :"._tainted
    //#input(void sendNotice(String)): " for mode "._tainted
    //#input(void sendNotice(String)): "Callback not found: "._tainted
    //#input(void sendNotice(String)): "Intercepted mode request for "._tainted
    //#input(void sendNotice(String)): "NOTICE "._tainted
    //#input(void sendNotice(String)): "OnDataOut"._tainted
    //#input(void sendNotice(String)): "OnDebugInfo"._tainted
    //#input(void sendNotice(String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendNotice(String)): __Descendant_Table[others]
    //#input(void sendNotice(String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendNotice(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendNotice(String)): sMessage
    //#input(void sendNotice(String)): sMessage._tainted
    //#input(void sendNotice(String)): this
    //#input(void sendNotice(String)): this.myParser
    //#input(void sendNotice(String)): this.myParser.__Tag
    //#input(void sendNotice(String)): this.myParser.cMyself
    //#input(void sendNotice(String)): this.myParser.currentSocketState
    //#input(void sendNotice(String)): this.myParser.hChanModesOther
    //#input(void sendNotice(String)): this.myParser.hChannelList
    //#input(void sendNotice(String)): this.myParser.myCallbackManager
    //#input(void sendNotice(String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendNotice(String)): this.myParser.out
    //#input(void sendNotice(String)): this.myParser.stringConverter
    //#input(void sendNotice(String)): this.myParser.stringConverter.__Tag
    //#input(void sendNotice(String)): this.myParser.stringConverter.lowercase
    //#input(void sendNotice(String)): this.myParser.stringConverter.lowercase.length
    //#input(void sendNotice(String)): this.sName
    //#input(void sendNotice(String)): this.sName._tainted
    //#output(void sendNotice(String)): java.lang.String:substring(...)._tainted
    //#output(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendNotice(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendNotice(String)): new char[](IRCStringConverter#1).length
    //#output(void sendNotice(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendNotice(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendNotice(String)): new char[](IRCStringConverter#2).length
    //#output(void sendNotice(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendNotice(String)): this.myParser.cMyself.myAwayReason
    //#output(void sendNotice(String)): this.myParser.stringConverter
    //#new obj(void sendNotice(String)): java.lang.String:substring(...)
    //#new obj(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendNotice(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendNotice(String)): new char[](IRCStringConverter#2)
    //#pre[3] (void sendNotice(String)): sMessage != null
    //#pre[2] (void sendNotice(String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void sendNotice(String)): (soft) this.myParser != null
    //#pre[7] (void sendNotice(String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[8] (void sendNotice(String)): (soft) this.myParser.cMyself != null
    //#pre[9] (void sendNotice(String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[10] (void sendNotice(String)): (soft) this.myParser.hChanModesOther != null
    //#pre[11] (void sendNotice(String)): (soft) this.myParser.hChannelList != null
    //#pre[13] (void sendNotice(String)): (soft) this.myParser.myCallbackManager != null
    //#pre[14] (void sendNotice(String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[15] (void sendNotice(String)): (soft) init'ed(this.myParser.out)
    //#post(void sendNotice(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendNotice(String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendNotice(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendNotice(String)): init'ed(this.myParser.stringConverter)
    //#post(void sendNotice(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendNotice(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendNotice(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendNotice(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendNotice(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendNotice(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendNotice(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendNotice(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendNotice(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendNotice(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendNotice(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:call
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendNotice(String)): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendNotice(String)): java.lang.String:isEmpty(...)@721: {0}, {1}
		
		myParser.sendString("NOTICE " + sName + " :" + sMessage);	
	}
    //#ChannelInfo.java:724: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendNotice(String)

	/**
	 * Send a private message to a target.
	 *
	 * @param sMessage Message to send
	 */
	public void sendAction(final String sMessage) { 
		if (sMessage.isEmpty()) { return; }
    //#ChannelInfo.java:732: method: void com.dmdirc.parser.irc.ChannelInfo.sendAction(String)
    //#input(void sendAction(String)): " "._tainted
    //#input(void sendAction(String)): " :"._tainted
    //#input(void sendAction(String)): " for mode "._tainted
    //#input(void sendAction(String)): "Callback not found: "._tainted
    //#input(void sendAction(String)): "Intercepted mode request for "._tainted
    //#input(void sendAction(String)): "OnDataOut"._tainted
    //#input(void sendAction(String)): "OnDebugInfo"._tainted
    //#input(void sendAction(String)): "PRIVMSG "._tainted
    //#input(void sendAction(String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendAction(String)): __Descendant_Table[others]
    //#input(void sendAction(String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendAction(String)): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;)V
    //#input(void sendAction(String)): __Dispatch_Table.sendMessage(Ljava/lang/String;)V
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendAction(String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendAction(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendAction(String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendAction(String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendAction(String)): sMessage
    //#input(void sendAction(String)): sMessage._tainted
    //#input(void sendAction(String)): this
    //#input(void sendAction(String)): this.__Tag
    //#input(void sendAction(String)): this.myParser
    //#input(void sendAction(String)): this.myParser.__Tag
    //#input(void sendAction(String)): this.myParser.cMyself
    //#input(void sendAction(String)): this.myParser.currentSocketState
    //#input(void sendAction(String)): this.myParser.hChanModesOther
    //#input(void sendAction(String)): this.myParser.hChannelList
    //#input(void sendAction(String)): this.myParser.myCallbackManager
    //#input(void sendAction(String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendAction(String)): this.myParser.out
    //#input(void sendAction(String)): this.myParser.stringConverter
    //#input(void sendAction(String)): this.myParser.stringConverter.__Tag
    //#input(void sendAction(String)): this.myParser.stringConverter.lowercase
    //#input(void sendAction(String)): this.myParser.stringConverter.lowercase.length
    //#input(void sendAction(String)): this.sName
    //#input(void sendAction(String)): this.sName._tainted
    //#output(void sendAction(String)): java.lang.String:substring(...)._tainted
    //#output(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendAction(String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendAction(String)): new char[](IRCStringConverter#1).length
    //#output(void sendAction(String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendAction(String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendAction(String)): new char[](IRCStringConverter#2).length
    //#output(void sendAction(String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendAction(String)): this.myParser.cMyself.myAwayReason
    //#output(void sendAction(String)): this.myParser.stringConverter
    //#new obj(void sendAction(String)): java.lang.String:substring(...)
    //#new obj(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendAction(String)): new char[](IRCStringConverter#1)
    //#new obj(void sendAction(String)): new char[](IRCStringConverter#2)
    //#pre[3] (void sendAction(String)): sMessage != null
    //#pre[2] (void sendAction(String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[6] (void sendAction(String)): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[7] (void sendAction(String)): (soft) this.myParser != null
    //#pre[8] (void sendAction(String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[9] (void sendAction(String)): (soft) this.myParser.cMyself != null
    //#pre[10] (void sendAction(String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[11] (void sendAction(String)): (soft) this.myParser.hChanModesOther != null
    //#pre[12] (void sendAction(String)): (soft) this.myParser.hChannelList != null
    //#pre[14] (void sendAction(String)): (soft) this.myParser.myCallbackManager != null
    //#pre[15] (void sendAction(String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[16] (void sendAction(String)): (soft) init'ed(this.myParser.out)
    //#post(void sendAction(String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendAction(String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendAction(String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendAction(String)): init'ed(this.myParser.stringConverter)
    //#post(void sendAction(String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendAction(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendAction(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendAction(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendAction(String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendAction(String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendAction(String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendAction(String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendAction(String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendAction(String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendAction(String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String
    //#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:java.lang.String:toUpperCase
    //#unanalyzed(void sendAction(String)): Effects-of-calling:sendMessage
    //#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:java.lang.String:toLowerCase
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendAction(String)): Effects-of-calling:call
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:split
    //#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.Byte:byteValue
    //#unanalyzed(void sendAction(String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendAction(String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendAction(String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendAction(String)): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendAction(String)): java.lang.String:isEmpty(...)@732: {0}, {1}
		sendCTCP("ACTION", sMessage);
	}
    //#ChannelInfo.java:734: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendAction(String)
	
	/**
	 * Send a CTCP to a target.
	 *
	 * @param sType Type of CTCP
	 * @param sMessage Optional Additional Parameters
	 */
	public void sendCTCP(final String sType, String sMessage) { 
		if (sType.isEmpty()) { return; }
    //#ChannelInfo.java:743: method: void com.dmdirc.parser.irc.ChannelInfo.sendCTCP(String, String)
    //#input(void sendCTCP(String, String)): " "._tainted
    //#input(void sendCTCP(String, String)): " :"._tainted
    //#input(void sendCTCP(String, String)): " for mode "._tainted
    //#input(void sendCTCP(String, String)): "Callback not found: "._tainted
    //#input(void sendCTCP(String, String)): "Intercepted mode request for "._tainted
    //#input(void sendCTCP(String, String)): "OnDataOut"._tainted
    //#input(void sendCTCP(String, String)): "OnDebugInfo"._tainted
    //#input(void sendCTCP(String, String)): "PRIVMSG "._tainted
    //#input(void sendCTCP(String, String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendCTCP(String, String)): __Descendant_Table[others]
    //#input(void sendCTCP(String, String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendCTCP(String, String)): __Dispatch_Table.sendMessage(Ljava/lang/String;)V
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCP(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCP(String, String)): sMessage
    //#input(void sendCTCP(String, String)): sMessage._tainted
    //#input(void sendCTCP(String, String)): sType
    //#input(void sendCTCP(String, String)): this
    //#input(void sendCTCP(String, String)): this.__Tag
    //#input(void sendCTCP(String, String)): this.myParser
    //#input(void sendCTCP(String, String)): this.myParser.__Tag
    //#input(void sendCTCP(String, String)): this.myParser.cMyself
    //#input(void sendCTCP(String, String)): this.myParser.currentSocketState
    //#input(void sendCTCP(String, String)): this.myParser.hChanModesOther
    //#input(void sendCTCP(String, String)): this.myParser.hChannelList
    //#input(void sendCTCP(String, String)): this.myParser.myCallbackManager
    //#input(void sendCTCP(String, String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendCTCP(String, String)): this.myParser.out
    //#input(void sendCTCP(String, String)): this.myParser.stringConverter
    //#input(void sendCTCP(String, String)): this.myParser.stringConverter.__Tag
    //#input(void sendCTCP(String, String)): this.myParser.stringConverter.lowercase
    //#input(void sendCTCP(String, String)): this.myParser.stringConverter.lowercase.length
    //#input(void sendCTCP(String, String)): this.sName
    //#input(void sendCTCP(String, String)): this.sName._tainted
    //#output(void sendCTCP(String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendCTCP(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendCTCP(String, String)): this.myParser.cMyself.myAwayReason
    //#output(void sendCTCP(String, String)): this.myParser.stringConverter
    //#new obj(void sendCTCP(String, String)): java.lang.String:substring(...)
    //#new obj(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendCTCP(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendCTCP(String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendCTCP(String, String)): sType != null
    //#pre[2] (void sendCTCP(String, String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[3] (void sendCTCP(String, String)): (soft) sMessage != null
    //#pre[7] (void sendCTCP(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[8] (void sendCTCP(String, String)): (soft) this.myParser != null
    //#pre[9] (void sendCTCP(String, String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[10] (void sendCTCP(String, String)): (soft) this.myParser.cMyself != null
    //#pre[11] (void sendCTCP(String, String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[12] (void sendCTCP(String, String)): (soft) this.myParser.hChanModesOther != null
    //#pre[13] (void sendCTCP(String, String)): (soft) this.myParser.hChannelList != null
    //#pre[15] (void sendCTCP(String, String)): (soft) this.myParser.myCallbackManager != null
    //#pre[16] (void sendCTCP(String, String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[17] (void sendCTCP(String, String)): (soft) init'ed(this.myParser.out)
    //#post(void sendCTCP(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendCTCP(String, String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendCTCP(String, String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendCTCP(String, String)): init'ed(this.myParser.stringConverter)
    //#post(void sendCTCP(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendCTCP(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendCTCP(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendCTCP(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendCTCP(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendCTCP(String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendCTCP(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendCTCP(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendCTCP(String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendCTCP(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendCTCP(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:call
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendCTCP(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendCTCP(String, String)): java.lang.String:isEmpty(...)@743: {0}, {1}
    //#test_vector(void sendCTCP(String, String)): java.lang.String:isEmpty(...)@745: {1}, {0}
		final char char1 = (char) 1;
    //#ChannelInfo.java:744: Warning: unused assignment
    //#    Unused assignment into char1
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendCTCP(String, String)
		if (!sMessage.isEmpty()) { sMessage = " " + sMessage; }
		sendMessage(char1 + sType.toUpperCase() + sMessage + char1);
	}
    //#ChannelInfo.java:747: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendCTCP(String, String)
	
	/**
	 * Send a CTCPReply to a target.
	 *
	 * @param sType Type of CTCP
	 * @param sMessage Optional Additional Parameters
	 */
	public void sendCTCPReply(final String sType, String sMessage) { 
		if (sType.isEmpty()) { return; }
    //#ChannelInfo.java:756: method: void com.dmdirc.parser.irc.ChannelInfo.sendCTCPReply(String, String)
    //#input(void sendCTCPReply(String, String)): " "._tainted
    //#input(void sendCTCPReply(String, String)): " :"._tainted
    //#input(void sendCTCPReply(String, String)): " for mode "._tainted
    //#input(void sendCTCPReply(String, String)): "Callback not found: "._tainted
    //#input(void sendCTCPReply(String, String)): "Intercepted mode request for "._tainted
    //#input(void sendCTCPReply(String, String)): "NOTICE "._tainted
    //#input(void sendCTCPReply(String, String)): "OnDataOut"._tainted
    //#input(void sendCTCPReply(String, String)): "OnDebugInfo"._tainted
    //#input(void sendCTCPReply(String, String)): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#input(void sendCTCPReply(String, String)): __Descendant_Table[others]
    //#input(void sendCTCPReply(String, String)): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#input(void sendCTCPReply(String, String)): __Dispatch_Table.sendNotice(Ljava/lang/String;)V
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[com/dmdirc/parser/irc/IRCParser]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDataOut(Ljava/lang/String;Z)Z
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.callDebugInfo(ILjava/lang/String;)Z
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.doSendString(Ljava/lang/String;Z)V
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getChannelInfo(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelInfo;
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getIRCStringConverter()Lcom/dmdirc/parser/irc/IRCStringConverter;
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.getSocketState()Lcom/dmdirc/parser/irc/SocketState;
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCParser.__Dispatch_Table.sendString(Ljava/lang/String;)V
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[com/dmdirc/parser/irc/IRCStringConverter]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/IRCStringConverter.__Dispatch_Table.toLowerCase(Ljava/lang/String;)Ljava/lang/String;
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/SocketState.OPEN
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[com/dmdirc/parser/irc/callbacks/CallbackObject]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Descendant_Table[others]
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObject.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCPReply(String, String)): com/dmdirc/parser/irc/callbacks/CallbackObjectSpecific.__Dispatch_Table.call([Ljava/lang/Object;)Z
    //#input(void sendCTCPReply(String, String)): sMessage
    //#input(void sendCTCPReply(String, String)): sMessage._tainted
    //#input(void sendCTCPReply(String, String)): sType
    //#input(void sendCTCPReply(String, String)): this
    //#input(void sendCTCPReply(String, String)): this.__Tag
    //#input(void sendCTCPReply(String, String)): this.myParser
    //#input(void sendCTCPReply(String, String)): this.myParser.__Tag
    //#input(void sendCTCPReply(String, String)): this.myParser.cMyself
    //#input(void sendCTCPReply(String, String)): this.myParser.currentSocketState
    //#input(void sendCTCPReply(String, String)): this.myParser.hChanModesOther
    //#input(void sendCTCPReply(String, String)): this.myParser.hChannelList
    //#input(void sendCTCPReply(String, String)): this.myParser.myCallbackManager
    //#input(void sendCTCPReply(String, String)): this.myParser.myCallbackManager.callbackHash
    //#input(void sendCTCPReply(String, String)): this.myParser.out
    //#input(void sendCTCPReply(String, String)): this.myParser.stringConverter
    //#input(void sendCTCPReply(String, String)): this.myParser.stringConverter.__Tag
    //#input(void sendCTCPReply(String, String)): this.myParser.stringConverter.lowercase
    //#input(void sendCTCPReply(String, String)): this.myParser.stringConverter.lowercase.length
    //#input(void sendCTCPReply(String, String)): this.sName
    //#input(void sendCTCPReply(String, String)): this.sName._tainted
    //#output(void sendCTCPReply(String, String)): java.lang.String:substring(...)._tainted
    //#output(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects
    //#output(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1).__Tag
    //#output(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1).limit
    //#output(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1).lowercase
    //#output(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1).uppercase
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#1) num objects
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#1).length
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#1)[0..65_535]
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#2) num objects
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#2).length
    //#output(void sendCTCPReply(String, String)): new char[](IRCStringConverter#2)[0..65_567]
    //#output(void sendCTCPReply(String, String)): this.myParser.cMyself.myAwayReason
    //#output(void sendCTCPReply(String, String)): this.myParser.stringConverter
    //#new obj(void sendCTCPReply(String, String)): java.lang.String:substring(...)
    //#new obj(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1)
    //#new obj(void sendCTCPReply(String, String)): new char[](IRCStringConverter#1)
    //#new obj(void sendCTCPReply(String, String)): new char[](IRCStringConverter#2)
    //#pre[5] (void sendCTCPReply(String, String)): sType != null
    //#pre[2] (void sendCTCPReply(String, String)): (soft) init'ed(this.myParser.stringConverter)
    //#pre[3] (void sendCTCPReply(String, String)): (soft) sMessage != null
    //#pre[7] (void sendCTCPReply(String, String)): (soft) this.__Tag == com/dmdirc/parser/irc/ChannelInfo
    //#pre[8] (void sendCTCPReply(String, String)): (soft) this.myParser != null
    //#pre[9] (void sendCTCPReply(String, String)): (soft) this.myParser.__Tag == com/dmdirc/parser/irc/IRCParser
    //#pre[10] (void sendCTCPReply(String, String)): (soft) this.myParser.cMyself != null
    //#pre[11] (void sendCTCPReply(String, String)): (soft) init'ed(this.myParser.currentSocketState)
    //#pre[12] (void sendCTCPReply(String, String)): (soft) this.myParser.hChanModesOther != null
    //#pre[13] (void sendCTCPReply(String, String)): (soft) this.myParser.hChannelList != null
    //#pre[15] (void sendCTCPReply(String, String)): (soft) this.myParser.myCallbackManager != null
    //#pre[16] (void sendCTCPReply(String, String)): (soft) this.myParser.myCallbackManager.callbackHash != null
    //#pre[17] (void sendCTCPReply(String, String)): (soft) init'ed(this.myParser.out)
    //#post(void sendCTCPReply(String, String)): init'ed(java.lang.String:substring(...)._tainted)
    //#post(void sendCTCPReply(String, String)): possibly_updated(this.myParser.cMyself.myAwayReason)
    //#post(void sendCTCPReply(String, String)): this.myParser.stringConverter == One-of{old this.myParser.stringConverter, &new IRCStringConverter(getIRCStringConverter#1)}
    //#post(void sendCTCPReply(String, String)): init'ed(this.myParser.stringConverter)
    //#post(void sendCTCPReply(String, String)): new IRCStringConverter(getIRCStringConverter#1) num objects <= 1
    //#post(void sendCTCPReply(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).__Tag)
    //#post(void sendCTCPReply(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).limit)
    //#post(void sendCTCPReply(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).lowercase)
    //#post(void sendCTCPReply(String, String)): init'ed(new IRCStringConverter(getIRCStringConverter#1).uppercase)
    //#post(void sendCTCPReply(String, String)): new char[](IRCStringConverter#1) num objects <= 1
    //#post(void sendCTCPReply(String, String)): init'ed(new char[](IRCStringConverter#1).length)
    //#post(void sendCTCPReply(String, String)): possibly_updated(new char[](IRCStringConverter#1)[0..65_535])
    //#post(void sendCTCPReply(String, String)): new char[](IRCStringConverter#2) num objects <= 1
    //#post(void sendCTCPReply(String, String)): init'ed(new char[](IRCStringConverter#2).length)
    //#post(void sendCTCPReply(String, String)): possibly_updated(new char[](IRCStringConverter#2)[0..65_567])
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.LinkedList
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.System:currentTimeMillis
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:isEmpty
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:toCharArray
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:length
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.StringBuilder
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.StringBuilder:append
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.StringBuilder:toString
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.Map:containsKey
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.Map:get
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:toLowerCase
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.RuntimeException
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:call
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.Integer:valueOf
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:equalsIgnoreCase
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:indexOf
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:substring
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:split
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.Throwable:__curr_excep_obj
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.Character:valueOf
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.Byte:byteValue
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:doSendString
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.Boolean:valueOf
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.lang.String:charAt
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.io.PrintWriter:printf
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:setAwayReason
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:getListModeQueue
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.LinkedList:contains
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.Queue:offer
    //#unanalyzed(void sendCTCPReply(String, String)): Effects-of-calling:java.util.LinkedList:offer
    //#test_vector(void sendCTCPReply(String, String)): java.lang.String:isEmpty(...)@756: {0}, {1}
    //#test_vector(void sendCTCPReply(String, String)): java.lang.String:isEmpty(...)@758: {1}, {0}
		final char char1 = (char) 1;
    //#ChannelInfo.java:757: Warning: unused assignment
    //#    Unused assignment into char1
    //#    severity: LOW
    //#    class: com.dmdirc.parser.irc.ChannelInfo
    //#    method: void sendCTCPReply(String, String)
		if (!sMessage.isEmpty()) { sMessage = " " + sMessage; }
		sendNotice(char1 + sType.toUpperCase() + sMessage + char1);	
	}
    //#ChannelInfo.java:760: end of method: void com.dmdirc.parser.irc.ChannelInfo.sendCTCPReply(String, String)
	
	/**
	 * Get a string representation of the Channel.
	 *
	 * @return String representation of the Channel.
	 */
	@Override
	public String toString() { return sName; }
    //#ChannelInfo.java:768: method: String com.dmdirc.parser.irc.ChannelInfo.toString()
    //#input(String toString()): this
    //#input(String toString()): this.sName
    //#output(String toString()): return_value
    //#post(String toString()): return_value == this.sName
    //#post(String toString()): init'ed(return_value)
    //#ChannelInfo.java:768: end of method: String com.dmdirc.parser.irc.ChannelInfo.toString()
	
	/**
	 * Get the parser object that owns this channel.
	 *
	 * @return The parser object that owns this channel
	 */
	public IRCParser getParser() { return myParser; }
    //#ChannelInfo.java:775: method: IRCParser com.dmdirc.parser.irc.ChannelInfo.getParser()
    //#input(IRCParser getParser()): this
    //#input(IRCParser getParser()): this.myParser
    //#output(IRCParser getParser()): return_value
    //#post(IRCParser getParser()): return_value == this.myParser
    //#post(IRCParser getParser()): init'ed(return_value)
    //#ChannelInfo.java:775: end of method: IRCParser com.dmdirc.parser.irc.ChannelInfo.getParser()

}

    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo]
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.alterMode(ZLjava/lang/Character;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.clearModeQueue()V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.delClient(Lcom/dmdirc/parser/irc/ClientInfo;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.emptyChannel()V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getAddState(Ljava/lang/Character;)Z
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getChannelClients()Ljava/util/List;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getCreateTime()J
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getListModeParam(Ljava/lang/Character;)Ljava/util/List;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getListModeQueue()Ljava/util/Queue;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getMap()Ljava/util/Map;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getMode()J
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getModeParam(Ljava/lang/Character;)Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getModeStr()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getName()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopic()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopicTime()J
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopicUser()Ljava/lang/String;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Ljava/lang/String;Z)Lcom/dmdirc/parser/irc/ChannelClientInfo;
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUserCount()I
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.hasAskedForListModes()Z
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.hasGotListModes()Z
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.isAddingNames()Z
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.renameClient(Ljava/lang/String;Lcom/dmdirc/parser/irc/ChannelClientInfo;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.requestListModes()V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.resetAddState()V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendCTCPReply(Ljava/lang/String;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendMessage(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendModes()V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendNotice(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setAddState(Ljava/lang/Character;Z)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setAddingNames(Z)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setCreateTime(J)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setHasGotListModes(Z)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setListModeParam(Ljava/lang/Character;Lcom/dmdirc/parser/irc/ChannelListModeItem;Z)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setMap(Ljava/util/Map;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setMode(J)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setModeParam(Ljava/lang/Character;Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopic(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopicTime(J)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopicUser(Ljava/lang/String;)V
    //#output(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.toString()Ljava/lang/String;
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Descendant_Table[com/dmdirc/parser/irc/ChannelInfo] == &__Dispatch_Table
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.addClient(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo; == &addClient
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.alterMode(ZLjava/lang/Character;Ljava/lang/String;)V == &alterMode
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.clearModeQueue()V == &clearModeQueue
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.delClient(Lcom/dmdirc/parser/irc/ClientInfo;)V == &delClient
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.emptyChannel()V == &emptyChannel
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getAddState(Ljava/lang/Character;)Z == &getAddState
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getChannelClients()Ljava/util/List; == &getChannelClients
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getCreateTime()J == &getCreateTime
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getListModeParam(Ljava/lang/Character;)Ljava/util/List; == &getListModeParam
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getListModeQueue()Ljava/util/Queue; == &getListModeQueue
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getMap()Ljava/util/Map; == &getMap
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getMode()J == &getMode
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getModeParam(Ljava/lang/Character;)Ljava/lang/String; == &getModeParam
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getModeStr()Ljava/lang/String; == &getModeStr
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getName()Ljava/lang/String; == &getName
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getParser()Lcom/dmdirc/parser/irc/IRCParser; == &getParser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopic()Ljava/lang/String; == &getTopic
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopicTime()J == &getTopicTime
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getTopicUser()Ljava/lang/String; == &getTopicUser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Lcom/dmdirc/parser/irc/ClientInfo;)Lcom/dmdirc/parser/irc/ChannelClientInfo; == &getUser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Ljava/lang/String;)Lcom/dmdirc/parser/irc/ChannelClientInfo; == &getUser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUser(Ljava/lang/String;Z)Lcom/dmdirc/parser/irc/ChannelClientInfo; == &getUser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.getUserCount()I == &getUserCount
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.hasAskedForListModes()Z == &hasAskedForListModes
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.hasGotListModes()Z == &hasGotListModes
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.isAddingNames()Z == &isAddingNames
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.renameClient(Ljava/lang/String;Lcom/dmdirc/parser/irc/ChannelClientInfo;)V == &renameClient
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.requestListModes()V == &requestListModes
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.resetAddState()V == &resetAddState
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendAction(Ljava/lang/String;)V == &sendAction
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendCTCP(Ljava/lang/String;Ljava/lang/String;)V == &sendCTCP
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendCTCPReply(Ljava/lang/String;Ljava/lang/String;)V == &sendCTCPReply
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendMessage(Ljava/lang/String;)V == &sendMessage
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendModes()V == &sendModes
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.sendNotice(Ljava/lang/String;)V == &sendNotice
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setAddState(Ljava/lang/Character;Z)V == &setAddState
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setAddingNames(Z)V == &setAddingNames
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setCreateTime(J)V == &setCreateTime
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setHasGotListModes(Z)V == &setHasGotListModes
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setListModeParam(Ljava/lang/Character;Lcom/dmdirc/parser/irc/ChannelListModeItem;Z)V == &setListModeParam
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setMap(Ljava/util/Map;)V == &setMap
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setMode(J)V == &setMode
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setModeParam(Ljava/lang/Character;Ljava/lang/String;)V == &setModeParam
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopic(Ljava/lang/String;)V == &setTopic
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopicTime(J)V == &setTopicTime
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.setTopicUser(Ljava/lang/String;)V == &setTopicUser
    //#post(com.dmdirc.parser.irc.ChannelInfo__static_init): __Dispatch_Table.toString()Ljava/lang/String; == &toString
    //#ChannelInfo.java:: end of method: com.dmdirc.parser.irc.ChannelInfo.com.dmdirc.parser.irc.ChannelInfo__static_init
    //#ChannelInfo.java:: end of class: com.dmdirc.parser.irc.ChannelInfo
