private static void determineMacOSVersion() throws IOException {
		File f = new File( "/System/Library/CoreServices/SystemVersion.plist" );
		MAC_OS_VERSION = null;
		try {
			SAXBuilder parser = new SAXBuilder(false);
			//this hack is intended to prevent SAXBuilder from connecting to the 'net 
			parser.setEntityResolver( new EntityResolver() {
				public InputSource resolveEntity(String arg0, String arg1) throws SAXException, IOException {
					return new InputSource( new StringReader("") );
				}
			});
//			FileInputStream fis = new FileInputStream(f);
//			{
//				System.out.println( "=====" );
//				int i=0;
//				while( (i=fis.read()) != -1 ) {
//					System.out.print( (char)i );
//				}
//				System.out.println( "=====" );
//			}
			Document doc = parser.build(new FileInputStream(f));
			Element root = doc.getRootElement();
			Element mainDictElt = root.getChild( "dict" );
			XMLDict mainDict = new XMLDict( mainDictElt, 0, true );
			String version = mainDict.getStringValue("ProductVersion", "string");
			String[] mv = version.split("\\.");
			if( mv.length < 3 )
				return;
			MAC_OS_VERSION = new int[3];
			for( int i=0; i<3; ++i) {
				MAC_OS_VERSION[i] = Integer.parseInt(mv[i]);
			}
			return;
		} catch (NullPointerException npe) {
			throw new IOException( "Missing OS X version info." );
		} catch (org.jdom.JDOMException jde) {
			throw new IOException( "Misformatted OS X version info.", jde );
		} catch (FileNotFoundException fne) {
			throw new IOException( "Missing OS X version info file." );
		} catch (OutOfMemoryError oome) {
			throw new IOException( "Ran out of memory reading Mac OS X version. Probably the file is corrupt." );
		} catch (XMLException xmle) {
			throw new IOException( "Misformatted OS X version info." );
		} catch (NumberFormatException nfe) {
			throw new IOException( "Misformatted OS X version info." );
		}
	}