# Eclipse runtime configuration file
# This file contains a number of key/value pairs that are merged into the 
# System properties on system startup.  The values control the way the 
# runtime is structured and runs.

# Note:  Only platform:/base/ and file: URLs are supported.  In general the 
# URLs given may include a version number (e.g., .../location_1.2.3).  
# If a version is not specified, the system binds
# to the location which matches exactly or to the versioned location with the
# latest version number.  If a version number is given then only exact matches
# are considered.

# The URL for the runtime entry point.  The default value is
# platform:/base/plugins/org.eclipse.osgi 
#osgi.framework = platform:/base/plugins/org.eclipse.osgi

# The classpath for the framework found at the osgi.framework location.  This 
# comma-separated list contains either URLs or simple element names.  Simple
# names are assumed to be relative to the framework's install directory.  
# Typically this value need not be set as it is initialized by the framework itself.
# Version match searching is not done for URLs listed here.
#osgi.frameworkClassPath =

# The comma-separated list of locations to search for the splash screen file (splash.bmp).
# For each list element a subdirectory structure based on the pattern nl/<locale> is searched.
# The system binds to the first matching file.  There is no default value.
osgi.splashPath = platform:/base/plugins/org.eclipse.platform

# The location of the splash screen file.  If this value is set at system startup it is used 
# in favour of the osgi.splashPath searching outlined above.  If the value is not set 
# the searching is done and this key is bound to the result of the search.
#osgi.splashLocation =

# The comma-separated list of bundles which are automatically installed and optionally started
# once the system is up and running.  Each entry if of the form
#     <URL | simple bundle location>[@ [<startlevel>] [":start"]]
# If the startlevel is omitted then the framework will use the default start level for the bundle.
# If the "start" tag is added then the bundle will be marked as started after being installed.
# Simple bundle locations are interepreted as relative to the framework's parent directory.
# The startlevel indicates the OSGi start level at which the bundle should run.
# If this value is not set, the system computes an appropriate default.
osgi.bundles=org.eclipse.equinox.common@2:start, org.eclipse.update.configurator@3:start, org.eclipse.core.runtime@start, org.eclipse.equinox.log@4:start

# The product to run.  A given Eclipse configuration may contain many products.
# The product identified will supply the branding (window icons, title bar text) etc 
# as well as define the default application to run.  
eclipse.product=org.eclipse.sdk.ide

# The application to run.  The value specified here is the id of the application extension
# the runtime will find, instantiate and execute once the system is up.  Note that typically 
# the identified eclipse.product defines the default application to run.
#eclipse.application=

# The default workspace location
osgi.instance.area.default=@user.home/workspace

# The build identifier
eclipse.buildId=M20071023-1652

# entry required for gtk configurations of eclipse to enable stand-alone help
osgi.ws=gtk

# End of file marker - must be here
eof=eof
