Results 1 to 6 of 6
  1. #1
    karimoune is offline Member
    Join Date
    Feb 2012
    Posts
    2
    Rep Power
    0

    Default Array and StringIndexOutOfBoundsException(s)

    Hello, here's a source code that i'm trying to modify and use a GUI to set the variables the setter methods. while the code seems valid to me and should work perfectly, i get ArrayIndexOutOfBounds and StringIndexOutOfBounds and respectively lines 111 and 134. i'm am not the original author of this code, all i want is to get it to work fine. any help will be truly apreciated.

    1 package de.kugihan.dictionaryformids.dictdconv;
    2
    3 import java.io.FileOutputStream;
    4 import java.io.IOException;
    5 import java.io.OutputStreamWriter;
    6
    7 public class dictdconv{
    8
    9 //public String versionNumber = "2.4.0";
    10
    11 private static String dbName;
    12 private static String dbFolderName;
    13 private static String outputCSVFile;
    14 private static String outputEncodingCharset;
    15 private static char separatorCharacter;
    16 private static boolean switchLanguages;
    17 private static boolean keepTabAndNewLineChars;
    18 private static boolean removeSquareBrackets;
    19
    20 /*
    21 * Getter methods for dictdconv class.
    22 */
    23
    24 public static String getDBName(){
    25 return dbName;
    26 }
    27
    28 public static String getDBFolderName(){
    29 return dbFolderName;
    30 }
    31
    32 public static String getOutputCSVFile(){
    33 return outputCSVFile;
    34 }
    35
    36 public static String getOutputEncodingCharset(){
    37 return outputEncodingCharset;
    38 }
    39
    40 public static char getSeparatorCharacter(){
    41 return separatorCharacter;
    42 }
    43
    44 public static boolean getSwitchLanguages(){
    45 return switchLanguages;
    46 }
    47
    48 public static boolean getKeepTabAndNewLineChars(){
    49 return keepTabAndNewLineChars;
    50 }
    51
    52 public static boolean getRemoveSquareBrackets(){
    53 return removeSquareBrackets;
    54 }
    55
    56 /*
    57 * Setter methods.
    58 */
    59
    60 public static void setDBName(String newDBName){
    61 dbName = newDBName;
    62 }
    63
    64 public static void setDBFolderName(String newDBFolderName){
    65 dbFolderName = newDBFolderName;
    66 }
    67
    68 public static void setOutputCSVFile(String newOutputCSVFile){
    69 outputCSVFile = newOutputCSVFile;
    70 }
    71
    72 public static void setOutputEncodingCharset(String newOutputEncodingCharset){
    73 outputEncodingCharset = newOutputEncodingCharset;
    74 }
    75
    76 public static void setSeparatorCharacter(char newSeparatorCharacter){
    77 separatorCharacter = newSeparatorCharacter;
    78 }
    79
    80 public static void setSwitchLanguages(boolean newSwitchLanguages){
    81 switchLanguages = newSwitchLanguages;
    82 }
    83
    84 public static void setKeepTabAndNewLineChars(boolean newKeepTabAndNewLineChars){
    85 keepTabAndNewLineChars = newKeepTabAndNewLineChars;
    86 }
    87
    88 public static void setRemoveSquareBrackets(boolean newRemoveSquareBrackets){
    89 removeSquareBrackets = newRemoveSquareBrackets;
    90 }
    91
    92
    93 /*
    94 *
    95 * The convertion subroutine: reads all the entries from the DICT-database
    96 * and writes them line by line to the output file.
    97 *
    98 */
    99
    100 public static void convert() {
    101
    102 try {
    103 // Open output file for writing
    104 OutputStreamWriter outputWriter = new OutputStreamWriter(new FileOutputStream(outputCSVFile), outputEncodingCharset);
    105 // Open DICT-database
    106 org.dict.kernel.IDictEngine e =
    107 org.dict.server.DatabaseFactory.getEngine(dbFolder Name + "/" + dbName ); // the ini-file must be in the databases-directory
    108
    109 String definition;
    110 /* In a loop all entries of the datebase are retrieved */
    111 /* here */ for (int pos = 0; pos < e.getDatabases()[0].getSize(); ++ pos) {
    112 //for (int pos = 0; pos < 1000; ++ pos) { // this line is for tests only
    113 // generate the string to query the entry at pos
    114 String posString = "db=" + dbName + "&pos=" + pos;
    115 // retrieve the definition at pos
    116 org.dict.kernel.IRequest req =
    117 new org.dict.kernel.SimpleRequest("", posString);
    118 org.dict.kernel.IAnswer[] arr = e.lookup(req);
    119 // parse the result and write to the output file
    120 for (int i = 0; i < arr.length; ++i) {
    121 definition = arr[i].getDefinition();
    122 if (! definition.startsWith("00")) { // skip the entries starting with "00" - these contain
    123 // general information about the dictionary
    124 if (removeSquareBrackets)
    125 definition = removeSquareBracketContent(definition);
    126 // get rid of the separatorCharacter in the definition
    127 definition = replaceCharacterInString(definition, separatorCharacter, ' ');
    128 String definitionConverted = definition;
    129 // search where the keyword ends and the translation starts
    130 int posTranslationSeparator = definitionConverted.indexOf('\n');
    131 int posEndKeyWord = posTranslationSeparator - 1;
    132 int posStartTranslation = posTranslationSeparator + 1;
    133 // separate keyword and translation
    134 /* here */ String keyWord = definitionConverted.substring(0, posEndKeyWord + 1).trim();
    135 String translation = definitionConverted.substring(posStartTranslation) ;
    136 translation = removeNewlinesAtBeginAndEnd(translation); // useful e.g. for freedict English-Turkish Dictionary
    137 translation = replaceFieldAndLineSeparationChars(translation); // note: separatorCharacter was already removed before
    138 // if required, perform adaptation to output character encoding
    139 translation = adaptToCharset(translation);
    140 keyWord = adaptToCharset(keyWord);
    141 // if there should be any repeated whitespaces in the translation, trim the superflous whitespaces
    142 translation = filterSuperflousWhitespaces(translation);
    143 // write line to the output file
    144 String outputLine = new String();
    145 if (switchLanguages) {
    146 outputLine = translation + separatorCharacter + keyWord + "\n";
    147 }
    148 else {
    149 outputLine = keyWord + separatorCharacter + translation + "\n";
    150 }
    151 outputWriter.write(outputLine);
    152 }
    153 else {
    154 // print to stdout the "00" entries (for information)
    155 System.out.println(definition);
    156 }
    157 }
    158 }
    159 outputWriter.close();
    160 System.out.println("Done");
    161 }
    162 catch (Exception e) {
    163 e.printStackTrace();
    164 }
    165 }
    166
    167
    168 /*
    169 *
    170 * A few utility methods:
    171 *
    172 */
    173
    174 public static String removeSquareBracketContent(String expression) {
    175 // remove everything in square brackets
    176 int startBracket = expression.indexOf('[');
    177 int endBracket = expression.indexOf(']');
    178 StringBuffer returnExpression = new StringBuffer(expression);
    179 if ((startBracket >= 0) && (endBracket > startBracket)) {
    180 returnExpression.delete(startBracket, endBracket+1);
    181 }
    182 return returnExpression.toString();
    183 }
    184
    185 public static String replaceCharacterInString(String input, char oldCharacter, char newCharacter) {
    186 String output = new String();
    187 for (int pos = 0; pos < input.length(); ++pos) {
    188 if (input.charAt(pos) != oldCharacter) {
    189 output = output + input.charAt(pos);
    190 }
    191 else {
    192 output = output + newCharacter;
    193 }
    194 }
    195 return output;
    196 }
    197
    198 public static String adaptToCharset(String input)
    199 throws IOException {
    200 String output;
    201 if (outputEncodingCharset == "ISO_8859-1") {
    202 // Replace characters that do not exist in ISO-8859-1 with blanks.
    203 String inputCleaned = new String();
    204 for (int posInput = 0; posInput < input.length(); ++posInput) {
    205 char characterFromInput = input.charAt(posInput);
    206 int charType = Character.getType(characterFromInput);
    207 if ((charType == Character.COMBINING_SPACING_MARK) ||
    208 (charType == Character.DASH_PUNCTUATION ) ||
    209 (charType == Character.FORMAT ) ||
    210 (charType == Character.SPACE_SEPARATOR ) ||
    211 (charType == Character.UNASSIGNED )) {
    212 // replace that character by a blank
    213 inputCleaned = inputCleaned + ' ';
    214 }
    215 else {
    216 inputCleaned = inputCleaned + characterFromInput;
    217 }
    218 }
    219 output = new String();
    220 // get rid of characters that are converted into ?
    221 for (int posInput = 0; posInput < inputCleaned.length(); ++posInput) {
    222 String characterFromInput = inputCleaned.substring(posInput, posInput + 1);
    223 byte [] bytesForString = characterFromInput.getBytes(outputEncodingCharset) ;
    224 if ((bytesForString.length == 1) && (bytesForString[0] == (int) '?')) {
    225 // replace that character by a blank
    226 output = output + ' ';
    227 }
    228 else {
    229 output = output + characterFromInput;
    230 }
    231 }
    232 }
    233 else {
    234 // keep input
    235 output = input;
    236 }
    237 return output;
    238 }
    239
    240 public static String replaceFieldAndLineSeparationChars(String input) {
    241 String output;
    242
    243 if (! keepTabAndNewLineChars) {
    244 output = replaceCharacterInString(input, '\n', ' ');
    245 output = replaceCharacterInString(output, separatorCharacter, ' ');
    246 }
    247 else {
    248 output = new String();
    249 for (int pos = 0; pos < input.length(); ++pos) {
    250 char currentCharacter = input.charAt(pos);
    251 if (currentCharacter == '\n') {
    252 output = output + "\\n";
    253 }
    254 else if (currentCharacter == '\t') {
    255 output = output + "\\t";
    256 }
    257 else if (currentCharacter == '\\') {
    258 output = output + "\\\\";
    259 }
    260 else {
    261 output = output + currentCharacter;
    262 }
    263 }
    264 }
    265 return output;
    266 }
    267
    268 // duplicated for convenience from de.kugihan.dictionaryformids.general.Util:
    269 public static String filterSuperflousWhitespaces(String expression) {
    270 String resultExpression = new String();
    271 boolean lastCharWasWhitespace = false;
    272 for (int charPos = 0; charPos < expression.length(); ++ charPos) {
    273 char character = expression.charAt(charPos);
    274 if ( (character == '\t') || (character == ' ')) {
    275 if (resultExpression.length() == 0) {
    276 // ignore whitspaces at the beginning of the expression
    277 }
    278 else if (charPos == expression.length() -1) {
    279 // ignore whitspaces at the end of the expression
    280 }
    281 else if (lastCharWasWhitespace) {
    282 // ignore multiple whitespaces in sequence
    283 }
    284
    285 else {
    286 resultExpression = resultExpression + character;
    287 }
    288 lastCharWasWhitespace = true;
    289 }
    290 else {
    291 resultExpression = resultExpression + character;
    292 lastCharWasWhitespace = false;
    293 }
    294 }
    295 return resultExpression;
    296 }
    297
    298 public static String removeNewlinesAtBeginAndEnd(String input) {
    299 String output;
    300 int pos = 0;
    301 while ((pos < input.length()) && (input.charAt(pos) == '\n'))
    302 ++pos;
    303 if (pos < input.length())
    304 output = input.substring(pos, input.length());
    305 else
    306 output = "";
    307 pos = output.length() -1;
    308 while ((pos >= 0) && (output.charAt(pos) == '\n'))
    309 --pos;
    310 if (pos >= 0)
    311 output = output.substring(0, pos + 1);
    312 else
    313 output = "";
    314 return output;
    315 }
    316 }

  2. #2
    Fubarable's Avatar
    Fubarable is offline Moderator
    Join Date
    Jun 2008
    Posts
    19,315
    Blog Entries
    1
    Rep Power
    26

    Default Re: Array and StringIndexOutOfBoundsException(s)

    That's a heck of a lot of unformatted and unreadable code. If you get help soon, then great, but if not, consider
    • getting rid of line numbers,
    • formatting the code for readability,
    • Using code tags: [code] and [/code]
    • and providing a bit more detail on the exact nature of your problem, what you've done to try to debug it, etc...


    Best of luck!

  3. #3
    karimoune is offline Member
    Join Date
    Feb 2012
    Posts
    2
    Rep Power
    0

    Default Re: Array and StringIndexOutOfBoundsException(s)

    Hello, sorry im new to the forum so i didnt know much about formatting rules... i didnt do much to debug apart from registering to this forum and try to get help. here's the code again, i couldn't edit or delete the other one. the lines are 108 and 131 now.

    Java Code:
    package de.kugihan.dictionaryformids.dictdconv;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStreamWriter;
    
    public class dictdconv{
    
    	//public String versionNumber = "2.4.0";
    
    	private static String dbName;
    	private static String dbFolderName;
    	private static String outputCSVFile;
    	private static String outputEncodingCharset;
    	private static char separatorCharacter;
    	private static boolean switchLanguages;
    	private static boolean keepTabAndNewLineChars;
    	private static boolean removeSquareBrackets;
    
            
            // Getter methods for dictdconv class.
    
            public static String getDBName(){
                return dbName;
            }
            
            public static String getDBFolderName(){
                return dbFolderName;
            }
            
            public static String getOutputCSVFile(){
                return outputCSVFile;
            }
            
            public static String getOutputEncodingCharset(){
                return outputEncodingCharset;
            }
            
            public static char getSeparatorCharacter(){
                return separatorCharacter;
            }
            
            public static boolean getSwitchLanguages(){
                return switchLanguages;
            }
            
            public static boolean getKeepTabAndNewLineChars(){
                return keepTabAndNewLineChars;
            }
            
            public static boolean getRemoveSquareBrackets(){
                return removeSquareBrackets;
            }
            
            
            // Setter methods.
             
            
            public static void setDBName(String newDBName){
                dbName = newDBName;
            }
            
            public static void setDBFolderName(String newDBFolderName){
                dbFolderName = newDBFolderName;
            }
            
            public static void setOutputCSVFile(String newOutputCSVFile){
                outputCSVFile = newOutputCSVFile;
            }
            
            public static void setOutputEncodingCharset(String newOutputEncodingCharset){
                outputEncodingCharset = newOutputEncodingCharset;
            }
            
            public static void setSeparatorCharacter(char newSeparatorCharacter){
                separatorCharacter = newSeparatorCharacter;
            }
            
            public static void setSwitchLanguages(boolean newSwitchLanguages){
                switchLanguages = newSwitchLanguages;
            }
            
            public static void setKeepTabAndNewLineChars(boolean newKeepTabAndNewLineChars){
                keepTabAndNewLineChars = newKeepTabAndNewLineChars;
            }
            
            public static void setRemoveSquareBrackets(boolean newRemoveSquareBrackets){
                removeSquareBrackets = newRemoveSquareBrackets;
            }
            
    	 
    	
    	 // The convertion subroutine: reads all the entries from the DICT-database
    	 // and writes them line by line to the output file.
    	 
    	 
    	 public static void convert() {
    		
    		try {
    			// Open output file for writing
    			OutputStreamWriter outputWriter = new OutputStreamWriter(new FileOutputStream(outputCSVFile), outputEncodingCharset);
    			// Open DICT-database
    			org.dict.kernel.IDictEngine e =
    			  org.dict.server.DatabaseFactory.getEngine(dbFolderName + "/" + dbName );  // the ini-file must be in the databases-directory
    			
    			String definition;
    			// In a loop all entries of the datebase are retrieved
    		       for (int pos = 0; pos < e.getDatabases()[0].getSize(); ++ pos) {
    			//for (int pos = 0; pos < 1000; ++ pos) {  // this line is for tests only
    				// generate the string to query the entry at pos
    				String posString = "db=" + dbName + "&pos=" + pos;
    				// retrieve the definition at pos
    				org.dict.kernel.IRequest req =
    						new org.dict.kernel.SimpleRequest("", posString);
    				org.dict.kernel.IAnswer[] arr = e.lookup(req);
    				// parse the result and write to the output file
    				for (int i = 0; i < arr.length; ++i) {
    					definition = arr[i].getDefinition();
    					if (! definition.startsWith("00")) {  // skip the entries starting with "00" - these contain
    						                                  // general information about the dictionary
    						if (removeSquareBrackets)
    							definition = removeSquareBracketContent(definition);
    						// get rid of the separatorCharacter in the definition
    						definition = replaceCharacterInString(definition, separatorCharacter, ' ');
    						String definitionConverted = definition;
    						// search where the keyword ends and the translation starts
    						int posTranslationSeparator = definitionConverted.indexOf('\n');
    						int posEndKeyWord = posTranslationSeparator - 1;
    						int posStartTranslation = posTranslationSeparator + 1;
    						// separate keyword and translation
    	                 			String keyWord = definitionConverted.substring(0, posEndKeyWord + 1).trim();
    						String translation = definitionConverted.substring(posStartTranslation);
    						translation = removeNewlinesAtBeginAndEnd(translation); // useful e.g. for freedict English-Turkish Dictionary
    						translation = replaceFieldAndLineSeparationChars(translation);  // note: separatorCharacter was already removed before
    						// if required, perform adaptation to output character encoding
    						translation = adaptToCharset(translation);
    						keyWord = adaptToCharset(keyWord);
    						// if there should be any repeated whitespaces in the translation, trim the superflous whitespaces
    						translation = filterSuperflousWhitespaces(translation);
    						// write line to the output file
    						String outputLine = new String();
    						if (switchLanguages) {
    							outputLine = translation + separatorCharacter + keyWord + "\n";
    						}
    						else {
    							outputLine = keyWord + separatorCharacter + translation + "\n";
    						}
    						outputWriter.write(outputLine);
    					}
    					else {
    						// print to stdout the "00" entries (for information)
    						System.out.println(definition);
    					}
    				}
    			}
    			outputWriter.close();
    			System.out.println("Done");
    		}
    		catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    		 
    	 // A few utility methods:
    	 	 
    	public static String removeSquareBracketContent(String expression) {
    		// remove everything in square brackets
    		int startBracket = expression.indexOf('[');
    		int endBracket = expression.indexOf(']');
    		StringBuffer returnExpression = new StringBuffer(expression);
    		if ((startBracket >= 0) && (endBracket > startBracket)) {
    			returnExpression.delete(startBracket, endBracket+1);
    		}
    		return returnExpression.toString();
    	}
    
    	public static String replaceCharacterInString(String input, char oldCharacter, char newCharacter) {
    		String output = new String();
    		for (int pos = 0; pos < input.length(); ++pos) {
    			if (input.charAt(pos) != oldCharacter) {
    				output = output + input.charAt(pos); 
    			}
    			else {
    				output = output + newCharacter;
    			}
    		}
    		return output;
    	}
    	
    	public static String adaptToCharset(String input)
    				throws IOException {
    		String output;
    		if (outputEncodingCharset == "ISO_8859-1") {
    			// Replace characters that do not exist in ISO-8859-1 with blanks.
    			String inputCleaned = new String();
    			for (int posInput = 0; posInput < input.length(); ++posInput) {
    				char characterFromInput = input.charAt(posInput);
    				int charType = Character.getType(characterFromInput);
    				if ((charType == Character.COMBINING_SPACING_MARK) ||
    					(charType == Character.DASH_PUNCTUATION ) ||
    					(charType == Character.FORMAT ) ||
    					(charType == Character.SPACE_SEPARATOR ) ||
    					(charType == Character.UNASSIGNED )) {
    					// replace that character by a blank
    					inputCleaned = inputCleaned + ' '; 
    				}
    				else {
    					inputCleaned = inputCleaned + characterFromInput; 
    				}
    			}
    			output = new String();
    			// get rid of characters that are converted into ?
    			for (int posInput = 0; posInput < inputCleaned.length(); ++posInput) {
    				String characterFromInput = inputCleaned.substring(posInput, posInput + 1);
    				byte [] bytesForString = characterFromInput.getBytes(outputEncodingCharset); 
    				if ((bytesForString.length == 1) && (bytesForString[0] == (int) '?')) {
    					// replace that character by a blank
    					output = output + ' '; 
    				}
    				else {
    					output = output + characterFromInput; 
    				}
    			}
    		}
    		else {
    			// keep input
    			output = input;
    		}
    		return output;
    	}
    
    	public static String replaceFieldAndLineSeparationChars(String input) {
    		String output;
    
    		if (! keepTabAndNewLineChars) {
    			output = replaceCharacterInString(input, '\n', ' ');
    			output = replaceCharacterInString(output, separatorCharacter, ' ');
    		}
    		else {
    			output = new String();
    			for (int pos = 0; pos < input.length(); ++pos) {
    				char currentCharacter = input.charAt(pos);
    				if (currentCharacter == '\n') {
    					output = output + "\\n";
    				}
    				else if (currentCharacter == '\t') {
    					output = output + "\\t";
    				}
    				else if (currentCharacter == '\\') {
    					output = output + "\\\\";
    				}
    				else {
    					output = output + currentCharacter;
    				}
    			}
    		}
    		return output;
    	}
    
    	// duplicated for convenience from de.kugihan.dictionaryformids.general.Util: 
    	public static String filterSuperflousWhitespaces(String expression) {
    		String resultExpression = new String();
    		boolean lastCharWasWhitespace = false;
    		for (int charPos = 0; charPos < expression.length(); ++ charPos) {
    			char character = expression.charAt(charPos);
    			if ( (character == '\t') || (character == ' ')) {
    			    if (resultExpression.length() == 0) {
    					// ignore whitspaces at the beginning of the expression
    				}
    				else if (charPos == expression.length() -1) {
    					// ignore whitspaces at the end of the expression
    				}
    				else if (lastCharWasWhitespace)  {
    					// ignore multiple whitespaces in sequence
    				}
    
    				else {
    					resultExpression = resultExpression + character;
    				}
    				lastCharWasWhitespace = true;
    			}
    			else {
    				resultExpression = resultExpression + character;
    				lastCharWasWhitespace = false;
    			}
    		}
    		return resultExpression;
    	}
    
    	public static String removeNewlinesAtBeginAndEnd(String input) {
    		String output;
    		int pos = 0;
    		while ((pos < input.length()) && (input.charAt(pos) == '\n'))
    			++pos;
    		if (pos < input.length())
    			output = input.substring(pos, input.length());
    		else 
    			output = "";
    		pos = output.length() -1;
    		while ((pos >= 0) && (output.charAt(pos) == '\n'))
    			--pos;
    		if (pos >= 0)
    			output = output.substring(0, pos + 1);
    		else 
    			output = "";
    		return output;
    	}
    }

  4. #4
    Norm's Avatar
    Norm is offline Moderator
    Join Date
    Jun 2008
    Location
    Eastern Florida
    Posts
    17,902
    Rep Power
    25

    Default Re: Array and StringIndexOutOfBoundsException(s)

    The values of the indexes on the lines where the errors occured are past the end of the array or String.
    You need check the logic of the code to see why it allows the index values to go past the end.
    Or you need to test if the index value is past the end (use an if statement for example) and not try to index the array or String with an invalid index value.

    For example with this line:
    e.getDatabases()[0]
    Assign the value returned by e.getDatabases() to an array variable and then test if the array is empty BEFORE trying to get the first element of an empty array.
    Last edited by Norm; 02-24-2012 at 04:51 AM.

  5. #5
    RamyaSivakanth's Avatar
    RamyaSivakanth is offline Senior Member
    Join Date
    Apr 2009
    Location
    Chennai
    Posts
    843
    Rep Power
    6

    Default Re: Array and StringIndexOutOfBoundsException(s)

    lot of loopholes in the code.String should not be handled without checking

    example "definitionConverted" is null or empty what your code will do?
    Ramya:cool:

  6. #6
    Tolls is offline Moderator
    Join Date
    Apr 2009
    Posts
    12,224
    Rep Power
    20

    Default Re: Array and StringIndexOutOfBoundsException(s)

    Closing the thread as it's over 2 years old.
    I assume some spam woke it up...:)
    Please do not ask for code as refusal often offends.

    ** This space for rent **

Similar Threads

  1. StringIndexOutOfBoundsException
    By Golfnutest in forum New To Java
    Replies: 10
    Last Post: 10-10-2011, 07:01 AM
  2. Replies: 1
    Last Post: 07-06-2011, 08:51 AM
  3. StringIndexOutOfBoundsException- Crossword Solver App.
    By numbskull20 in forum Advanced Java
    Replies: 3
    Last Post: 12-01-2010, 02:33 PM
  4. StringIndexOutOfBoundsException Error
    By Mayur in forum New To Java
    Replies: 4
    Last Post: 02-01-2009, 06:10 PM
  5. StringIndexOutOfBoundsException
    By ravian in forum New To Java
    Replies: 2
    Last Post: 01-30-2008, 12:25 AM

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •