Adding EPL version of configurationengine.
authorterytkon
Thu, 11 Mar 2010 17:04:37 +0200
changeset 0 2e8eeb919028
child 1 b538b70cbe51
Adding EPL version of configurationengine.
configurationengine/RELEASE.TXT
configurationengine/build-scripts/export-bat/plugin-integration-test-overlay/__init__.py
configurationengine/build-scripts/export-bat/scripts-tests-overlay/nose_bat.cfg
configurationengine/build-scripts/export-bat/scripts-tests-overlay/readme.txt
configurationengine/build-scripts/export-bat/scripts-tests-overlay/runtests.cmd
configurationengine/build-scripts/export-bat/scripts-tests-overlay/runtests.py
configurationengine/build-scripts/export-bat/scripts-tests-overlay/tests/__init__.py
configurationengine/build-scripts/export_bat.py
configurationengine/build-scripts/install_cone.py
configurationengine/build-scripts/readme.txt
configurationengine/build-scripts/utils.py
configurationengine/build.xml
configurationengine/build_script_tests.txt
configurationengine/clean_pack.cmd
configurationengine/common.properties
configurationengine/debian/changelog
configurationengine/debian/compat
configurationengine/debian/cone-tool.install
configurationengine/debian/cone-tool.links
configurationengine/debian/control
configurationengine/debian/copyright
configurationengine/debian/python-cone.install
configurationengine/debian/rules
configurationengine/dep-eggs/Jinja2-2.1.1-py2.5-win32.egg
configurationengine/dep-eggs/Jinja2-2.1.1-py2.6-win32.egg
configurationengine/dep-eggs/lxml-2.2.2-py2.5-win32.egg
configurationengine/dep-eggs/lxml-2.2.2-py2.6-win32.egg
configurationengine/dep-eggs/readme.txt
configurationengine/dep-eggs/setuptools-0.6c11-py2.5.egg
configurationengine/dep-eggs/setuptools-0.6c11-py2.6.egg
configurationengine/dep-eggs/simplejson-2.0.9-py2.5-win32.egg
configurationengine/dep-eggs/simplejson-2.0.9-py2.6-win32.egg
configurationengine/develop.cmd
configurationengine/doc/api/api.rst
configurationengine/doc/api/cone_plugin_api.png
configurationengine/doc/api/cone_public_api.png
configurationengine/doc/api/howto.rst
configurationengine/doc/api/plugin.rst
configurationengine/doc/api/public.rst
configurationengine/doc/changelog.rst
configurationengine/doc/cli/common.rst
configurationengine/doc/cli/compare.rst
configurationengine/doc/cli/export.rst
configurationengine/doc/cli/generate.rst
configurationengine/doc/cli/info.rst
configurationengine/doc/cli/merge.rst
configurationengine/doc/cli/merge/asset_merge.png
configurationengine/doc/cli/merge/config_project.zip
configurationengine/doc/cli/merge/myasset2.zip
configurationengine/doc/cli/merge/project_after_variant_layer_merge.png
configurationengine/doc/cli/report.rst
configurationengine/doc/cli/update.rst
configurationengine/doc/conf.py
configurationengine/doc/configurationml085.rst
configurationengine/doc/development.rst
configurationengine/doc/extref.rst
configurationengine/doc/images/ConeP.gif
configurationengine/doc/images/configuration_project.bmp
configurationengine/doc/images/configurationml085-f1.gif
configurationengine/doc/images/configurationml085-f2.gif
configurationengine/doc/images/configurationml085-f3.gif
configurationengine/doc/images/configurationml085-f4.gif
configurationengine/doc/images/configurationml085-f5.gif
configurationengine/doc/images/file_explorer.bmp
configurationengine/doc/images/imaker_cone.jpg
configurationengine/doc/imakercone.rst
configurationengine/doc/index.rst
configurationengine/doc/intro.rst
configurationengine/doc/licence-configurationengine.html
configurationengine/doc/license-jinja2-2.1.1.txt
configurationengine/doc/license-lxml-2.2.2.txt
configurationengine/doc/license-setuptools-0.6c9.txt
configurationengine/doc/license-simplejson-2.0.9.txt
configurationengine/doc/plugins/commandml-plugin/commandml.jpg
configurationengine/doc/plugins/commandml-plugin/commandml.rst
configurationengine/doc/plugins/commandml-plugin/preinstall.commandml
configurationengine/doc/plugins/contentml-plugin/content.rst
configurationengine/doc/plugins/contentml-plugin/content2.jpg
configurationengine/doc/plugins/contentml-plugin/content_model.bmp
configurationengine/doc/plugins/contentml-plugin/example.content
configurationengine/doc/plugins/convertprojectplugin.rst
configurationengine/doc/plugins/crml-plugin/crml.jpg
configurationengine/doc/plugins/crml-plugin/crmlplugin.rst
configurationengine/doc/plugins/dev-plugin/diagrams.uml
configurationengine/doc/plugins/dev-plugin/example-plugin.rst
configurationengine/doc/plugins/dev-plugin/index.rst
configurationengine/doc/plugins/dev-plugin/plugin-interface.rst
configurationengine/doc/plugins/dev-plugin/plugin_classes.jpg
configurationengine/doc/plugins/dev-plugin/plugin_lifecycle.jpg
configurationengine/doc/plugins/dev-plugin/run_unittest.png
configurationengine/doc/plugins/dev-plugin/steps.rst
configurationengine/doc/plugins/genconfml-plugin/gcfml.jpg
configurationengine/doc/plugins/genconfml-plugin/genconfml_example1.txt
configurationengine/doc/plugins/genconfml-plugin/genconfml_example2.txt
configurationengine/doc/plugins/genconfml-plugin/genconfml_example3.txt
configurationengine/doc/plugins/genconfml-plugin/genconfml_example4.txt
configurationengine/doc/plugins/genconfml-plugin/genconfml_example5.txt
configurationengine/doc/plugins/genconfml-plugin/genconfmlplugin.rst
configurationengine/doc/plugins/general.rst
configurationengine/doc/plugins/hcrml-plugin/hcr_dat.png
configurationengine/doc/plugins/hcrml-plugin/hcr_diagram.uml
configurationengine/doc/plugins/hcrml-plugin/hcrml-plugin.rst
configurationengine/doc/plugins/hcrml-plugin/hcrml_developer_project.png
configurationengine/doc/plugins/hcrml-plugin/hcrml_elements.jpg
configurationengine/doc/plugins/hcrml-plugin/hcrml_example.zip
configurationengine/doc/plugins/hcrml-plugin/hcrml_global_project.png
configurationengine/doc/plugins/implml.jpg
configurationengine/doc/plugins/index.rst
configurationengine/doc/plugins/plugin-dir-structure.rst
configurationengine/doc/plugins/plugin_generate.gif
configurationengine/doc/plugins/plugins-common-commandplugin-dir.png
configurationengine/doc/plugins/plugins-common-dir.png
configurationengine/doc/plugins/plugins-dir.png
configurationengine/doc/plugins/plugins.uml
configurationengine/doc/plugins/ruleml-plugin/ruleml.jpg
configurationengine/doc/plugins/ruleml-plugin/ruleplugin.rst
configurationengine/doc/plugins/tag-fil.jpg
configurationengine/doc/plugins/templateml-plugin/templateml.jpg
configurationengine/doc/plugins/templateml-plugin/templateml_example0.txt
configurationengine/doc/plugins/templateml-plugin/templateml_example1.txt
configurationengine/doc/plugins/templateml-plugin/templateml_example1_result.txt
configurationengine/doc/plugins/templateml-plugin/templateml_example2.txt
configurationengine/doc/plugins/templateml-plugin/templatemlplugin.rst
configurationengine/doc/plugins/thememl-plugin/theme.thememl
configurationengine/doc/plugins/thememl-plugin/themelplugin.rst
configurationengine/doc/plugins/thememl-plugin/thememl.jpg
configurationengine/doc/rule.rst
configurationengine/doc/xsd/XInclude.xsd
configurationengine/doc/xsd/XMLSchema.xsd
configurationengine/doc/xsd/confml.xsd
configurationengine/doc/xsd/confml2.xsd
configurationengine/doc/xsd/contentml.xsd
configurationengine/doc/xsd/contentml2.xsd
configurationengine/doc/xsd/crml.xsd
configurationengine/doc/xsd/gcfml.xsd
configurationengine/doc/xsd/hcrml.xsd
configurationengine/doc/xsd/ibyml.xsd
configurationengine/doc/xsd/imageml.xsd
configurationengine/doc/xsd/projectml.xsd
configurationengine/doc/xsd/ruleml.xsd
configurationengine/doc/xsd/ruleml2.xsd
configurationengine/doc/xsd/templateml.xsd
configurationengine/doc/xsd/thememl.xsd
configurationengine/doc/xsd/xlink.xsd
configurationengine/doc/xsd/xml.xsd
configurationengine/export_bat.cmd
configurationengine/generatedoc-build.xml
configurationengine/install.cmd
configurationengine/linux.properties
configurationengine/pack.cmd
configurationengine/pack_bat.cmd
configurationengine/pack_dualversion.cmd
configurationengine/run_bat.cmd
configurationengine/source/cone.cmd
configurationengine/source/cone.prj
configurationengine/source/cone.sh
configurationengine/source/cone/__init__.py
configurationengine/source/cone/all.doxygen
configurationengine/source/cone/carbon/__init__.py
configurationengine/source/cone/carbon/mapping.py
configurationengine/source/cone/carbon/model.py
configurationengine/source/cone/carbon/persistentjson.py
configurationengine/source/cone/carbon/tests/__init__.py
configurationengine/source/cone/carbon/tests/runtests.py
configurationengine/source/cone/carbon/tests/unittest_mapping.py
configurationengine/source/cone/carbon/tests/unittest_model.py
configurationengine/source/cone/confml/__init__.py
configurationengine/source/cone/confml/confmltree.py
configurationengine/source/cone/confml/implml.py
configurationengine/source/cone/confml/mapping.py
configurationengine/source/cone/confml/model.py
configurationengine/source/cone/confml/persistentconfml.py
configurationengine/source/cone/confml/tests/__init__.py
configurationengine/source/cone/confml/tests/data/CVC_2DigitDialing.confml
configurationengine/source/cone/confml/tests/data/CVC_ActiveIdleNotifiers.confml
configurationengine/source/cone/confml/tests/data/CVC_ActiveIdleOther.confml
configurationengine/source/cone/confml/tests/data/CVC_AppShell323.confml
configurationengine/source/cone/confml/tests/data/CVC_CPHSALS.confml
configurationengine/source/cone/confml/tests/data/CVC_CellInfoDisplay.confml
configurationengine/source/cone/confml/tests/data/CVC_Content.confml
configurationengine/source/cone/confml/tests/data/CVC_CustomerMenu.confml
configurationengine/source/cone/confml/tests/data/CVC_InstantMessaging.confml
configurationengine/source/cone/confml/tests/data/CVC_NokiaPCInternetAccess.confml
configurationengine/source/cone/confml/tests/data/CVC_OperatorLogo.confml
configurationengine/source/cone/confml/tests/data/CVC_Preinstalled.confml
configurationengine/source/cone/confml/tests/data/CVC_RightSoftkey.confml
configurationengine/source/cone/confml/tests/data/CVC_StartupShutdownAnimations.confml
configurationengine/source/cone/confml/tests/data/CVC_Streaming.confml
configurationengine/source/cone/confml/tests/data/CVC_SyncML.confml
configurationengine/source/cone/confml/tests/data/CVC_ThemeWallpaperScreensaver.confml
configurationengine/source/cone/confml/tests/data/CVC_VoiceMailbox.confml
configurationengine/source/cone/confml/tests/data/CVC_ZeroPlusSend.confml
configurationengine/source/cone/confml/tests/data/accessoryserver.confml
configurationengine/source/cone/confml/tests/data/booleans.confml
configurationengine/source/cone/confml/tests/data/commsdatcreator.confml
configurationengine/source/cone/confml/tests/data/cvc_root.confml
configurationengine/source/cone/confml/tests/data/cvc_view.confml
configurationengine/source/cone/confml/tests/data/facets.confml
configurationengine/source/cone/confml/tests/data/multiselection.confml
configurationengine/source/cone/confml/tests/data/voicemailbox.confml
configurationengine/source/cone/confml/tests/runtests.py
configurationengine/source/cone/confml/tests/testdata/read_write/basic_setting_types_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/bitmask_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/config_root.confml
configurationengine/source/cone/confml/tests/testdata/read_write/facets.confml
configurationengine/source/cone/confml/tests/testdata/read_write/feature1.confml
configurationengine/source/cone/confml/tests/testdata/read_write/feature2.confml
configurationengine/source/cone/confml/tests/testdata/read_write/file_folder_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/name_id_mapping_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/option_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/read_only_setting_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/redefine_in_view_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/relevant_option_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/sequence_setting_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/time_types_test.confml
configurationengine/source/cone/confml/tests/testdata/read_write/view.confml
configurationengine/source/cone/confml/tests/unittest_confmlxml.py
configurationengine/source/cone/confml/tests/unittest_implml.py
configurationengine/source/cone/confml/tests/unittest_mapping.py
configurationengine/source/cone/confml/tests/unittest_model.py
configurationengine/source/cone/confml/tests/unittest_persistentconfml.py
configurationengine/source/cone/core/__init__.py
configurationengine/source/cone/core/tests/__init__.py
configurationengine/source/cone/core/tests/runtests.py
configurationengine/source/cone/core/tests/testdata/multiroot_test.zip
configurationengine/source/cone/core/tests/testdata/test_project.cpf
configurationengine/source/cone/core/tests/unittest_configuration.py
configurationengine/source/cone/core/tests/unittest_configuration_project_export.py
configurationengine/source/cone/core/tests/unittest_configuration_project_import.py
configurationengine/source/cone/core/tests/unittest_configuration_project_on_filestorage.py
configurationengine/source/cone/core/tests/unittest_configuration_project_on_zipstorage.py
configurationengine/source/cone/nose_unittests.cfg
configurationengine/source/cone/public/__init__.py
configurationengine/source/cone/public/_etree_wrapper.py
configurationengine/source/cone/public/_plugin_reader.py
configurationengine/source/cone/public/api.py
configurationengine/source/cone/public/container.py
configurationengine/source/cone/public/exceptions.py
configurationengine/source/cone/public/mapping.py
configurationengine/source/cone/public/persistence.py
configurationengine/source/cone/public/plugin.py
configurationengine/source/cone/public/rules.py
configurationengine/source/cone/public/settings.py
configurationengine/source/cone/public/tests/Import.pk
configurationengine/source/cone/public/tests/__init__.py
configurationengine/source/cone/public/tests/runtests.py
configurationengine/source/cone/public/tests/test_defaults.cfg
configurationengine/source/cone/public/tests/unittest_base.py
configurationengine/source/cone/public/tests/unittest_configuration.py
configurationengine/source/cone/public/tests/unittest_container.py
configurationengine/source/cone/public/tests/unittest_data.py
configurationengine/source/cone/public/tests/unittest_feature.py
configurationengine/source/cone/public/tests/unittest_layer.py
configurationengine/source/cone/public/tests/unittest_mapping.py
configurationengine/source/cone/public/tests/unittest_options.py
configurationengine/source/cone/public/tests/unittest_persistence.py
configurationengine/source/cone/public/tests/unittest_plugin_api.py
configurationengine/source/cone/public/tests/unittest_plugin_implcontainer.py
configurationengine/source/cone/public/tests/unittest_plugin_reader.py
configurationengine/source/cone/public/tests/unittest_project.py
configurationengine/source/cone/public/tests/unittest_public_api.py
configurationengine/source/cone/public/tests/unittest_rules.py
configurationengine/source/cone/public/tests/unittest_rules_on_configuration.py
configurationengine/source/cone/public/tests/unittest_rules_simplecondition.py
configurationengine/source/cone/public/tests/unittest_settings.py
configurationengine/source/cone/public/tests/unittest_storage.py
configurationengine/source/cone/public/tests/unittest_utils.py
configurationengine/source/cone/public/tests/unittest_valueset.py
configurationengine/source/cone/public/tests/unittest_views.py
configurationengine/source/cone/public/tests/unittest_xml_parsing.py
configurationengine/source/cone/public/tests/utils-testdata/foobar/bar.txt
configurationengine/source/cone/public/tests/utils-testdata/scrot.txt
configurationengine/source/cone/public/tests/utils-testdata/test.txt
configurationengine/source/cone/public/utils.py
configurationengine/source/cone/runtests.py
configurationengine/source/cone/storage/__init__.py
configurationengine/source/cone/storage/authenticate.py
configurationengine/source/cone/storage/common.py
configurationengine/source/cone/storage/configurationpersistence.py
configurationengine/source/cone/storage/filestorage.py
configurationengine/source/cone/storage/metadata.py
configurationengine/source/cone/storage/persistentdictionary.py
configurationengine/source/cone/storage/resources.py
configurationengine/source/cone/storage/stringstorage.py
configurationengine/source/cone/storage/tests/__init__.py
configurationengine/source/cone/storage/tests/data.zip
configurationengine/source/cone/storage/tests/data/.metadata
configurationengine/source/cone/storage/tests/data/familyX/confml/data.confml
configurationengine/source/cone/storage/tests/data/familyX/content/test/override.txt
configurationengine/source/cone/storage/tests/data/familyX/content/test/shout.txt
configurationengine/source/cone/storage/tests/data/familyX/prodX/confml/data.confml
configurationengine/source/cone/storage/tests/data/familyX/prodX/content/prodX/jee/ProdX_specific.txt
configurationengine/source/cone/storage/tests/data/familyX/prodX/root.confml
configurationengine/source/cone/storage/tests/data/familyX/root.confml
configurationengine/source/cone/storage/tests/data/morestuff.confml
configurationengine/source/cone/storage/tests/data/onefile/test.txt
configurationengine/source/cone/storage/tests/data/platform/s60/content/test/override.txt
configurationengine/source/cone/storage/tests/data/platform/s60/content/test/s60.txt
configurationengine/source/cone/storage/tests/data/platform/s60/implml/accessoryserver_1020505A.crml
configurationengine/source/cone/storage/tests/data/platform/s60/implml/accesspoints_10008D3A.crml
configurationengine/source/cone/storage/tests/data/platform/s60/implml/accesspoints_10008D3B.crml
configurationengine/source/cone/storage/tests/data/platform/s60/implml/actionpriorities_2000FDC2.crml
configurationengine/source/cone/storage/tests/data/platform/s60/root.confml
configurationengine/source/cone/storage/tests/data/prodX.confml
configurationengine/source/cone/storage/tests/data/regional/japan/root.confml
configurationengine/source/cone/storage/tests/data/simple.confml
configurationengine/source/cone/storage/tests/empty_zip_storage.zip
configurationengine/source/cone/storage/tests/file_vs_zip_data.zip
configurationengine/source/cone/storage/tests/fileres_test/image-bmp-1bit.bmp
configurationengine/source/cone/storage/tests/fileres_test/image-bmp-24bit.bmp
configurationengine/source/cone/storage/tests/fileres_test/image-bmp-4bit.bmp
configurationengine/source/cone/storage/tests/fileres_test/image-bmp-8bit.bmp
configurationengine/source/cone/storage/tests/fileres_test/image-jpeg-1bit.jpg
configurationengine/source/cone/storage/tests/fileres_test/invalid.bmp
configurationengine/source/cone/storage/tests/fileres_test/largefile.bin
configurationengine/source/cone/storage/tests/fileres_test/testread.txt
configurationengine/source/cone/storage/tests/list_resources_data/7zip.zip
configurationengine/source/cone/storage/tests/list_resources_data/carbide.ct.cpf
configurationengine/source/cone/storage/tests/list_resources_data/winzip.zip
configurationengine/source/cone/storage/tests/runtests.py
configurationengine/source/cone/storage/tests/simplewebserver.py
configurationengine/source/cone/storage/tests/unittest_fileresource.py
configurationengine/source/cone/storage/tests/unittest_filestorage.py
configurationengine/source/cone/storage/tests/unittest_filestorage_layer.py
configurationengine/source/cone/storage/tests/unittest_filestorage_vs_zipstorage.py
configurationengine/source/cone/storage/tests/unittest_metadata.py
configurationengine/source/cone/storage/tests/unittest_resource.py
configurationengine/source/cone/storage/tests/unittest_stringstorage.py
configurationengine/source/cone/storage/tests/unittest_webstorage.py
configurationengine/source/cone/storage/tests/unittest_webstorage_carbon.py
configurationengine/source/cone/storage/tests/unittest_zipresource.py
configurationengine/source/cone/storage/tests/unittest_zipstorage.py
configurationengine/source/cone/storage/tests/zipres_test.zip
configurationengine/source/cone/storage/webstorage.py
configurationengine/source/cone/storage/zipstorage.py
configurationengine/source/cone/test.xml
configurationengine/source/cone/tests/__init__.py
configurationengine/source/cone/tests/cone_input.zip
configurationengine/source/cone/tests/runtests.py
configurationengine/source/dev-tools/find_tabs.py
configurationengine/source/ez_setup.py
configurationengine/source/plugins/build_egg_info.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/__init__.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/__init__.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/confml/basic_setting_types_test.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/implml/file1.commandml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/implml/file2.commandml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/root.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/confml/data.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/product/root.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/root.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/product.confml
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/tools/makedir.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/tools/print_hello.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/runtests.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_commandml_plugin.py
configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_parse_commandml.py
configurationengine/source/plugins/common/ConeCommandPlugin/setup.cfg
configurationengine/source/plugins/common/ConeCommandPlugin/setup.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/__init__.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/contentml.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/contentmlparser.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/__init__.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/CTD_Special.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/CVC_Content.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/content.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/override.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/s60.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/test_CAP_letters.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_multi_outputs.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_tags.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_tags_refs.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/copy.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/copy_files.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/file_refs.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_capital_file_input.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs2.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs3.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_sequence_refs.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_external_input.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_external_with_ref.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_filter_both.content
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/root.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/external_content/abc.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/external_content/folder1/data.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/external_content/folder1/folder2/setting.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/confml/data.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/content/test/override.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/content/test/shout.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/product/content/prodX/jee/ProdX_specific.txt
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/product/root.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/root.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/product.confml
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/runtests.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_confmlrefs.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_copy.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_parseimpl.py
configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_plugin.py
configurationengine/source/plugins/common/ConeContentPlugin/setup.cfg
configurationengine/source/plugins/common/ConeContentPlugin/setup.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/__init__.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/__init__.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/accesspoint_id_counter.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/layer_utils.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/shortcuts_conversion.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/__init__.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/confml/test.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/implml/test1.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer2/confml/test.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer2/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer3/confml/test.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer3/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer4/confml/test.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer4/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer5/confml/test.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer5/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/ctd/confml/CTD_commsdat.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/ctd/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/.metadata
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/ap.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/commsdatcreator.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/testdata.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/implml/accesspoint_id_counter.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/.metadata
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/confml/data.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/runtests.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/unittest_accesspoint_id_counter.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/unittest_layer_utils.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/relations.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/ruleml.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/__init__.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/confml/testdata.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/implml/terminalexpression.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/confml/invalid_python_eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/implml/invalid_python_eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/confml/invalid_python_eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/implml/invalid_python_eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/implml/scripts/test_eval.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/confml/invalid_python_eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/implml/invalid_python_eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/confml/invalid_python_eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/implml/invalid_python_eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/implml/scripts/test_eval.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/confml/invalid_python_eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/implml/invalid_python_eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/.metadata
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/.project
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/.metadata
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/confml/actionpriorities.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/implml/gsm.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/.metadata
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/arithmetic.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/commsdatcreator.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/comparison_operators.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/eval.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/filename_testdata.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/testdata.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/arithmetic.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/commsdat.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/comparison_operators.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/container_with_rules.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/eval.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/filename_rules.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/rules.ruleml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/scripts/test_eval.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/root.confml
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/runtests.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_eval.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_parseruleml.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_empty_plugin.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_plugin.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_plugin_errors.py
configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rules.py
configurationengine/source/plugins/common/ConeRulePlugin/setup.cfg
configurationengine/source/plugins/common/ConeRulePlugin/setup.py
configurationengine/source/plugins/common/ConeTemplatePlugin/Jinja2-2.1.1-py2.5-win32.egg
configurationengine/source/plugins/common/ConeTemplatePlugin/__init__.py
configurationengine/source/plugins/common/ConeTemplatePlugin/setup.cfg
configurationengine/source/plugins/common/ConeTemplatePlugin/setup.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/__init__.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/__init__.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/create_dict_test/expected_list.txt
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/create_dict_test/expected_tree.txt
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/feature1.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/feature2.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/output_define.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/access_configuration.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/external_tempfile.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file1.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file2.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file3.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file4.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file5.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file6.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test2.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test3.template
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test3.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/output_with_ref.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/unicode_template_test.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/utf_bom_test.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/root.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/assets/s60/root.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/confml/test_features.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/implml/test.templateml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/root.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/confml/data.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/product/root.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/root.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/filter.filter
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/filter.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter.filter
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter3.filter
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/product.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/root1.confml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template.txt
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template.xml
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template2.txt
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/runtests.py
configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/unittest_templatemlplugin.py
configurationengine/source/plugins/common/dep-eggs/readme.txt
configurationengine/source/plugins/common/integration-test/__init__.py
configurationengine/source/plugins/common/integration-test/runtests.py
configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file1.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file2.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file3.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/overlay_folder/overlay.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/unicode_template_test.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/project/.project
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/basic_setting_types_test.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/empty_sequence.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/feature1.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/feature2.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/file_folder_test.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/sequence_setting_test.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/root.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/confml/custom.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/confml/view.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/content/overlay/overlay_folder/overlay.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/overlay.content
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/sequence_files.content
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/unicode_rule_test.ruleml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/unicode_template_test.templateml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/root.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/confml/data.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file1.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file2.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file3.txt
configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/root.confml
configurationengine/source/plugins/common/integration-test/testdata/generate/project/root.confml
configurationengine/source/plugins/common/integration-test/unittest_generate.py
configurationengine/source/plugins/common/runtests.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/__init__.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_impl.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_model.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_reader.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/__init__.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest1_1.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest1_2.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest2_1.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest2_2.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/some/dir/out1.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/some/dir2/out2.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/test.txt
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/confml/test.confml
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/implml/multitest.implml
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/implml/test.exampleml
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/root.confml
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/root.confml
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/runtests.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_generation.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_impl.py
configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_reader.py
configurationengine/source/plugins/example/ConeExamplePlugin/setup.cfg
configurationengine/source/plugins/example/ConeExamplePlugin/setup.py
configurationengine/source/plugins/example/dep-eggs/readme.txt
configurationengine/source/plugins/example/integration-test/__init__.py
configurationengine/source/plugins/example/integration-test/export_standalone.py
configurationengine/source/plugins/example/integration-test/runtests.py
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest1_1.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest1_2.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest2_1.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest2_2.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/some/dir/out1.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/some/dir2/out2.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/expected/test.txt
configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/confml/test.confml
configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/implml/multitest.implml
configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/implml/test.exampleml
configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/root.confml
configurationengine/source/plugins/example/integration-test/testdata/generate/project/root.confml
configurationengine/source/plugins/example/integration-test/unittest_generate.py
configurationengine/source/plugins/example/runtests.py
configurationengine/source/plugins/nose_unittests.cfg
configurationengine/source/plugins/plugin_utils.py
configurationengine/source/plugins/readme.txt
configurationengine/source/plugins/runtests.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/__init__.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_comparator.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_impl.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_model.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_reader.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_writer.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/centrepconv_txt_to_cre.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000001_simple_keys.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000002_bitmask_keys.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000003_key_ranges.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000004_key_type_changed.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000005_repo_attrs_changed.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000006_renamed_repo.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/10000001_removed_repo.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/30000000_duplicate_repo1_proj1.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/30000000_duplicate_repo2_proj1.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000001_simple_keys.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000002_bitmask_keys.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000003_key_ranges.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000004_key_type_changed.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000005_repo_attrs_changed.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000006_renamed_repo_xyz.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/20000001_added_repo.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/30000000_duplicate_repo1_proj2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/30000000_duplicate_repo2_proj2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000001.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000002.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000003.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000004.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000005.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/private/100059C9/cenrep_rfs.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/all_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/backup_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/bitmask_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/no_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/partial_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/repo_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000001_all_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000001_all_rfs_dup.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000002_partial_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000002_partial_rfs_dup.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000003_no_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000003_no_rfs_dup.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000004_repo_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000004_repo_rfs_dup.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000005_bitmask_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000005_bitmask_rfs_dup.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000001.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000002.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000003.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000004.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000005.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000006.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000007.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000008.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000009.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000A.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000B.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000C.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000D.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000E.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E1.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E2.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E3.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E4.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E5.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E6.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E7.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E8.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E9.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000EA.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000F1.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000001.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000002.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000003.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000004.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000005.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/20000001.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/private/100059C9/cenrep_rfs.txt
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/access_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/access_test_2.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/all_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/backup_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/bitmask_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/bitmask_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/booleans.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_binaries.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_ints.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_reals.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_strings.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_strings8.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/feature1.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/feature2.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/key_range.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/key_range_2.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/no_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/partial_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/repo_rfs.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/sequence_with_rfs_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/special_char_test.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000001_feature1.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000002_feature2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000003_bitmask_test.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000004_booleans.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000005_crml_ints.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000006_crml_reals.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000007_crml_strings.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000008_crml_strings8.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000009_crml_binaries.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000A_access_test.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000B_backup_test.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000C_key_range.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000D_sequence_with_rfs_test.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000E_key_range_2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E1_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E2_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E3_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E4_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E5_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E6_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E7_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E8_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E9_empty_repository.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000EA_empty_repository_ver2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000F1_access_test_2.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000001_all_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000002_partial_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000003_no_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000004_repo_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000005_bitmask_rfs.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/20000001_special_char_test.crml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/root.confml
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_impl.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_model.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_reader.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_writer.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_txt_generation.py
configurationengine/source/plugins/symbian/ConeCRMLPlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeCRMLPlugin/setup.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/__init__.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/__init__.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/confflattener.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/genconfmlplugin.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/b/feature1_file_5.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/b/x/y/feature1_file_7.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/feature1_file_4.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/x/feature1_file_6.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature1_file_1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/special_char_test.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/x/feature1_file_2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/x/y/feature1_file_3.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/b/feature1_file_5.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/b/x/y/feature1_file_7.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/feature1_file_4.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/x/feature1_file_6.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature1_file_1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/special_char_test.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/x/feature1_file_2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/x/y/feature1_file_3.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/b/feature1_file_5.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/b/x/y/feature1_file_7.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/feature1_file_4.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/x/feature1_file_6.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature1_file_1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/special_char_test.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/x/feature1_file_2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/x/y/feature1_file_3.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/b/feature1_file_5.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/b/x/y/feature1_file_7.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/feature1_file_4.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/x/feature1_file_6.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature1_file_1.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/special_char_test.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/x/feature1_file_2.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/x/y/feature1_file_3.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/feature1.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/feature2.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/special_char_test.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_1.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_2.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_3.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_4.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_5.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_6.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_7.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_readme.txt
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature2.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/special_char_test.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/confml/data.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/root_oldmodel.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/confml/data.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/root_oldmodel.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/confml/data.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/root_oldmodel.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/CVC_2DigitDialing.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/commsdatcreator.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/predefinedcontacts.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/implml/file1.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/implml/predefinedcontacts.gcfml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/__init__.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_2DigitDialing.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ActiveIdleNotifiers.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ActiveIdleOther.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CPHSALS.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CellInfoDisplay.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CustomerMenu.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_InstantMessaging.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_NokiaPCInternetAccess.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_OperatorLogo.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_Preinstalled.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_RightSoftkey.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_StartupShutdownAnimations.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_Streaming.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_SyncML.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ThemeWallpaperScreensaver.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_VoiceMailbox.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ZeroPlusSend.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/cvc_view.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/cvc_root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/confml/data.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/product/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/root.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/product.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root1.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root2.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root3.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root4.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root_cvc.confml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_confflattener.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_gcfml_plugin.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_generation.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_xslttransformer.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog.xml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog_ex1.xsl
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog_with_ex1.xml
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/xslttransformer.py
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/setup.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/__init__.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_exceptions.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_header.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_reader.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_writer.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrml_parser.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrrepository.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/header_writer.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_dat/hcr.dat
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_header/multi_header.h
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_dat/hcr.dat
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_header/test1.h
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/generate_repo.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test1.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test2.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test3.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/hcr_dat.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/multi_header.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test1.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test2.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test3.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/root.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/root.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/confml/hcrexample.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/implml/example.hcrml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/root.confml
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcr_header.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_impl.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_reader.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_writer.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrrepository.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_read_write_record.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_read_write_repository.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_reader.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_writer.py
configurationengine/source/plugins/symbian/ConeHCRPlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeHCRPlugin/setup.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/__init__.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/SVGTBinEncode.exe
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/ThirdPartyBitmap.pal
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/bmconv.exe
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/mifconv.exe
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/xerces-c_2_6.dll
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/generators.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/imageml.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/product.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/CVC_StartupShutdownAnimations.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/data.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/depth_from_ref_test.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/optional_test.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/startup.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame01.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame02.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame03.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame04.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame05.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame06.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame07.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame08.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame09.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame10.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame11.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame12.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame13.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame14.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame15.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame16.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame17.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame18.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame19.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame20.bmp
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/wakeup_sound.mp3
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/svg_files/icon.svg
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/depth_from_ref_test.imageml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/optional_test.imageml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/startup_animation.imageml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/startupmif_animation.imageml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/root.confml
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_generators.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_imageml_parseimpl.py
configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_imageml_plugin.py
configurationengine/source/plugins/symbian/ConeImagePlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeImagePlugin/setup.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/.project
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/.pydevproject
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/__init__.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/__init__.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/convertproject.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/create_project.convertprojectml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/.metadata
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/confml/family_x.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/confml/product_x.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Euro/confml/VariantData_product_x_Euro.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Euro/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/French/confml/VariantData_product_x_French.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/French/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/German/confml/VariantData_product_x_German.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/German/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Greek/confml/VariantData_product_x_Greek.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Greek/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test/implml/create_project.convertprojectml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test2/dummy.iby
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test3/implml/create_project.convertprojectml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test3/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platform1_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platform2_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/confml/bitmask_test.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/confml/feature1.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/bitmask_test_12341002.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_12341000.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_12341001.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_sequence.gcfml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/confml/feature2.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/implml/feature2_ABCD0000.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_Euro_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_French_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_German_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_Greek_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/bitmask_test.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/bitmask_test_12341002.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_12341000.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_12341001.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_sequence.gcfml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/platform1.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/feature2.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/feature2_ABCD0000.crml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/platform2.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convert.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convertpluginlayer/implml/create_project.convertprojectml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convertpluginlayer/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.bin
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.hrh
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.iby
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.ini
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/family_x.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/image_conf_family_x.mk
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/product_x/product_x.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/some_file.txt
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/Euro/VariantData_product_x_Euro.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/French/VariantData_product_x_French.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/German/VariantData_product_x_German.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/Greek/VariantData_product_x_Greek.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/assets/s60/implml/file1.convertprojectml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/assets/s60/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/confml/data.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/product/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/root.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/product.confml
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/unittest_convertprojectml_plugin.py
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/setup.py
configurationengine/source/plugins/symbian/ConeThemePlugin/__init__.py
configurationengine/source/plugins/symbian/ConeThemePlugin/setup.cfg
configurationengine/source/plugins/symbian/ConeThemePlugin/setup.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/__init__.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/maketheme.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/__init__.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/.metadata
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/.project
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_2DigitDialing.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ActiveIdleNotifiers.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ActiveIdleOther.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_AppShell323.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_BluetoothDiscoverability.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CPHSALS.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CellInfoDisplay.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CustomerMenu.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_InstantMessaging.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_MMS.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_NokiaPCInternetAccess.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_OperatorLogo.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_Preinstalled.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_RightSoftkey.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_StartupShutdownAnimations.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_Streaming.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_SyncML.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ThemeWallpaperScreensaver.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_VoiceMailbox.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ZeroPlusSend.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/test.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/cvc_root.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/cvc_view.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/root_variant.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/confml/aknskins.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/content/UI/Armi2.tpf
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/content/UI/Themes/Armi.tpf
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/implml/aknskins_101F876F.crml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/implml/aknskins_10282CB2.crml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/s60_root.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/test_pkg/themepackage.pkg
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/test_pkg/themepackage2.pkg
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/confml/data.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/content/UI/Themes/Armi.tpf
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/implml/theme.thememl
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/variant_root.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/variant_view.confml
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/runtests.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_container.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_function.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_plugin.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_resource.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_container.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_function.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_resource.py
configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/unzip.py
configurationengine/source/plugins/symbian/dep-eggs/readme.txt
configurationengine/source/plugins/symbian/integration-test/__init__.py
configurationengine/source/plugins/symbian/integration-test/export_standalone.py
configurationengine/source/plugins/symbian/integration-test/runtests.py
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc.html
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000001_simple_keys.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000002_bitmask_keys.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000003_key_ranges.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000004_key_type_changed.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000005_repo_attrs_changed.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000006_renamed_repo.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_10000001_removed_repo.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_20000001_added_repo.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_30000000_duplicate_repo.csv
configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_all.csv
configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/SVGTBinEncode.exe
configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/ThirdPartyBitmap.pal
configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/bmconv.exe
configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/mifconv.exe
configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/xerces-c_2_6.dll
configurationengine/source/plugins/symbian/integration-test/testdata/generate/mock_carbide_ui/makepackage.bat
configurationengine/source/plugins/symbian/integration-test/testdata/generate/mock_carbide_ui/makepackage.py
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/.project
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/basic_setting_types_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/bitmask_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/feature1.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/feature2.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/file_folder_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/hcr_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/sequence_setting_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/sound_file_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/theme_uids.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/time_types_test.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/bitmask_test_12341002.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_12341000.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_12341001.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_sequence.gcfml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature2_ABCD0000.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/hcr_test.hcrml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/sound_file_test_10000000.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/theme_uids_20000000.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/time_types_test_12341003.crml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/root.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/confml/custom.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/confml/view.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/bmp_animation.imageml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/configure_bitmask.ruleml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/sound.implml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/sound2.content
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/svg_animation.imageml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/themes.thememl
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/unicode_rule_test.ruleml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/root.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/confml/data.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame01.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame02.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame03.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame04.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame05.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame06.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame07.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame08.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame09.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame10.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame11.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame12.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame13.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame14.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame15.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame16.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame17.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame18.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame19.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame20.bmp
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/local_sounds/test.mp3
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_01.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_02.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_03.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_04.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_05.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_06.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_07.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_08.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_09.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_10.svg
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_1.tpf
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_2.tpf
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_3.tpf
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/root.confml
configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/root.confml
configurationengine/source/plugins/symbian/integration-test/unittest_crml_dc.py
configurationengine/source/plugins/symbian/integration-test/unittest_generate.py
configurationengine/source/plugins/symbian/runtests.py
configurationengine/source/runtests.py
configurationengine/source/scripts/compare_api_report_template.html
configurationengine/source/scripts/compare_data_report_template.html
configurationengine/source/scripts/cone_base.html
configurationengine/source/scripts/cone_common.py
configurationengine/source/scripts/cone_defaults.cfg
configurationengine/source/scripts/cone_subaction.py
configurationengine/source/scripts/cone_tool.py
configurationengine/source/scripts/conesub_compare.py
configurationengine/source/scripts/conesub_export.py
configurationengine/source/scripts/conesub_generate.cfg
configurationengine/source/scripts/conesub_generate.py
configurationengine/source/scripts/conesub_import_browserbookmarks.py.old
configurationengine/source/scripts/conesub_info.py
configurationengine/source/scripts/conesub_merge.py
configurationengine/source/scripts/conesub_report.py
configurationengine/source/scripts/conesub_update.py
configurationengine/source/scripts/crml_dc_report_template.csv
configurationengine/source/scripts/crml_dc_report_template.html
configurationengine/source/scripts/gen_report_template.html
configurationengine/source/scripts/generation_report.py
configurationengine/source/scripts/imaker_variantdir.cfg
configurationengine/source/scripts/info_api_report_template.csv
configurationengine/source/scripts/info_api_report_template.html
configurationengine/source/scripts/info_content_report_template.html
configurationengine/source/scripts/info_impl_report_template.html
configurationengine/source/scripts/info_value_report_template.csv
configurationengine/source/scripts/info_value_report_template.html
configurationengine/source/scripts/logging.ini
configurationengine/source/scripts/report_util.py
configurationengine/source/scripts/setup.py
configurationengine/source/scripts/tests/__init__.py
configurationengine/source/scripts/tests/export_standalone/export_standalone.py
configurationengine/source/scripts/tests/export_standalone/overlay/readme.txt
configurationengine/source/scripts/tests/export_standalone/overlay/runtests.cmd
configurationengine/source/scripts/tests/export_standalone/overlay/runtests.py
configurationengine/source/scripts/tests/export_standalone/overlay/tests/__init__.py
configurationengine/source/scripts/tests/export_test_project.zip
configurationengine/source/scripts/tests/generation_test_project/.project
configurationengine/source/scripts/tests/generation_test_project/base/confml/basic_setting_types_test.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/feature1.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/feature2.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/file_folder_test.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/multiselection.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/name_id_mapping_test.confml
configurationengine/source/scripts/tests/generation_test_project/base/confml/sequence_setting_test.confml
configurationengine/source/scripts/tests/generation_test_project/base/implml/multiselection.templateml
configurationengine/source/scripts/tests/generation_test_project/base/implml/name_id_mapping_test.templateml
configurationengine/source/scripts/tests/generation_test_project/base/root.confml
configurationengine/source/scripts/tests/generation_test_project/custom/confml/custom.confml
configurationengine/source/scripts/tests/generation_test_project/custom/confml/view.confml
configurationengine/source/scripts/tests/generation_test_project/custom/content/apps/app1.txt
configurationengine/source/scripts/tests/generation_test_project/custom/content/apps/app2.txt
configurationengine/source/scripts/tests/generation_test_project/custom/content/invocation_phase_test_1.txt
configurationengine/source/scripts/tests/generation_test_project/custom/content/invocation_phase_test_2.txt
configurationengine/source/scripts/tests/generation_test_project/custom/implml/conditional_container.implml
configurationengine/source/scripts/tests/generation_test_project/custom/implml/invocation_phase_test.implml
configurationengine/source/scripts/tests/generation_test_project/custom/implml/missing_file_in_report_test.implml
configurationengine/source/scripts/tests/generation_test_project/custom/implml/output_override_test.implml
configurationengine/source/scripts/tests/generation_test_project/custom/implml/seq_tempvar.implml
configurationengine/source/scripts/tests/generation_test_project/custom/implml/seq_tempvar.py
configurationengine/source/scripts/tests/generation_test_project/custom/implml/simple_tempvars.implml
configurationengine/source/scripts/tests/generation_test_project/custom/root.confml
configurationengine/source/scripts/tests/generation_test_project/data/confml/data.confml
configurationengine/source/scripts/tests/generation_test_project/data/content/file1.txt
configurationengine/source/scripts/tests/generation_test_project/data/content/file2.txt
configurationengine/source/scripts/tests/generation_test_project/data/content/file3.txt
configurationengine/source/scripts/tests/generation_test_project/data/root.confml
configurationengine/source/scripts/tests/generation_test_project/root.confml
configurationengine/source/scripts/tests/runtests.py
configurationengine/source/scripts/tests/scripttest_common.py
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/content/test.txt
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/none.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t2.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t2_t3.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t3.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t2.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t2_t3.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t3.content
configurationengine/source/scripts/tests/tag_filtering_test_project/layer/root.confml
configurationengine/source/scripts/tests/tag_filtering_test_project/root.confml
configurationengine/source/scripts/tests/template.csv
configurationengine/source/scripts/tests/test_project.cpf
configurationengine/source/scripts/tests/test_template/template2.csv
configurationengine/source/scripts/tests/test_variant.cpf
configurationengine/source/scripts/tests/testdata/compare/api_template.txt
configurationengine/source/scripts/tests/testdata/compare/data_template.txt
configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p1r1.txt
configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p1r4.txt
configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p2r1.txt
configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p1r1.txt
configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p1r4.txt
configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p2r1.txt
configurationengine/source/scripts/tests/testdata/compare/project1.zip
configurationengine/source/scripts/tests/testdata/compare/project2.zip
configurationengine/source/scripts/tests/testdata/generate/expected/content/invocation_phase_test_common_ns.txt
configurationengine/source/scripts/tests/testdata/generate/expected/content/invocation_phase_test_contentml_ns.txt
configurationengine/source/scripts/tests/testdata/generate/expected/content/simple_tempvars_test.txt
configurationengine/source/scripts/tests/testdata/generate/expected/content/temp_seq_test/invocation_phase_test_1.txt
configurationengine/source/scripts/tests/testdata/generate/expected/content/temp_seq_test/invocation_phase_test_2.txt
configurationengine/source/scripts/tests/testdata/generate/expected/content/template_string_condition_true.txt
configurationengine/source/scripts/tests/testdata/generate/expected/multiselection.txt
configurationengine/source/scripts/tests/testdata/generate/expected/name_id_mapping_test.txt
configurationengine/source/scripts/tests/testdata/generate/expected/sis/app1.txt
configurationengine/source/scripts/tests/testdata/generate/expected/test_subdir/output_subdir_test.txt
configurationengine/source/scripts/tests/testdata/generate/expected_report.html
configurationengine/source/scripts/tests/testdata/generate/test_project_invalid_data_refs.zip
configurationengine/source/scripts/tests/testdata/info/custom_value_report_template.html
configurationengine/source/scripts/tests/testdata/info/expected/api_report.html
configurationengine/source/scripts/tests/testdata/info/expected/content_report.html
configurationengine/source/scripts/tests/testdata/info/expected/impl_report.html
configurationengine/source/scripts/tests/testdata/info/expected/impl_report_with_containers.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report.csv
configurationengine/source/scripts/tests/testdata/info/expected/value_report_custom.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report_langpacks.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report_multi_mixed.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report_single.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report_single_with_view.html
configurationengine/source/scripts/tests/testdata/info/expected/value_report_special_chars.csv
configurationengine/source/scripts/tests/testdata/info/include_test_view.confml
configurationengine/source/scripts/tests/testdata/info/test_view.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/asset1_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/asset2_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/confml/asset1_feature1.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/confml/asset1_feature2.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/confml/asset2_feature1.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/confml/asset2_feature2.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/family/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/family/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/family_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_01/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_01/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_02/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_02/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_03/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_03/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_01_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_02_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_03_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/product_root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/variant/confml/data.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/variant/root.confml
configurationengine/source/scripts/tests/testdata/info/value_report_project/variant_root.confml
configurationengine/source/scripts/tests/testdata/log_config.ini
configurationengine/source/scripts/tests/testdata/merge/assetmerge/data.zip
configurationengine/source/scripts/tests/testdata/merge/assetmerge/expected.zip
configurationengine/source/scripts/tests/testdata/merge/last_layer_expected.zip
configurationengine/source/scripts/tests/testdata/merge/last_layer_rename_expected.zip
configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v1_expected.zip
configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v1_v2_expected.zip
configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v2_expected.zip
configurationengine/source/scripts/tests/testdata/merge/multiple_last_layers_expected.zip
configurationengine/source/scripts/tests/testdata/merge/test_variant_v1.cpf
configurationengine/source/scripts/tests/testdata/merge/test_variant_v2.cpf
configurationengine/source/scripts/tests/testdata/report/expected/both.txt
configurationengine/source/scripts/tests/testdata/report/expected/rofs3.txt
configurationengine/source/scripts/tests/testdata/report/expected/uda.txt
configurationengine/source/scripts/tests/testdata/report/project/base/confml/feature1.confml
configurationengine/source/scripts/tests/testdata/report/project/base/content/default_file.txt
configurationengine/source/scripts/tests/testdata/report/project/base/content/seq/def1_file.txt
configurationengine/source/scripts/tests/testdata/report/project/base/content/seq/def2_file.txt
configurationengine/source/scripts/tests/testdata/report/project/base/implml/booleansetting_rofs3.templateml
configurationengine/source/scripts/tests/testdata/report/project/base/implml/booleansetting_uda.templateml
configurationengine/source/scripts/tests/testdata/report/project/base/implml/intsetting_rofs3.templateml
configurationengine/source/scripts/tests/testdata/report/project/base/implml/realsetting_rofs3_uda.templateml
configurationengine/source/scripts/tests/testdata/report/project/base/implml/stringsetting_uda.templateml
configurationengine/source/scripts/tests/testdata/report/project/base/root.confml
configurationengine/source/scripts/tests/testdata/report/project/data/confml/data.confml
configurationengine/source/scripts/tests/testdata/report/project/data/root.confml
configurationengine/source/scripts/tests/testdata/report/project/root.confml
configurationengine/source/scripts/tests/testdata/report/template.txt
configurationengine/source/scripts/tests/unittest_compare.py
configurationengine/source/scripts/tests/unittest_cone.py
configurationengine/source/scripts/tests/unittest_export.py
configurationengine/source/scripts/tests/unittest_generate.py
configurationengine/source/scripts/tests/unittest_info.py
configurationengine/source/scripts/tests/unittest_merge.py
configurationengine/source/scripts/tests/unittest_report.py
configurationengine/source/scripts/tests/unittest_update.py
configurationengine/source/setup.cfg
configurationengine/source/setup.py
configurationengine/source/testautomation/setup.cfg
configurationengine/source/testautomation/setup.py
configurationengine/source/testautomation/testautomation/__init__.py
configurationengine/source/testautomation/testautomation/base_testcase.py
configurationengine/source/testautomation/testautomation/compare_xml.py
configurationengine/source/testautomation/testautomation/copy_dir.py
configurationengine/source/testautomation/testautomation/setup.py
configurationengine/source/testautomation/testautomation/testcli.py
configurationengine/source/testautomation/testautomation/tests/__init__.py
configurationengine/source/testautomation/testautomation/tests/runtests.py
configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/ignored.txt
configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/subdir1/subsubdir/test.txt
configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/subdir1/test.txt
configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/test.txt
configurationengine/source/testautomation/testautomation/tests/unittest_compare_xml.py
configurationengine/source/testautomation/testautomation/tests/unittest_utils.py
configurationengine/source/testautomation/testautomation/tests/unittest_zip_dir.py
configurationengine/source/testautomation/testautomation/unzip_file.py
configurationengine/source/testautomation/testautomation/utils.py
configurationengine/source/testautomation/testautomation/zip_dir.py
configurationengine/update_svn_revision.py
configurationengine/windows.properties
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/RELEASE.TXT	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,174 @@
+
+
+                         ConE the Configuration Engine
+                              Version cone-1.1.5
+                            Release Notes, 11.1.2010
+
+Release notes:
+=============
+== Version Cone-1.1.5 ==
+ * Stories:
+     - #792: Change ConE licenses from SFL to EPL
+     - #80: As a variant engineer I want to merge my configuration so that "old" content is removed
+     - #639: As a variant engineer I want that color depth argument for bmconv and mifconv is configurable
+     - #703: As a SW developer I want to merge my confml and implml to global configuration project easily so that I don't need to manually copy the files and update the root files.
+     - #765: As a user I want to configure cone logging output so that I can use the cone logs more efficiently
+     - #785: CommandML does not support tag elements
+ * Bug fixes:
+     - #814: ERROR: Content folder in vascos "dummy" layer is not added to CPF when adding layer with -a option
+     - #763: Selection setting option map does not work properly when option map element is used
+     - #193: Different configurations open on the same project return the same setting values
+     - #737: ConE merge produces incorrect output (layer root contains all data)
+     - #762: ConE: option mapping does not store the mapKey/mapValue to confml file when confml output is written
+     - #764: ConE must not assume that the executive process will have write access to workdir
+     - #820: MultiSelection value setting does not work correctly
+ 
+== Version Cone-1.1.4 ==
+ * Stories:
+     - #663: As a variant engineer I want to get resource's size in ruleml.
+     - #700: As a variant engineer I want to have a rule which automatically sets correct color depth so that I don't need to manually do that.
+ * Bug fixes:
+     - #701: ConE crml: cenrep txt generation with sid & capabilities produces incorrect output
+
+== Version Cone-1.1.3 ==
+ * Stories:
+     - #696: Factory Settings cannot be restored as phone resets every time the security code is inserted
+     - #698: cone.cmd returns 0 even if ConE execution fails
+ * Bug fixes:
+     - #699: Remove target:core tag from existing implementations so that no content is by default generated to core image.
+
+== Version Cone-1.1.2 ==
+
+== Version Cone-1.1.2 RC2 ==
+   * Bugfixes:
+    - Fixed template plug-in bug fix
+   
+== Version Cone-1.1.2 RC1 ==
+
+    * Stories:
+     - #588: As a user I want to run the same command on several configurations in a batch mode
+     - #611: As a product integrator I want to have info report in csv format so that importing to Excel is easy to made
+     - #612: As a product integrator I want to see possible values for certain setting so that default values template is easy to made
+     - #643: Impml harmonization with container concept
+     - #652: Content plugin refactoring to enable better use
+
+    * Bug fixes:
+     - #657: Project.create_configuration takes forever with big configuration project
+     - #659: Content plugins copy operation does not do anything if the file attribute in input has capital letter
+     - #660: plugins get increased to an insane amount!
+
+== Version Cone-1.1.1 RC4 ==
+ * Bugfixes:
+    - cone.cmd fix
+    
+== Version Cone-1.1.1 RC3 ==
+ * Bugfixes:
+    - GenConfML plugin to use LXML instead of 4Suite
+    - Changed installation system to make the installation into a sub-directory depending on the current Python version (e.g. cone/2.5/lib/ instead of cone/lib/ etc.)
+    - Changed cone.cmd so that it chooses the correct base directory based on the Python version
+    - Added dep-eggs for Python 2.6
+    - Updated setuptools to version 0.6c11 from 0.6c9
+    - PYTHONCASEOK=1 added to cone.cmd
+
+== Version Cone-1.1.1 RC2 ==
+ * Bugfixes:
+  * #640: Tag definitions in TemplateML namespace do not work
+  * #645: Report generation fails if the changed data contains references to non-existent settings
+  * #648: TemplateML plug-in does not list output files correctly
+  * #589: Change ImageML get_refs() to report references used in determining input  
+== Version Cone-1.1.1 RC1 ==
+ * Features:
+   * Support for new webstorage (Carbon extapi)
+     * Export features and data. Supports exporting of features and data from carbon to Configuration project and confml files.
+     * 
+   * Known issues
+     * Carbon refs are converted to apropriate confml refs in Cone which will cause problems if the carbon ref 
+     is not a valid confml ref. e.g. refs withs dots or any unicode characters.
+     * Selection type feature cannot be created with the Carbon extapi (Creation of groups fails).
+     * Directory separators '/' in configuration names will break the loading of configurations.
+     * Carbon allows only references in lower case, which is contradicting current confml specification. 
+== Version Cone-1.1.1 ==
+  * New features
+    * Templateml plugin
+    * Command plugin
+    * CRML DC (Data Compatibility) report into compare action
+    * Implementation Language parsing changed from file name based to XML namespace based
+      * It is now possible to have multiple implementations in a single file
+      * Support for implementation tags, invocation phase and temporary ConfML features added to a common ImplML namespace
+  * Bugfixes
+  * Known issues
+
+== Version Cone-1.0.0 ==
+  * New features
+  * Bugfixes
+  * Known issues
+    * #1556: ConE: sequence prepending works incorrectly
+    * #1722: Sequence items with extension policy prefix are reversed
+    * #1726: generate --add doesn't include the included layer's data in generation
+    * #1729: CO-18: Merged variant layer inclusions are not in the correct order
+    * #1799: Empty folders are not preserved when importing from a CPF generated by Carbide.ct or Carbide.v
+    * #1884: Cone: Imageml plugin execution tool setting configuration is relative to the execution folder.
+    * #1893: ImageML mifconv command doesn't work if tooldir contains spaces
+    * #1903: ConE rules cannot contain unicode chars
+
+== Version Cone-1.0.0RC3 ==
+  * New features
+  * Bugfixes
+    * #1909: Links to GenConfML output files don't work in the generation report
+    * #1908: CPF exported with multiple roots and empty folders doesn't work correctly in Carbide.v
+
+== Version Cone-1.0.0RC2 ==
+  * New features
+  * Bugfixes
+    * #1881: Report generation fails if any of the values contains unicode values
+    * #1890: Generation report doesn't support url encoding in links
+    * #1904: Cone cannot be executed in directory that contains spaces
+    * #1889: ImageML output goes under /output/content/content/
+    * #1905: ConE: The priority for filenamejoin is incorrect
+    * #1906: ConE generation fails if report output dir doesn't exist
+    * Removed import_browserbookmarks action
+    * #1907: Empty folders are not taken into CPF if they have been defined using -a parameter
+    
+== Version Cone-0.6.1 ==
+  * New features
+    * #1780: ConE plugin filtering re-factoring, http://configurationtools.nmp.nokia.com/configurationtool/ticket/1759
+      * Add support for generic tags for plugin. Adds has_tag function to the plugin api. see http://configurationtools.nmp.nokia.com/builds/cone/docs/epydoc/cone.public.plugin.ImplBase-class.html#has_tag
+      * Add support for ini file like configuring of ConE. e.g. Plugin paths and tags can be configured in these configuration files.
+    * #1574: As a variant engineer I want to see generation report so that I know which settings are properly generated and which needs to be modified manually
+      * See http://configurationtools.nmp.nokia.com/configurationtool/ticket/1574
+      * This is a reporting functionality embedded now in generation action.
+      * Uses jinja2 to make the reporting based on template language
+    * #1684: As a customization designer I want to be able to use arithmetic operations in rule files so that I can configure MMS settings easily
+      * See http://configurationtools.nmp.nokia.com/configurationtool/ticket/1684
+    * #1104: Empty directories are omited in CPF export: Support for Cone
+      * See http://configurationtools.nmp.nokia.com/configurationtool/ticket/1104
+    * #1784: Include empty folders in ConE merge
+      * See http://configurationtools.nmp.nokia.com/configurationtool/ticket/1784
+    * #1625: Phase support to Cone Content Plugin
+      * http://configurationtools.nmp.nokia.com/configurationtool/ticket/1625
+    * #1487: ConE support for Rules / Relations
+      * Adds a ruleml implementation language and plugin
+      * See http://configurationtools.nmp.nokia.com/configurationtool/ticket/1487  
+  * Bugfixes
+    * Fixed a bug in view parsing, which expected a id instead of a name.
+    * Fixed a bug in implementation container creation to a configuration that is not in the root of the storage.
+    * Fixed file handle leak in acceptance tests.
+    * Fixed a bug in user story, As a customization designer I want to add rule also for settings that have empty default value.
+    * #1654: Default extension policy not set correctly in ConE
+    * #1532: ConE: Removing non existing configuration fails
+    * #1499: Cone: Projectconversion plugin does not remove old includes from existing data files
+
+    
+== Version Cone-0.6.0 ==
+  * Confml support:
+    * Sequence data supports subsecuences (e.g. file element under sequence)
+    * Sequence data access via column (e.g. ref fea.sequencefea.column1) returns a list of data values in the column1 of sequencefea.
+    * Python type casting  for confml elements (ConfmlIntSetting,ConfmlBooleanSetting supported)
+
+== Version Cone-0.5.2 ==
+  * Confml support:
+    * sequence data support
+    * view support
+
+== Version Cone-0.5.1 ==
+  * First version of the ConE public API
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/plugin-integration-test-overlay/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/scripts-tests-overlay/nose_bat.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+[nosetests]
+verbosity=3
+include=unittest
+with-xunit=1
+xunit-file=cone-bat.xml
+tests=tests,plugin-tests
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/scripts-tests-overlay/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+ConE automated basic acceptance tests
+-------------------------------------
+
+Execution steps:
+1. Extract the ConE release to test under cone/
+2. Execute runtests.cmd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/scripts-tests-overlay/runtests.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+
+python %~dp0%\runtests.py
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/scripts-tests-overlay/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,108 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, re, unittest
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+CONE_PATH = os.path.join(ROOT_PATH, 'cone')
+EGGS_PATH = os.path.join(ROOT_PATH, 'eggs')
+
+def add_eggs_to_path(egg_path):
+    if not os.path.isdir(egg_path):
+        return
+    
+    for name in os.listdir(egg_path):
+        if name.endswith('.egg'):
+            path = os.path.normpath(os.path.join(egg_path, name))
+            if path not in sys.path:
+                print "Adding '%s' to path" % name
+                sys.path.append(path)
+
+
+def _collect_test_suite(base_dir, module_subdir):
+    # Check that the directory exists
+    module_dir = os.path.join(base_dir, module_subdir)
+    if not os.path.exists(module_dir):
+        raise RuntimeError("'%s' does not exist!" % module_dir)
+    
+    # Collect the names of all test modules (of the form "unittest_*.py")
+    test_modules_names = []
+    for name in os.listdir(module_dir):
+        if re.match(r'^unittest_.*\.py$', name) != None:
+            test_modules_names.append(name[:-3])
+    
+    # Import the modules
+    sys.path.insert(0, base_dir)
+    try:
+        suite = unittest.TestSuite()
+        for modname in test_modules_names:
+            # Load the test module dynamically and add it to the test suite
+            top_module = __import__(module_subdir + '.' + modname)
+            
+            # top_module contains now actually e.g. mymodule.unittest_sometest,
+            # so get the actual unit test module
+            module = getattr(top_module, modname)
+            
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def _run_without_nose():
+    suite = unittest.TestSuite()
+    
+    # Collect script test suite
+    suite.addTest(_collect_test_suite(ROOT_PATH, 'tests'))
+    
+    # Collect test suites from the plugin-tests/ directory
+    PLUGIN_TEST_DIR = os.path.join(ROOT_PATH, 'plugin-tests')
+    if os.path.exists(PLUGIN_TEST_DIR):
+        for name in os.listdir(PLUGIN_TEST_DIR):
+            plugin_suite = _collect_test_suite(PLUGIN_TEST_DIR, name)
+            suite.addTest(plugin_suite)
+    
+    # Run the tests
+    unittest.TextTestRunner(verbosity=2).run(suite)
+
+def _run_with_nose():
+    import nose
+    import nose.plugins.xunit
+    
+    # Configure nose
+    plugins = nose.plugins.manager.DefaultPluginManager()
+    allfiles = nose.config.all_config_files() + ['nose_bat.cfg']
+    conf = nose.config.Config(files=allfiles, plugins=plugins)
+    
+    # Run the tests
+    nose.run(config=conf, argv=sys.argv[:1])
+
+def main():
+    if 'CONE_PATH' not in os.environ:
+        cone_path = os.path.join(ROOT_PATH, 'cone')
+        print "Setting CONE_PATH to '%s'" % cone_path
+        os.environ['CONE_PATH'] = cone_path
+    
+    add_eggs_to_path(EGGS_PATH)
+    
+    if '--with-nose' in sys.argv:
+        _run_with_nose()
+    else:
+        _run_without_nose()
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export-bat/scripts-tests-overlay/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/export_bat.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,183 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, shutil, imp
+import logging
+from optparse import OptionParser
+
+log = logging.getLogger()
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../source'))
+SCRIPTS_SOURCE_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts'))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'plugins'))
+TESTAUTOMATION_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'testautomation'))
+assert os.path.exists(SOURCE_ROOT)
+assert os.path.exists(SCRIPTS_SOURCE_ROOT)
+assert os.path.exists(PLUGIN_SOURCE_ROOT)
+assert os.path.exists(TESTAUTOMATION_ROOT)
+
+sys.path.append(PLUGIN_SOURCE_ROOT)
+import plugin_utils
+
+sys.path.append(TESTAUTOMATION_ROOT)
+import testautomation
+from testautomation.copy_dir import copy_dir
+
+import utils
+utils.setup_logging('export_bat.log')
+
+
+def read_export_function_from_file(file_path):
+    if not os.path.exists(file_path):
+        return None
+    
+    m = imp.load_source(
+        file_path.replace('\\', '__')
+                 .replace('/', '__')
+                 .replace(':', '_')
+                 .replace('.', '_')
+                 .replace(' ', '_'),
+        file_path)
+    
+    try:
+        return m.export_standalone
+    except AttributeError:
+        return None
+
+def find_egg_file(dir, name, python_version):
+    """
+    Returns the name of an egg file in the given directory that starts with the
+    given name and is for the given Python version.
+    
+    >>> find_egg_file('dep-eggs', 'simplejson', '2.5')
+    'simplejson-2.0.9-py2.5-win32.egg'
+    >>> find_egg_file('dep-eggs', 'simplejson', '2.6')
+    'simplejson-2.0.9-py2.6-win32.egg'
+    """
+    for filename in os.listdir(dir):
+        if filename.startswith(name) and 'py' + python_version in filename:
+            return filename
+    return None
+
+def main(argv):
+    # -----------
+    # Parse args
+    # -----------
+    
+    parser = OptionParser()
+    parser.add_option("-t", "--target-dir",
+                      help="The directory where the test are to be exported.")
+    parser.add_option("-p", "--plugin-package",
+                      help="The plug-in package for exporting plug-in integration tests.",
+                      default=None)
+    (options, args) = parser.parse_args()
+    if options.target_dir is None:
+        parser.error("Target directory must be given")
+    
+    PYTHON_VERSION = utils.get_python_version()
+    
+    TARGET_PATH = options.target_dir
+    PLUGIN_PACKAGE = options.plugin_package
+    log.info("Target directory: %s" % TARGET_PATH)
+    log.info("Plug-in package:  %r" % PLUGIN_PACKAGE)
+    log.info("Python version:   %s" % PYTHON_VERSION)
+    
+    log.info("Cleaning target directory...")
+    utils.recreate_dir(TARGET_PATH)
+    
+    
+    # -------------------------
+    # Export script test files
+    # -------------------------
+    
+    log.info("Copying script test files...")
+    SCRIPT_TESTS_DIR = os.path.join(SCRIPTS_SOURCE_ROOT, 'tests')
+    assert os.path.exists(SCRIPT_TESTS_DIR)
+    copy_dir(source_dir             = SCRIPT_TESTS_DIR,
+             target_dir             = os.path.join(TARGET_PATH, 'tests'),
+             dir_ignore_functions   = [lambda d: d in ('.svn', 'temp', 'export_standalone')],
+             file_ignore_functions  = [lambda f: f == 'cone.log' or f.endswith('.pyc')])
+    
+    log.info("Copying script test overlay files...")
+    copy_dir(source_dir = os.path.join(ROOT_PATH, "export-bat/scripts-tests-overlay"),
+             target_dir = TARGET_PATH,
+             dir_ignore_functions = [lambda d: d  == '.svn'])
+    
+    
+    
+    # --------------------------------------
+    # Export plug-in integration test files
+    # --------------------------------------
+    
+    log.info("Exporting plug-in integration test files...")
+    subpaths_by_package = plugin_utils.find_plugin_package_subpaths('integration-test', PLUGIN_PACKAGE)
+    for package_name, tests_path in subpaths_by_package:
+        log.debug("  Package: %s" % package_name)
+        log.debug("  Path:    %s" % tests_path)
+        
+        log.debug("  Copying test files...")
+        target_path = os.path.join(TARGET_PATH, 'plugin-tests', package_name + '_tests')
+        copy_dir(source_dir             = tests_path,
+                 target_dir             = target_path,
+                 dir_ignore_functions   = [lambda d: d in ('.svn', 'temp')],
+                 file_ignore_functions  = [lambda f: f in ('cone.log', 'export_standalone.py') or f.endswith('.pyc')])
+        
+        log.debug("  Copying overlay files...")
+        overlay_path = os.path.join('export-bat/plugin-integration-test-overlay')
+        copy_dir(source_dir             = overlay_path,
+                 target_dir             = target_path,
+                 dir_ignore_functions   = [lambda d: d == '.svn'])
+        
+        log.debug("  Exporting extra data...")
+        func = read_export_function_from_file(os.path.join(tests_path, 'export_standalone.py'))
+        if func:
+            log.debug("  Executing export function...")
+            func(target_path)
+    
+    
+    TARGET_EGGS_DIR = os.path.join(TARGET_PATH, 'eggs')
+    
+    # ---------------------------
+    # Copy needed dependency eggs
+    # ---------------------------
+    
+    log.info("Copying library eggs...")
+    DEP_EGGS_DIR = os.path.normpath(os.path.join(ROOT_PATH, '../dep-eggs'))
+    assert os.path.isdir(DEP_EGGS_DIR)
+    DEPENDENCIES = ['simplejson', 'Jinja2']
+    for dep in DEPENDENCIES:
+        egg_file_name = find_egg_file(DEP_EGGS_DIR, dep, PYTHON_VERSION)
+        if egg_file_name is None:
+            log.critical("Could not find egg file for dependency '%s' from '%s'" % (dep, DEP_EGGS_DIR))
+            return 1
+        source_path = os.path.join(DEP_EGGS_DIR, egg_file_name)
+        target_path = os.path.join(TARGET_EGGS_DIR, egg_file_name)
+        utils.copy_file(source_path, target_path)
+    
+    
+    # ------------------
+    # Build needed eggs
+    # ------------------
+    
+    log.info("Building eggs...")
+    utils.build_egg(os.path.join(SOURCE_ROOT), TARGET_EGGS_DIR)
+    utils.build_egg(os.path.join(SOURCE_ROOT, 'testautomation'), TARGET_EGGS_DIR)
+    
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/install_cone.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,229 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#   Script for building and installing ConE into a specified directory.
+#
+
+import sys, os, shutil, subprocess, optparse
+import logging
+log = logging.getLogger()
+
+import utils
+utils.setup_logging('install_cone.log')
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+SOURCE_ROOT = os.path.abspath(os.path.join(ROOT_PATH, '../source'))
+assert os.path.isdir(SOURCE_ROOT)
+SCRIPTS_SOURCE_ROOT = os.path.abspath(os.path.join(ROOT_PATH, '../source/scripts'))
+assert os.path.isdir(SCRIPTS_SOURCE_ROOT)
+PLUGIN_SOURCE_ROOT = os.path.abspath(os.path.join(ROOT_PATH, '../source/plugins'))
+assert os.path.isdir(PLUGIN_SOURCE_ROOT)
+
+sys.path.append(PLUGIN_SOURCE_ROOT)
+import plugin_utils
+
+# Temporary directory where ConE eggs are built into
+TEMP_CONE_EGG_DIR = os.path.join(ROOT_PATH, 'install-temp/cone-eggs')
+# Temporary directory where dependency lib eggs are copied
+TEMP_LIB_EGG_DIR = os.path.join(ROOT_PATH, 'install-temp/dep-eggs')
+
+class BuildFailedError(RuntimeError):
+    pass
+
+def find_cone_egg_sources(plugin_package):
+    """
+    Return a list of paths to the source directories to install.
+    """
+    paths = [SOURCE_ROOT,
+             SCRIPTS_SOURCE_ROOT]
+    plugin_paths = plugin_utils.find_plugin_sources_by_package(plugin_package)
+    paths.extend(plugin_paths)
+    
+    log.debug("ConE egg source paths:\n%s" % '\n'.join(paths))
+    return paths
+    
+
+def build_cone_eggs(source_paths):
+    log.info("Cleaning temporary ConE egg dir...")
+    utils.recreate_dir(TEMP_CONE_EGG_DIR)
+    
+    log.info("Building ConE eggs...")
+    for source_path in source_paths:
+        ok = utils.build_egg(source_path, TEMP_CONE_EGG_DIR)
+        if not ok:
+            raise BuildFailedError()
+
+def retrieve_dep_eggs(plugin_package):
+    log.info("Cleaning temporary lib egg dir...")
+    utils.recreate_dir(TEMP_LIB_EGG_DIR)
+    
+    log.info("Retrieving dependency eggs...")
+    def copy_eggs(source_dir):
+        log.debug("Copying eggs from '%s'..." % source_dir)
+        for name in os.listdir(source_dir):
+            if name.endswith('.egg'):
+                utils.copy_file(
+                    source_path = os.path.join(source_dir, name),
+                    target_path = TEMP_LIB_EGG_DIR)
+   
+    dep_dirs_by_package = [(None, os.path.join(ROOT_PATH, '../dep-eggs'))]
+    dep_dirs_by_package.extend(plugin_utils.find_plugin_package_subpaths('dep-eggs', plugin_package))
+    
+    for package_name, dep_dir in dep_dirs_by_package:
+        copy_eggs(dep_dir)
+
+def init_target_dir(target_dir, python_version):
+    BASE_DIR = os.path.normpath(os.path.join(target_dir, 'cone', python_version))
+    LIB_DIR     = os.path.join(BASE_DIR, 'lib')
+    SCRIPT_DIR  = os.path.join(BASE_DIR, 'scripts')
+    
+    utils.recreate_dir(BASE_DIR)
+    utils.recreate_dir(LIB_DIR)
+    utils.recreate_dir(SCRIPT_DIR)
+    return LIB_DIR, SCRIPT_DIR
+
+def install_cone_eggs(target_dir, python_version):
+    """
+    Install ConE eggs into the given target directory.
+    """
+    log.info("Installing ConE eggs...")
+    LIB_DIR, SCRIPT_DIR = init_target_dir(target_dir, python_version)
+    
+    # Collect the eggs to install
+    eggs = ['setuptools'] # Setuptools are needed also
+    for name in os.listdir(TEMP_CONE_EGG_DIR):
+        if name.endswith('.egg'):
+            eggs.append(TEMP_CONE_EGG_DIR + '/' + name)
+    
+    # Run easy_install to install the eggs
+    for egg in eggs:
+        log.debug(egg)
+        
+        if sys.platform == "win32":
+            platform_args = ["--always-copy"]
+        else:
+            platform_args = ["--no-deps"]
+                    
+        command = ['easy_install',
+                   '--allow-hosts None',
+                   '--find-links install-temp/dep-eggs',
+                   '--install-dir "%s"' % LIB_DIR,
+                   '--script-dir "%s"' % SCRIPT_DIR,
+                   '--site-dirs "%s"' % LIB_DIR]
+        command.extend(platform_args)
+        command.append('"' + egg + '"')
+        command = ' '.join(command)
+        
+        log.debug(command)
+        ok = utils.run_command(command, env_overrides={'PYTHONPATH': LIB_DIR})
+        if not ok:
+            raise BuildFailedError()
+
+def develop_install_cone_sources(source_paths, target_dir, python_version):
+    log.info("Installing ConE sources in develop mode...")
+    LIB_DIR, SCRIPT_DIR = init_target_dir(target_dir, python_version)
+    
+    orig_workdir = os.getcwd()
+    try:
+        for source_path in source_paths:
+            os.chdir(source_path)
+            command = ['python setup.py develop',
+                   '--allow-hosts None',
+                   '--find-links "%s"' % os.path.normpath(os.path.join(ROOT_PATH, 'install-temp/dep-eggs')),
+                   '--install-dir "%s"' % LIB_DIR,
+                   '--script-dir "%s"' % SCRIPT_DIR,
+                   '--site-dirs "%s"' % LIB_DIR,
+                   '--always-copy']
+            command = ' '.join(command)
+            log.debug(command)
+            ok = utils.run_command(command, env_overrides={'PYTHONPATH': LIB_DIR})
+            if not ok:
+                raise BuildFailedError()
+    finally:
+        os.chdir(orig_workdir)
+
+def perform_build(target_dir, plugin_package, install_type, python_version):
+    log.info("Target directory: %s" % target_dir)
+    log.info("Plug-in package:  %r" % plugin_package)
+    log.info("Python version:   %s" % python_version)
+
+    # Retrieve dependencies to the correct location
+    retrieve_dep_eggs(plugin_package)
+    
+    # Find paths to the sources to install
+    source_paths = find_cone_egg_sources(plugin_package)
+    
+    log.info("Creating install directory...")
+    if not os.path.exists(target_dir):
+        os.makedirs(target_dir)
+    
+    if install_type == 'install':
+        build_cone_eggs(source_paths)
+        install_cone_eggs(target_dir, python_version)
+    else:
+        develop_install_cone_sources(source_paths, target_dir, python_version)
+    
+    # Copy RELEASE.txt
+    utils.copy_file(
+        source_path = os.path.join(SOURCE_ROOT, '..', 'RELEASE.TXT'),
+        target_path = os.path.join(target_dir, 'cone', 'RELEASE.TXT'))
+    
+    # Copy cone.cmd or cone.sh, depending on the platform
+    if sys.platform == "win32":
+        filename = "cone.cmd"
+    else:
+        filename = "cone.sh"
+    log.info("Copying %s" % filename)
+    utils.copy_file(
+        source_path = os.path.join(SOURCE_ROOT, filename),
+        target_path = target_dir)
+
+def main():
+    parser = optparse.OptionParser()
+    parser.add_option("-t", "--target-dir",
+                      help="The directory where ConE is to be installed.")
+    parser.add_option("-p", "--plugin-package",\
+                      help="The plug-in package to include in the installation.",\
+                      default=None)
+    parser.add_option("-i", "--install-type",\
+                      help="The installation type, can be 'install' (the default) or 'develop'.",\
+                      default='install')
+    (options, args) = parser.parse_args()
+    if options.target_dir is None:
+        parser.error("Target directory must be given")
+    if options.install_type not in ('install', 'develop'):
+        parser.error("Invalid install type ('%s')" % options.install_type)
+    
+    if not utils.run_command("python --help"):
+        log.critical("Could not run 'python'. Please make sure that you "\
+                     "have Python installed and in your path.")
+        return 1
+    
+    if not utils.run_command("easy_install --help"):
+        log.critical("Could not run 'easy_install'. Please make sure that you "\
+                     "have setuptools installed and the Python scripts directory in your path.")
+        return 1
+    
+    python_version = utils.get_python_version()
+    
+    try:
+        perform_build(options.target_dir, options.plugin_package, options.install_type, python_version)
+    except BuildFailedError:
+        return 1
+    
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+This directory contains the scripts used to install ConE into a directory
+and export standalone tests (BAT). The scripts are intended to be run from
+this directory.
+
+See also the file build_script_tests.txt in the working copy root.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build-scripts/utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,94 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#   Utility functions for use in build scripts.
+#
+
+import sys, os, subprocess, shutil, logging
+
+log = logging.getLogger()
+
+def run_command(cmd, env_overrides={}):
+    env = os.environ.copy()
+    for key, val in env_overrides.iteritems():
+        env[key] = val
+    
+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True, env=env)
+    out, err = p.communicate()
+    if p.returncode != 0:
+        log.error("Could not execute command (%s)" % cmd)
+        log.debug("Output:\n%s" % out)
+        return False
+    else:
+        return True
+
+def recreate_dir(path):
+    log.debug('recreate_dir(%s)' % path)
+    if os.path.exists(path):
+        for name in os.listdir(path):
+            p = os.path.join(path, name)
+            if os.path.isdir(p):    shutil.rmtree(p)
+            else:                   os.remove(p)
+    else:
+        os.makedirs(path)
+
+def build_egg(source_dir, target_dir):
+    """
+    Build an egg file from the given source directory (must contain a setup.py)
+    into the given target directory.
+    """
+    log.debug("Building egg from '%s'" % source_dir)
+    
+    orig_workdir = os.getcwd()
+    os.chdir(source_dir)
+    try:
+        cmd = 'python setup.py bdist_egg --dist-dir "%s"' % target_dir
+        return run_command(cmd)
+    finally:
+        os.chdir(orig_workdir)
+
+def copy_file(source_path, target_path):
+    log.debug("Copying '%s' -> '%s'" % (source_path, target_path))
+    target_dir = os.path.dirname(target_path)
+    if target_dir != '' and not os.path.exists(target_dir):
+        os.makedirs(target_dir)
+    shutil.copy2(source_path, target_path)
+
+def get_python_version():
+    """
+    Return the version of the Python that is run when the command 'python'
+    is run (not the Python where this script is executing).
+    """
+    p = subprocess.Popen('python -c "import sys; print sys.version[:3]"', stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+    out, err = p.communicate()
+    if p.returncode != 0:
+        log.critical("Failed to get python version")
+        log.critical("Command output: %s" % out)
+        return 1
+    
+    return out.strip()
+
+def setup_logging(logfile):
+    root_logger = logging.getLogger()
+    root_logger.setLevel(logging.DEBUG)
+    
+    console_handler = logging.StreamHandler()
+    console_handler.setLevel(logging.INFO)
+    console_handler.setFormatter(logging.Formatter('%(levelname)s - %(message)s'))    
+    root_logger.addHandler(console_handler)
+    
+    file_handler = logging.FileHandler(logfile, mode='w')
+    file_handler.setLevel(logging.DEBUG)
+    file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
+    root_logger.addHandler(file_handler)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,270 @@
+<!--****************************************************************************
+ * Configuration Engine (ConE) main build file
+ * This ant build.xml will build, install and test ConE and its plugins
+ ****************************************************************************-->
+<project name="ConE"
+         default="install">
+  <property file="common.properties" />
+  <property file="linux.properties" />
+  <property file="windows.properties" />
+  <property environment="env" />
+  <!--
+    Build properties, intended to be overridden from the command line
+    where necessary.
+
+    E.g. ant install -Dbuild.build_path=C:/my/install/path -Dbuild.plugin_package=symbian
+    -->
+  <property name="build.plugin_package"
+            value="common" />
+  <property name="build.base_path"
+            value="build" />
+  <property name="build.cone_install_path"
+            value="${build.base_path}/cone" />
+  <property name="build.bat_export_path"
+            value="${build.base_path}/bat" />
+  <property name="build.cone_pack_path"
+            value="${build.base_path}/dist" />
+  <property name="build.bat_pack_path"
+            value="${build.base_path}/dist" />
+  <property name="build.cone_install_path_abs"
+            location="${build.cone_install_path}" />
+  <property name="build.bat_export_path_abs"
+            location="${build.bat_export_path}" />
+  <property name="build.cone_pack_path_abs"
+            location="${build.cone_pack_path}" />
+  <property name="build.bat_pack_path_abs"
+            location="${build.bat_pack_path}" />
+  <property name="os.linux"
+            value="Linux" />
+  <property name="os.windows"
+            value="Windows 2003, Windows XP, Windows vista" />
+  <condition property="os_is_linux">
+    <os name="${os.linux}" />
+  </condition>
+  <target name="info">
+    <echoproperties />
+  </target>
+  <!-- Aliases -->
+  <target name="install"
+          depends="install-cone" />
+  <target name="develop"
+          depends="develop-cone" />
+  <target name="test"
+          depends="run-bat" />
+  <target name="doc"
+          depends="doc-all" />
+  <target name="clean">
+    <delete dir="${build.cone_install_path_abs}" />
+    <delete dir="${build.bat_export_path_abs}" />
+    <delete dir="${build.cone_pack_path_abs}" />
+    <delete dir="${build.bat_pack_path_abs}" />
+  </target>
+  <target name="svnversion">
+    <!--
+        Call the revision update script without the revision argument
+        so that the revision is reverted back to "" (this should make
+        it so that the working copy has no modifications and the
+        revision will be e.g. "1234" instead of "1234M".
+        -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+    <echo>Determine current working copy revision</echo>
+    <exec executable="svnversion"
+          failifexecutionfails="false">
+      <redirector outputproperty="svn.version" />
+    </exec>
+    <echo>SVN revision: ${svn.version}</echo>
+  </target>
+  <target name="svninitupdate"
+          depends="svnversion">
+    <echo>Update SVN revision in __init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+      <arg value="${svn.version}" />
+    </exec>
+  </target>
+  <target name="install-cone"
+          depends="svninitupdate">
+    <!--
+        <echo>$${build.cone_install_path}:     ${build.cone_install_path}</echo>
+        <echo>$${build.cone_install_path_abs}: ${build.cone_install_path_abs}</echo>
+        -->
+    <!-- Run the install script in build-scripts/ -->
+    <exec executable="python"
+          dir="${common.build_scripts_dir}"
+          failonerror="true">
+      <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+  </target>
+  <!--
+    Target for installing ConE so that it supports two Python versions.
+    
+    Depends on two properties: build.dualversioninstall.path1 and
+    build.dualversioninstall.path2 that must be set to the values of the PATH
+    environment that contains the locations of the two Python installations.
+    -->
+  <target name="install-cone-dualversion"
+          depends="svninitupdate">
+    <!-- Run the install script using the first Python version-->
+    <echo>Installing with first Python version (PATH=${build.dualversioninstall.path1})</echo>
+    <exec executable="python"
+          dir="${common.build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${build.dualversioninstall.path1}" />
+      <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"' />
+    </exec>
+    <!-- Run the install script using the second Python version-->
+    <echo>Installing with second Python version (PATH=${build.dualversioninstall.path2})</echo>
+    <exec executable="python"
+          dir="${common.build_scripts_dir}"
+          failonerror="true">
+      <env key="PATH"
+           value="${build.dualversioninstall.path2}" />
+      <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}"' />
+    </exec>
+    <!-- Revert the SVN revision so that it doesn't mark the working copy as modified needlessly -->
+    <echo>Revert SVN revision in source/cone/__init__.py</echo>
+    <exec executable="python">
+      <arg value="update_svn_revision.py" />
+      <arg value="source/cone/__init__.py" />
+    </exec>
+  </target>
+  <target name="develop-cone">
+    <!-- Run the install script in build-scripts/ -->
+    <exec executable="python"
+          dir="${common.build_scripts_dir}"
+          failonerror="true">
+      <arg line='install_cone.py --target-dir="${build.cone_install_path_abs}" --plugin-package="${build.plugin_package}" --install-type develop' />
+    </exec>
+  </target>
+  <!--
+    Internal pack target for packing the ConE installation.
+    The actual dependencies to cone-install and cone-install-dualversion are
+    specified in the actual targets below.
+    -->
+  <target name="_pack">
+    <!--
+        <echo>$${build.cone_pack_path}:     ${build.cone_pack_path}</echo>
+        <echo>$${build.cone_pack_path_abs}: ${build.cone_pack_path_abs}</echo>
+        -->
+    <echo message="Creating zip file" />
+    <mkdir dir="${build.cone_pack_path_abs}" />
+    <tstamp>
+      <format property="lastbuild"
+              pattern="yyyyMMddHHmmss" />
+    </tstamp>
+    <zip destfile="${build.cone_pack_path_abs}/ConE-${common.version}-${build.plugin_package}-${lastbuild}-${svn.version}.zip">
+      <fileset dir="${build.cone_install_path_abs}" />
+    </zip>
+  </target>
+  <!-- Actual pack targets -->
+  <target name="pack"
+          depends="install-cone">
+    <antcall target="_pack" />
+  </target>
+  <target name="pack-dualversion"
+          depends="install-cone-dualversion">
+    <antcall target="_pack" />
+  </target>
+  <target name="export-bat">
+    <!--
+        <echo>$${build.bat_export_path}:     ${build.bat_export_path}</echo>
+        <echo>$${build.bat_export_path_abs}: ${build.bat_export_path_abs}</echo>
+        -->
+    <!-- Run the export script in build-scripts/ -->
+    <exec executable="python"
+          dir="${common.build_scripts_dir}"
+          failonerror="true">
+      <arg value="export_bat.py" />
+      <arg value='--target-dir="${build.bat_export_path_abs}"' />
+      <arg value='--plugin-package="${build.plugin_package}"' />
+    </exec>
+  </target>
+  <target name="pack-bat"
+          depends="export-bat">
+    <echo message="Creating zip file" />
+    <mkdir dir="${build.bat_pack_path_abs}" />
+    <zip destfile="${build.bat_pack_path_abs}/ConE-BAT-${build.plugin_package}.zip">
+      <fileset dir="${build.bat_export_path_abs}" />
+    </zip>
+  </target>
+  <target name="run-bat"
+          depends="install-cone,export-bat">
+    <echo message="Moving ConE installation under BAT..." />
+    <move todir="${build.bat_export_path_abs}/cone">
+      <fileset dir="${build.cone_install_path_abs}" />
+    </move>
+    <echo message="Running tests..." />
+    <exec executable="python"
+          dir="${build.bat_export_path_abs}">
+      <arg value="runtests.py" />
+    </exec>
+  </target>
+  <target name="run-all-tests">
+    <echo message="Run all tests" />
+    <echo message="OS: ${os.name}" />
+    <echo message="Python version: ${pythonversion}" />
+    <subant buildpath="."
+            target="run-all-tests-linux" />
+    <subant buildpath="."
+            target="run-all-tests-windows" />
+  </target>
+  <target name="run-all-tests-linux"
+          if="os_is_linux">
+    <echo message="Change Python version" />
+    <echo message="ln -s -f /usr/bin/${pythonversion} ${os.linux.userbin}/python" />
+    <exec executable="ln">
+      <arg value="-s" />
+      <arg value="-f" />
+      <arg value="/usr/bin/${pythonversion}" />
+      <arg value="${os.linux.userbin}/python" />
+    </exec>
+    <echo message="Python version:" />
+    <exec executable="sh"
+          dir="./source">
+      <env key="PATH"
+           path="${os.linux.userbin}:${env.PATH}" />
+      <arg value="-c" />
+      <arg value="python --version" />
+    </exec>
+    <echo message="Run tests" />
+    <exec executable="sh"
+          dir="./source">
+      <env key="PATH"
+           path="${os.linux.userbin}:${env.PATH}" />
+      <arg value="-c" />
+      <arg value="python runtests.py --with-nose" />
+    </exec>
+  </target>
+  <target name="run-all-tests-windows"
+          unless="os_is_linux">
+    <echo message="Change Python version" />
+    <echo message="Python version:" />
+    <exec executable="cmd">
+      <env key="PATH"
+           path="${os.windows.pythonlocationbase}${pythonversion};${os.windows.pythonlocationbase}${pythonversion}/Scripts;${env.PATH}" />
+      <arg value="/c" />
+      <arg value="python --version" />
+    </exec>
+    <echo message="Run tests" />
+    <exec executable="cmd"
+          dir="./source">
+      <env key="PATH"
+           path="${os.windows.pythonlocationbase}${pythonversion};${os.windows.pythonlocationbase}${pythonversion}/Scripts;${env.PATH}" />
+      <arg value="/c" />
+      <arg value="python runtests.py --with-nose" />
+    </exec>
+  </target>
+  <import file="generatedoc-build.xml" />
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/build_script_tests.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+If you make changes to build-scripts/ build.xml, the related .cmd files or
+anything else that may affect the build process, you should run the following
+commands to check that everything works:
+
+install C:/cone-build-script-test/install_none
+install C:/cone-build-script-test/install_symbian symbian
+
+clean_pack C:/cone-build-script-test/clean_pack_none
+clean_pack C:/cone-build-script-test/clean_pack_symbian symbian
+
+pack C:/cone-build-script-test/clean_pack_none
+pack C:/cone-build-script-test/clean_pack_symbian symbian
+
+develop C:/cone-build-script-test/develop_none
+develop C:/cone-build-script-test/develop_symbian symbian
+
+export_bat C:/cone-build-script-test/export_bat_none
+export_bat C:/cone-build-script-test/export_bat_symbian symbian
+
+pack_bat C:/cone-build-script-test/pack_bat_none
+pack_bat C:/cone-build-script-test/pack_bat_symbian symbian
+
+ant test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/clean_pack.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant clean -Dbuild.cone_pack_path=%1
+call ant pack -Dbuild.cone_pack_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/common.properties	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<!--****************************************************************************
+ * ConE common properties for building and testing
+ *
+ ****************************************************************************-->
+
+# ConE version that is added to the produced ZIP file
+common.version = 1.1
+
+common.build_scripts_dir = build-scripts
+
+document.output        =docbuild
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/changelog	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+python-cone (1.1.0-0) UNRELEASED; urgency=low
+
+  * Follow upstream versioning
+  * Update packaging to build also source/scripts
+  * Linux/Unix compatibility fixes
+
+ -- Jari Tenhunen <jari.tenhunen@nokia.com>  Thu, 23 Jul 2009 14:05:25 +0300
+
+python-cone (0.1-1) unstable; urgency=low
+
+  * Initial release
+
+ -- Zoltan Andrasi <zoltan.andrasi@nokia.com>  Thu, 11 Dec 2008 11:57:50 +0200
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/compat	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/cone-tool.install	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+usr/bin/cone*.py
+usr/bin/*.cfg etc/cone
+usr/lib/python*/site-packages/cone_scripts-*.egg-info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/cone-tool.links	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+usr/bin/cone_tool.py usr/bin/cone
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/control	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+Source: python-cone
+Section: python
+Priority: extra
+Maintainer: Jari Tenhunen <jari.tenhunen@nokia.com>
+Build-Depends: debhelper (>= 5), python (>=2.4), python-central, python-setuptools
+Standards-Version: 3.7.2
+XS-Python-Version: >= 2.4
+Homepage: http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware
+
+Package: python-cone
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>= 2.4), python-simplejson
+XB-Python-Version: ${python:Versions}
+Description: Configuration Engine python modules
+ Configuration Engine is a Python implementation for a common configuration 
+ tool. This tool implements support for the confml language and Configuration 
+ Project structure.
+ This package contains the python modules for cone.
+
+Package: cone-tool
+Architecture: all
+Depends: ${shlibs:Depends}, ${misc:Depends}, ${python:Depends}, python (>= 2.4), python-cone
+XB-Python-Version: ${python:Versions}
+Description: Configuration Engine command line tool
+ Configuration Engine is a Python implementation for a common configuration 
+ tool. This tool implements support for the confml language and Configuration 
+ Project structure.
+ This package contains the cone executable command line tool.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/copyright	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+This package was debianized by Zoltan Andrasi <zoltan.andrasi@nokia.com> on
+Thu, 11 Dec 2008 11:57:50 +0200.
+
+It was downloaded from http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware
+
+Upstream Author(s):
+
+    Teemu Rytkonen <teemu.rytkonen@nokia.com>
+
+Copyright:
+
+    Copyright (C) 2008 Nokia Corporation
+
+License:
+
+    Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+    All rights reserved.
+    This component and the accompanying materials are made available
+    under the terms of "Eclipse Public License v1.0"
+    which accompanies this distribution, and is available
+    at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+The Debian packaging is (C) 2008, Zoltan Andrasi <zoltan.andrasi@nokia.com>.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/python-cone.install	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+usr/lib/python*/site-packages/cone
+usr/lib/python*/site-packages/cone-*.egg-info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/debian/rules	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,84 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+PYVERS=$(shell pyversions -vr)
+
+CONE_SOURCES=source source/scripts
+
+build: build-stamp
+
+build-stamp:
+	dh_testdir
+
+	# Add here commands to compile the package.
+	#docbook-to-man debian/cone.sgml > cone.1
+	for i in $(CONE_SOURCES); do cd $(CURDIR)/$$i && python setup.py build; done
+	cd $(CURDIR)
+	touch $@
+
+clean: 
+	dh_testdir
+	dh_testroot
+	rm -f build-stamp
+	# Add here commands to clean up after the build process.
+	dh_clean 
+
+install: build
+	dh_testdir
+	dh_testroot
+	dh_clean -k 
+	dh_installdirs
+	# Add here commands to install the package into debian/cone.
+	#$(MAKE) DESTDIR=$(CURDIR)/debian/cone install
+	for i in $(CONE_SOURCES); do cd $(CURDIR)/$$i && python setup.py install --root=$(CURDIR)/debian/tmp; done
+	cd $(CURDIR)
+	dh_install --sourcedir=debian/tmp
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+	dh_testdir
+	dh_testroot
+	dh_installchangelogs 
+	dh_installdocs
+	dh_installexamples
+#	dh_installmenu
+#	dh_installdebconf	
+#	dh_installlogrotate
+#	dh_installemacsen
+#	dh_installpam
+#	dh_installmime
+#	dh_python
+#	dh_installinit
+#	dh_installcron
+#	dh_installinfo
+#	dh_installman
+	dh_link
+#	dh_strip
+	dh_pycentral
+#	dh_install
+	dh_compress -X.py
+	dh_fixperms
+#	dh_perl
+#	dh_makeshlibs
+	dh_installdeb
+#	dh_shlibdeps
+	dh_gencontrol
+	dh_md5sums
+	dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install
Binary file configurationengine/dep-eggs/Jinja2-2.1.1-py2.5-win32.egg has changed
Binary file configurationengine/dep-eggs/Jinja2-2.1.1-py2.6-win32.egg has changed
Binary file configurationengine/dep-eggs/lxml-2.2.2-py2.5-win32.egg has changed
Binary file configurationengine/dep-eggs/lxml-2.2.2-py2.6-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/dep-eggs/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+This directory contains all library dependencies needed by ConE as egg files.
+
+Note that if a plug-in requires a library not used in ConE core, the egg
+should not be added here, but in source/plugins/<plugin-package>/dep-eggs/.
+This way the egg will not be installed unless the plug-in package requiring
+it is installed.
Binary file configurationengine/dep-eggs/setuptools-0.6c11-py2.5.egg has changed
Binary file configurationengine/dep-eggs/setuptools-0.6c11-py2.6.egg has changed
Binary file configurationengine/dep-eggs/simplejson-2.0.9-py2.5-win32.egg has changed
Binary file configurationengine/dep-eggs/simplejson-2.0.9-py2.6-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/develop.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant develop -Dbuild.cone_install_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/api/api.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+Cone API
+========
+The Cone API consists of submodules that contain the actual api implementations. The modules are splitted according to the purpose of use. 
+* public api is the main public interface that Cone offers.
+* plugin api is the interface which defines all plugin extension base classes and a general plugin framework.
+
+modules:
+
+.. toctree::
+
+    public
+    plugin
+    howto
Binary file configurationengine/doc/api/cone_plugin_api.png has changed
Binary file configurationengine/doc/api/cone_public_api.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/api/howto.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,293 @@
+How to use cone APIs
+====================
+
+The ConE public usage is described here with few common use cases as HowTo guides. 
+
+How to open a Configuration project
+-----------------------------------
+
+To open a project with ConE the api offers a Storage and Project classes. The Storage is the storage 
+agostic implemenetation for cpf/zip, filestorage and soon also a webstorage. To access anything in ConE 
+you must a project open. 
+
+.. code-block:: python 
+
+    from cone.public import api,exceptions
+    """ 
+    The Storage access can be given as a extra parameter. It can have values r=read|w=write|a=append. 
+    The default Storage access is read, which will fail if the storage does not exist.
+    
+    The Storage.open method will try which of the storage implementations can open that particular path.
+    So for example the path can be 
+    'foo/bar'  => Opened with FileStorage
+    'test.cpf' => Opened with ZipStorage
+    'test.zip' => Opened with ZipStorage 
+    """
+    
+    """ Open a storage to current path and give it to the project. """
+    prj = api.Project(api.Storage.open('.'))
+    """ Create a new storage to a cpf file and give it to the project. """
+    prj = api.Project(api.Storage.open('test.cpf', 'w'))
+
+
+How to access and manipulate Configurations
+-------------------------------------------
+
+A Configuration normally is presented inside the Configuration project as a .confml file. So when you
+are accessing configurations your are actually accessing confml files. The project offers funtionality to 
+get,add, remove configurations, which acts on root configurations inside the given project.
+
+How to List configuration's
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+.. code-block:: python 
+
+    from cone.public import api,exceptions
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ list and print all root configurations  """
+    configlist = prj.list_configurations()
+    for config in configlist:
+        print config
+
+How to Open configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+
+.. code-block:: python 
+
+    from cone.public import api,exceptions
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open a with name """
+    """ 
+    get_configuration raises a NotFound exception if the given configuration resource 
+    is not found from Storage
+    """
+    try:
+        myconfig = prj.get_configuration('myconfig.confml')
+    except exceptions.NotFound:
+        print "myconfml is not found from project!"
+
+How to remove Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To remove a Configuration call  ``remove_configuration`` method of Configuration.
+
+.. code-block:: python
+
+    myconfig = prj.get_configuration('myconfig.confml')
+    myconfig.remove_configuration('my_remove.confml')
+    """ finally save and close project """
+    prj.save()
+    prj.close()
+
+How to include a one Configuration to an other Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To include a one Configuration to an other call ``include_configuration()`` method of Configuration and pass the filename of Configuration as a parameter.
+
+.. code-block:: python
+
+    myconfig = prj.get_configuration('myconfig.confml')
+    myconfig.include_configuration('../data.confml')
+
+Feature Access and manipulation
+-------------------------------
+
+How to add a Feature to Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To add a Feature to Configuration ``add_feature()`` method can be used.
+
+.. code-block:: python
+
+    conf = api.Configuration("myconf.confml")
+    conf.add_feature(api.Feature("feature1"))
+
+How to add a child Feature to Feature
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Childs can be added under Feature by ``add_feature()`` method and passing the parent Feature as a second paremeter:
+
+.. code-block:: python
+
+    conf = api.Configuration("myconf.confml")
+    conf.add_feature(api.Feature("feature1"))
+    conf.add_feature(api.Feature("feature11"),'feature1')
+
+How to remove Feature from Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Features can be removed from Configuration by a following way:
+
+.. code-block:: python
+
+    conf1 = api.Configuration("myconf.confml")
+    conf1.add_feature('feature1.feature12') # Add feature to Configuration
+    conf1.remove_feature('feature1.feature12') # and then remove it
+    """ finally save and close project """
+    prj.save()
+    prj.close()
+
+
+How to get a Feature from Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Features can be accessed through View:
+
+.. code-block:: python
+
+    from cone.public import api
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open the first configuration from the list """
+    firstconfig = prj.get_configuration(configlist[0])
+    """ get default view of first configuration """
+    default_view = firstconfig.get_default_view()
+    """ fetch example_feature1 from default view """
+    feature = default_view.get_feature('example_feature1')
+
+Feature can be accessed also by a property:
+
+.. code-block:: python
+
+    from cone.public import api
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open the first configuration from the list """
+    firstconfig = prj.get_configuration(configlist[0])
+    """ get default view of first configuration """
+    default_view = firstconfig.get_default_view()
+    """ fetch example_feature1 from default view """
+    feature = default_view.example_feature1
+
+How to list all Features inside a certain View
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+All Features can listed by calling ``list_all_features()`` method of View. Default view returns always 
+the view from the Root configuration point of view.
+
+.. code-block:: python
+
+    from cone.public import api
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open the first configuration from the list """
+    firstconfig = prj.get_configuration(configlist[0])
+    """ get default view of first configuration """
+    default_view = firstconfig.get_default_view()
+    """ get all features in list from default view """
+    features = default_view.list_all_features()
+
+All features can be listed also using some custom View:
+
+.. code-block:: python
+
+    from cone.public import api
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open the first configuration from the list """
+    firstconfig = prj.get_configuration(configlist[0])
+    """ get my_view view to first configuration """
+    view = firstconfig.get_view("my_view")
+    """ fetch example_feature1 from my_view view """
+    features = view.list_all_features()
+
+How to list Features inside a certain View
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To list immediate Features found under the certain View can be done by calling ``list_features()`` method.
+
+.. code-block:: python
+
+    myconfig = api.Configuration("root.confml")
+    view = myconfig.get_view("my_view")
+    features = view.list_features()
+
+How to list all Features inside a certain Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To list all Features found under a certain Configuration can be done by calling ``list_all_features()`` method of Configuration.
+
+.. code-block:: python
+
+    from cone.public import api
+    """ Create a storage to current path and give it to the project """
+    prj = api.Project(api.Storage.open('.'))
+    """ open the first configuration from the list """
+    firstconfig = prj.get_configuration(configlist[0])
+    """ get all features in list from configuration """
+    features = firstconfig.list_all_features()
+
+How to read a value for a specific Feature
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The a value of specific Feature can be read by calling ``get_value()`` method or using value property.
+
+.. code-block:: python
+
+    value1 = my_feature1.get_value()
+    value2 = my_feature2.value
+
+How to read a possible options of selection Feature
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To list possible options of selection Feature can be done by calling ``get_valueset()`` method of Feature.
+
+.. code-block:: python
+
+    feature = api.Feature('my_selection_feature',type='selection')
+    feature.add_option('one', '1')
+    feature.add_option('two', '2')
+    value_set = feature.get_valueset()
+    feature.get_option('1').get_name() #returns  'one'
+
+How to read a type of specific Feature
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To read a specific type on Feature ``get_type()`` method or type property can be used. 
+
+.. code-block:: python
+
+    feature = dview.get_feature('my_feature')
+    feature.get_type() # returns type of the Feature
+    feature.type # returns type of the Feature
+
+How to set a value for a specific Feature
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To set value for a specific Feature can be done by calling ``set_value()`` method or ``value`` property.
+
+.. code-block:: python
+
+    feature1 = dview.get_feature('my_feature1')
+    feature2 = dview.get_feature('my_feature2')
+    feature1.set_value(123)
+    feature2.value = "my_value"
+    """ finally save and close project """
+    prj.save()
+    prj.close()
+
+Data access and manipulation
+----------------------------
+The data access inside a configuration is possible, but basically this can be avoided by manipulating the values 
+of features, which actually modify the data elements inside the configuration.
+However if direct data element access is needed, here's how you can do it.
+
+How to add Data to Configuration
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+To add Data to Configuration can be done by calling ``add_data()`` method of Configuration: 
+
+.. code-block:: python
+
+    conf = api.Configuration("data.confml")
+    conf.add_data(api.Data(ref='feature1', value=123))
+    conf.add_data(api.Data(fqn='feature1.feature12', value="test"))
+    """ finally save and close project """
+    prj.save()
+    prj.close()
+    
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/api/plugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,91 @@
+Plugin API
+===============
+
+.. module:: cone.public.plugin
+   :platform: Unix, Windows
+   :synopsis: Configuration interface.
+.. moduleauthor:: Teemu Rytkonen <teemu.rytkonen@nokia.com>
+
+The Plugin api is intended for extending the ConE functionality with plugins that can be for example 
+implementation or relation plugins. See :ref:`plugin-howto`
+
+.. image:: cone_plugin_api.png
+
+Classes
+-------
+
+.. class:: ImplBase(ref, configuration)
+
+The ImplBase class is intended for deriving any implementation plugin in ConE. A single ImplBase 
+instance is created by ConE for each implml file inside a given Configuration. 
+
+See :ref:`plugin-howto`
+ 
+    .. method:: list_output_files()
+  
+    The list_output_files should return a list of output files with path, with the current configuration.
+    This mechanism should enable listing of all output files before without actually generating them.
+
+    .. method:: generate()
+  
+    The plugin instance is supposed to generate its output with the call of generate(). 
+
+    .. method:: has_ref(refs)
+  
+    This method receives a list as an attribute and is supposed to return True|False. True if this 
+    particular plugin instance has a reference to a Feature inside the given refs list. Otherwise False. 
+
+.. class:: ImplSet
+
+The ImplSet is a sets.Set object for a set of ImplBase instances. The main purpose of ImplSet 
+is to allow operations to a set of ImplBase instances, such as generate, filter, etc. 
+
+.. class:: ImplFactory
+
+ImplFactory is a constructor class for the plugin instances.
+
+    .. method:: get_impl_by_ext(cls, ext)
+  
+    Get the class name by file extension. 
+    
+
+    .. method:: get_impl_by_filename(cls, ref, configuration)
+
+    Get the class name by filename.
+
+.. class:: Relation(left, right)
+
+    .. method:: execute()
+  
+    Executes the rule initiated for this Relation.
+
+
+	Relation is a base class for all Relation implementations. The purpose of a Relation instance is to offer a verb or an 
+	action that can be used in a rule. A rule in this context means a textual relation between two or more :class:`Feature`'s.
+	For example a Depends class could be used to define dependencies between two :class:`Feature`
+  
+	::
+	
+		example rule
+	  	A depends B
+	
+	Where A and B are :class:`Feature` references.
+
+.. class:: RelationContainer
+	
+	RelationContainer is a container object that derives Relation interface, but is meant for storing a set of :class:`Relation`
+	objects. It can be used to execute a set of rules read to the container.
+
+.. class:: RelationFactory
+
+    .. method:: get_by_name(name)
+  
+    returns a :class:`Relation` if the class that matches the name is found. 
+
+	The RelationFactory is intended to be used when the rules are read from some persistent storage. When a rule is found from 
+	:class:`Configuration` ConE will try to create a :class:`Relation` instance of the rule, by trying to get class 
+	by :meth:`RelationFactory.get_by_name` and create an instance of that class.
+	
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/api/public.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,147 @@
+Public API
+**********
+Cone public API is the main interface of Cone.
+
+.. image:: cone_public_api.png
+
+
+.. module:: cone.public.api
+   :platform: Unix, Windows
+   :synopsis: Configuration interface.
+.. moduleauthor:: Teemu Rytkonen <teemu.rytkonen@nokia.com>
+
+Classes
+-------
+.. class:: ObjectContainer
+
+	ObjectContainer is a base class for all Configuration related elements. It is container class for a tree structure, 
+	where it can contain other ObjectContainer objects. So basically you can create B-tree type of hiararchy with it. 
+	
+	The main functionality of ObjectContainer is that **all children of an object container are accessible as members** 
+	of the container.
+	
+	.. _example_member_access:
+	
+	Example of ObjectContainer member access:
+	
+	``objcontainer.configuration.get_name()``
+	
+
+	.. method:: _add(child)
+	
+	Add a ObjectContainer instance to this object. Checks with internal function :meth:`__supported_type__` if the given 
+	child is a supported class for this object.
+	
+	.. method:: _add_to_path(path,child)
+	
+	Add a ObjectContainer instance to a specific node under this object. It creates any missing nodes between this object 
+	and the path. For example __add_to_path__("foo.fii", obj), would create two nodes (foo and under it fii) if they are 
+	missing (Uses internal :meth:`__default_class__` to retrieve the class which is created in this case). 
+	
+	.. method:: _remove(path)
+	
+	Remove a child from given path.
+	
+	.. method:: _get(path)
+	
+	get a child from given path.
+	
+	.. method:: _list()
+	
+	Get a list of names of immediate children of this ObjectContainer instance.
+	
+	.. method:: _objects()
+	
+	Get a list of immediate children objects of this ObjectContainer instance.
+	
+	.. method:: _traverse(filters)
+	
+	Get a list of children objects of this ObjectContainer instance, by filtering them with filters. This will cause a 
+	recursive _traverse method call to all children of the ObjectContainer.
+	
+	.. method:: _path(toparent=None)
+	
+	Return the path to this object up to the toparent object. When toparent=None this will 
+	return a full path to the object in the ObjectContainer hierarhcy.
+	
+	.. method:: _supported_type(obj)
+	
+	A method that is supposed to be overridden by the deriving classed if they need to change, which classes can be added 
+	under each class. 
+	Return True if the type of the obj is supported.
+	
+	.. method:: _default_class(obj)
+	
+	A method that is supposed to be overridden by the deriving classed if they need to change, what class is 
+	the default class that is created with __add_to_path__ when objects are missing.
+	Return a class.
+
+  
+.. class:: Base
+
+	Base class for all :class:`~cone.public.api.Configuration` and its child objects. 
+  
+	.. method:: get_ref()
+	
+	return the ref of this object.
+	
+	.. method:: get_namepace()
+	
+	return the namespace of this object.
+	
+.. class:: Project
+
+	Project is a container for Configuration's.
+
+.. class:: Configuration
+  
+	ConE Configuration is the main interface for all configuration related activities. It is the main interface of ConE 
+	itself as ConE is eventually a python interface to a configuration project. 
+	 
+Configuration as a Container
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+	    
+	The Configuration instance itself in ConE is actually just a container for a bunch of different elements. These elements can practically be any elements that exist in a 
+	Configuration Project. 
+	
+	* :class:`~cone.public.api.Configuration` 
+	* :class:`~cone.public.api.View`
+	* :class:`~cone.public.api.Feature` 
+	* :class:`~cone.public.api.Resource` 
+	* :class:`~cone.public.plugin.Relation` 
+	* :class:`~cone.public.api.Data` 
+  
+.. class:: Feature
+	    
+	Feature element is the base class for any Configurable item in a Configuration Project.
+
+.. class:: View
+
+	A :class:`~cone.public.api.Configuration` can contain one or more View elements, which basically can define different type of tree structure of Feature elements that exist in the Configuration.
+	A View element can contain :class:`~cone.public.api.Group` and :class:`FeaturePoxy` elements.
+
+.. class:: Group
+
+	Group element can be child element of a :class:`~View`. It can include other Groups and :class:`~FeaturePoxy` elements to define a View hierarhcy.
+
+.. class:: FeatureProxy
+    
+	FeatureProxy element is a linking object inside View that has its own ref, name, etc but it basically just 
+	points to an actual :class:`Feature` instance.
+
+.. class:: Data
+
+	Data element defines a data value for a :class:`Feature` element. The Data elements can be defined in a 
+	:class:`Configuration` and single configurable :class:`Feature` can have multiple data definitions, in different 
+	configurations. The new definition always overrides the previous one. However the entire data definition hierarchy 
+	is stored and is available from the Cone API.
+	
+.. class:: Storage
+
+	Storage offers platform and persistence independent interface to store :class:`Resource` elements (data files, 
+	configuration files, etc).
+
+.. class:: Resource
+	
+	Resource is an instance of single storable element. Basically on normal filesystem this would be same as one file.
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/changelog.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,856 @@
+ChangeLog 09-Feb-2009
+=====================
+
+Revision: 481
+-------------
+Author: teerytko
+Date: 13:01:30, 09 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+-Updated api version 0.5.0
+
+Modified : /branches/singleconfiguration/source/cone/__init__.py
+
+
+Revision: 480
+-------------
+Author: teerytko
+Date: 13:01:03, 09 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Updated documentation. 
+ -Version
+ -Fixed the error in install instructions.
+
+Modified : /branches/singleconfiguration/doc/conf.py
+Modified : /branches/singleconfiguration/doc/design/cone.mdl
+Modified : /branches/singleconfiguration/doc/intro.rst
+
+
+Revision: 479
+-------------
+Author: teerytko
+Date: 12:38:48, 09 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+-Added a test case to access all features via default_view.
+-Fixed a minor bug in adding data to the default_view (if feature is not found)
+
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration.py
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+
+
+Revision: 478
+-------------
+Author: teerytko
+Date: 21:36:52, 08 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+All functionality in place for the single configurationbranch. 
+
+Modified : /branches/singleconfiguration/source/cone/confml/model.py
+Modified : /branches/singleconfiguration/source/cone/confml/persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/__init__.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_model.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/exported.zip
+Modified : /branches/singleconfiguration/source/cone/core/tests/imported.zip
+Added : /branches/singleconfiguration/source/cone/core/tests/project
+Added : /branches/singleconfiguration/source/cone/core/tests/project/.metadata
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/confml/aknfep.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/confml/messaging.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/confml/siprfsplugin.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/content/file.txt
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_001/root.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/commsdatcreator.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/drm5.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/helix.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/implml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/mediaplayer.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/mpxmusicplayer.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/confml/xmluifw.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_002/root.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml/coreapplicationuis.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/confml/implml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/implml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/gadget_wk32_003/root.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/root.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/BrowserSettings.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/CarbideV_default_access_point.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/CarbideV_startup.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/DefaultAccessPoint.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/FMRadioEngine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledAACTones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledBookmarks.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledContacts.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledContent.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledImages.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledMP3Tones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledMonophonicTones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledMusic.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledObjectsToPhotos.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledPolyphonicTones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledStreamingLinksGallery.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledTrueTones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledVideos.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/PreInstalledWMATones.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/accessoryserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/accesspoints.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/activeidle.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/activeidle2.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/aknfep.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/aknskins.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/application_management.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/audioequalizerutility.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/autolock.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/avkon.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/bluetoothgpspsy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/browserui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/bteng.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/calendarUI.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/callui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/camcorder.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/cbsserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/cenrep_iby_configuration.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/clockapp.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/commonengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/commonui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/connectiondialogs.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/contextframework.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/coreapplicationuis.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/ctsy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/dcl.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/defaultproxy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/devman.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/dlmgr.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/drm5.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/drmrightsmanager.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/drmsettings.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/enhancedmediaclient.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/environmentalreverbutility.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/featuremanager.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/flashlite_2_0.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/fmpresetutility.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/fotaadapter.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/fotadiskstorage.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/fotaserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/gennif.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/helix.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/httpcachemanager.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/httpfilterHttpFilterPipeliningConfig.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/httpfilteracceptheader.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/hwresourceclientfmtx.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/hwresourcesandenhancements.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/ibytest.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/icts.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/imagingconfigmanager.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/imum.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/j2me.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/javainstaller.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/javaruntime.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/landmarks.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/locationsettings.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/locationsuplfw.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/lock.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/locnotprefplugin.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/locsuplsettings.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/logs.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/mediaplayer.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/messaging.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/metadatautility.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/midp.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/mmsengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/mobilemedia.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/mtp.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/multimediasharing.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/musicplayer.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/newsticker.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/npppsy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/nsmldmsync.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/nsmlemailadapter.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/nsmlhttp.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/numbergrouping.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/omasuplconfigparam.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/operator_logo.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/operatormenu.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/pdpcontextmanager2.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/phonebook2.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/pnpms.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/poc.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/pocui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/pocuiintgr.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/policy_management.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/postcard.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/presenceengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/profilesengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/psmserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/pushmtm.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/remote_storage_fw.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/remotelock.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60appshell.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60contentlistingframework.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60filemanager.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60icalui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60imageviewer.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60impscommonui_ng.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60instant_messaging_ui_ng.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60mail.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60mediagallery2.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60ncnlist.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60provisioning.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60settingsuis.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60swinstalleruis.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60telephony.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60uiacceltk.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/s60videotelephony.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sat.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/screensaver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/screensaveranimplugin.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/scutplugin.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sendui.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sensor.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sensorframework.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sensorplugin.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/simple.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/simulationpsy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/speeddial.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/srsf.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/startup.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/stereowideningutility.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/suplpsy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/suplsettings.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/syncmlnotifier.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/sysutil.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/tfxserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/theme.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/themes.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/uiklaf.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/upnpmediaserver.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/upnpstack.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/usbengines.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/variant.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/vcommand.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/videoservices.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/voicemailbox.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/voicerecorder.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/webutils.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/widgetinstaller.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/wlanengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/wvengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/wvsettings20.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/xdmengine.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/confml/xmluifw.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/applications_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/connectivity_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/hardware_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/other_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/preinstalledcontent_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/system_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/s60_3_43_wk32/doc/userinterface_48_nav.png
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/data.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/implml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/second_view.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/confml/variant_view.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/content
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/doc
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/doc/.notes
+Added : /branches/singleconfiguration/source/cone/core/tests/project/variant_3_23_wk32/root.confml
+Modified : /branches/singleconfiguration/source/cone/core/tests/project.zip
+Modified : /branches/singleconfiguration/source/cone/core/tests/tempproject/dummy2.confml
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_export.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_import.py
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_base.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_configuration.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_data.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_feature.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_layer.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_options.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_utils.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_valueset.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_views.py
+Modified : /branches/singleconfiguration/source/cone/public/utils.py
+Modified : /branches/singleconfiguration/source/cone/storage/filestorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/persistentdictionary.py
+Modified : /branches/singleconfiguration/source/cone/storage/stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/data.zip
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_fileresource.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage_layer.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage_with_configurations.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipstorage_with_configurations.py
+Modified : /branches/singleconfiguration/source/cone/storage/zipstorage.py
+
+
+Revision: 477
+-------------
+Author: teerytko
+Date: 15:27:20, 08 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testread.txt
+
+
+Revision: 476
+-------------
+Author: teerytko
+Date: 14:40:02, 08 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Removed temp test files that were accidentally added.
+
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/confml
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/content
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/doc
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/implml
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/doc
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/implml
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/prodX/doc
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/prodX/implml
+
+
+Revision: 475
+-------------
+Author: teerytko
+Date: 14:51:35, 06 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Removed temp test files that were accidentally added.
+
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/TestProlog.zip
+Modified : /branches/singleconfiguration/source/cone/storage/tests/data.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/dummytest
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/foo
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/temp
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testdelete.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testfolder
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testnewfile.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testnonrecurse.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testoverwrite.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testrecurse.zip
+Deleted : /branches/singleconfiguration/source/cone/storage/tests/testtemp.zip
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipstorage_with_configurations.py
+Modified : /branches/singleconfiguration/source/cone/storage/zipstorage.py
+
+
+Revision: 474
+-------------
+Author: teerytko
+Date: 14:50:57, 06 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Removed temp test files that were accidentally added.
+
+Deleted : /branches/singleconfiguration/source/cone/tests/dummytest
+Deleted : /branches/singleconfiguration/source/cone/tests/exported.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/temp
+Deleted : /branches/singleconfiguration/source/cone/tests/tempproject
+Deleted : /branches/singleconfiguration/source/cone/tests/tempzipoutput
+Deleted : /branches/singleconfiguration/source/cone/tests/testdelete.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/testfolder
+Deleted : /branches/singleconfiguration/source/cone/tests/testnewfile.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/testnonrecurse.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/testoverwrite.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/testrecurse.zip
+Deleted : /branches/singleconfiguration/source/cone/tests/testtemp.zip
+
+
+Revision: 473
+-------------
+Author: teerytko
+Date: 14:42:22, 06 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Major merge efforts. Problems still with ZipStorage regression.
+
+Modified : /branches/singleconfiguration/source/cone/confml/model.py
+Modified : /branches/singleconfiguration/source/cone/confml/persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/core/__init__.py
+Deleted : /branches/singleconfiguration/source/cone/core/configuration.py
+Deleted : /branches/singleconfiguration/source/cone/core/layer.py
+Deleted : /branches/singleconfiguration/source/cone/core/model.py
+Deleted : /branches/singleconfiguration/source/cone/core/project.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/__init__.py
+Added : /branches/singleconfiguration/source/cone/core/tests/exported.zip
+Added : /branches/singleconfiguration/source/cone/core/tests/imported.zip
+Added : /branches/singleconfiguration/source/cone/core/tests/temp
+Added : /branches/singleconfiguration/source/cone/core/tests/temp2.zip
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/.metadata
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/dummy.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/dummy2.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/remove.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path/to
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path/to/elsewhere
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path/to/elsewhere/r.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path/to/somewhere
+Added : /branches/singleconfiguration/source/cone/core/tests/tempproject/test/path/to/somewhere/r.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/tempzipoutput
+Added : /branches/singleconfiguration/source/cone/core/tests/tempzipoutput/prodX.confml
+Added : /branches/singleconfiguration/source/cone/core/tests/testtemp
+Added : /branches/singleconfiguration/source/cone/core/tests/testtemp/.metadata
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration.py
+Deleted : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_parse.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_export.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_import.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_on_filestorage.py
+Modified : /branches/singleconfiguration/source/cone/core/tests/unittest_configuration_project_on_zipstorage.py
+Deleted : /branches/singleconfiguration/source/cone/core/tests/unittest_layer.py
+Deleted : /branches/singleconfiguration/source/cone/core/tests/unittest_project.py
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/FooStore.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/exportoutput.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/exportsource.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/importoutput.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/importsource.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/modified.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/store.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/testproject.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/testproject1.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/testproject2.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/testprojectinc2.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/testprojectinc3.pk
+Deleted : /branches/singleconfiguration/source/cone/public/tests/temp/unload.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_configuration.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/storage/filestorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/persistentdictionary.py
+Modified : /branches/singleconfiguration/source/cone/storage/stringstorage.py
+Added : /branches/singleconfiguration/source/cone/storage/tests/TestProlog.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/content
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/implml
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/implml
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/prodX/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/ncp11/prodX/implml
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/platform/s60/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/regional/japan/content
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/regional/japan/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/data/regional/japan/implml
+Modified : /branches/singleconfiguration/source/cone/storage/tests/data.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/dummytest
+Added : /branches/singleconfiguration/source/cone/storage/tests/foo
+Added : /branches/singleconfiguration/source/cone/storage/tests/foo/faa
+Added : /branches/singleconfiguration/source/cone/storage/tests/foo/faa.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/FooStore.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportoutput.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/exportsource.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/generic.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importoutput.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/importsource.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store/test1.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store/test2.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store/test3.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/store.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/subpath
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/subpath.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testfolder.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/.metadata
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/confml/component.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/confml/component1.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/content
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/content/foobar.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/foo.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/foo/implml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/product.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/confml/component1.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/content
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/content/foobar.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/content/s60.txt
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/doc
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/implml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata/s60/root.confml
+Added : /branches/singleconfiguration/source/cone/storage/tests/temp/testprojectlayersdata.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testdelete.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testfolder
+Added : /branches/singleconfiguration/source/cone/storage/tests/testfolder/foo
+Added : /branches/singleconfiguration/source/cone/storage/tests/testfolder/foo/foosubdir
+Added : /branches/singleconfiguration/source/cone/storage/tests/testfolder/subdir
+Added : /branches/singleconfiguration/source/cone/storage/tests/testnewfile.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testnonrecurse.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testoverwrite.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testrecurse.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/testtemp.zip
+Added : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage_with_configurations.py
+Added : /branches/singleconfiguration/source/cone/storage/tests/unittest_stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipresource.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipstorage.py
+Added : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipstorage_with_configurations.py
+Modified : /branches/singleconfiguration/source/cone/storage/zipstorage.py
+Added : /branches/singleconfiguration/source/cone/tests/dummytest
+Added : /branches/singleconfiguration/source/cone/tests/exported.zip
+Added : /branches/singleconfiguration/source/cone/tests/temp
+Added : /branches/singleconfiguration/source/cone/tests/temp/FooStore.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/exportoutput.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/exportsource.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/importoutput.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/importsource.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/modified.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/store.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/testproject.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/testproject1.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/testproject2.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/testprojectinc2.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/testprojectinc3.pk
+Added : /branches/singleconfiguration/source/cone/tests/temp/unload.pk
+Added : /branches/singleconfiguration/source/cone/tests/tempproject
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/dummy.confml
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/remove.confml
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/test
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/test/path
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/test/path/to
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/test/path/to/somewhere
+Added : /branches/singleconfiguration/source/cone/tests/tempproject/test/path/to/somewhere/r.confml
+Added : /branches/singleconfiguration/source/cone/tests/tempzipoutput
+Added : /branches/singleconfiguration/source/cone/tests/testdelete.zip
+Added : /branches/singleconfiguration/source/cone/tests/testfolder
+Added : /branches/singleconfiguration/source/cone/tests/testfolder/foo
+Added : /branches/singleconfiguration/source/cone/tests/testfolder/foo/foosubdir
+Added : /branches/singleconfiguration/source/cone/tests/testfolder/subdir
+Added : /branches/singleconfiguration/source/cone/tests/testnewfile.zip
+Added : /branches/singleconfiguration/source/cone/tests/testnonrecurse.zip
+Added : /branches/singleconfiguration/source/cone/tests/testoverwrite.zip
+Added : /branches/singleconfiguration/source/cone/tests/testrecurse.zip
+Added : /branches/singleconfiguration/source/cone/tests/testtemp.zip
+
+
+Revision: 472
+-------------
+Author: teerytko
+Date: 09:00:23, 06 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+
+Fixed a very crucial bug in usage of __getattr__, which normally called __getattribute__. This caused that the __getattr__ of the callee, was newer executed. Change of direct __getatribute__ to getattr(obj, name) fixed the problem.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/FooStore.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/exportoutput.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/exportsource.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/importoutput.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/importsource.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/modified.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/store.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/testproject.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/testproject1.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/testproject2.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/testprojectinc2.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/testprojectinc3.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp/unload.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_configuration.py
+Deleted : /branches/singleconfiguration/source/cone/public/tests/unittest_configurationlayer.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_layer.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/public/utils.py
+
+
+Revision: 470
+-------------
+Author: teerytko
+Date: 17:20:19, 05 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+- Working persistentconfml.py and test (hierarchical loads/dumps).
+- Added ConfmlMeta,ConfmlDesc.
+
+Modified : /branches/singleconfiguration/source/cone/confml/model.py
+Modified : /branches/singleconfiguration/source/cone/confml/persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/__init__.py
+Added : /branches/singleconfiguration/source/cone/confml/tests/unittest_model.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_persistentconfml.py
+
+
+Revision: 469
+-------------
+Author: teerytko
+Date: 07:49:54, 05 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+
+First version that supports the idea of somewhat incremental confml parsing (with warnings).
+
+Modified : /branches/singleconfiguration/source/cone/confml/persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/public/persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/Import.pk
+Added : /branches/singleconfiguration/source/cone/public/tests/temp
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_public_api.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+
+
+Revision: 468
+-------------
+Author: teerytko
+Date: 16:42:50, 03 February, 2009
+Message:
+ASSIGNED - # 1279: ConE: Support for confml data reader/writer 
+http://configurationtools.nmp.nokia.com/configurationtool/ticket/1279
+Added first version of persistentconfml module, that can dump/load Configuration objects.
+
+Added : /branches/singleconfiguration/source/cone/confml/persistentconfml.py
+Modified : /branches/singleconfiguration/source/cone/confml/tests/unittest_implml.py
+Added : /branches/singleconfiguration/source/cone/confml/tests/unittest_persistentconfml.py
+
+
+Revision: 467
+-------------
+Author: teerytko
+Date: 16:41:16, 03 February, 2009
+Message:
+Fixed errors after refactoring persistence modules for common module specific dumps/loads functionality.
+
+Modified : /branches/singleconfiguration/source/cone/storage/filestorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/persistentdictionary.py
+Modified : /branches/singleconfiguration/source/cone/storage/stringstorage.py
+
+
+Revision: 466
+-------------
+Author: teerytko
+Date: 16:41:02, 03 February, 2009
+Message:
+Fixed errors after refactoring persistence modules for common module specific dumps/loads functionality.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/Import.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+
+
+Revision: 455
+-------------
+Author: teerytko
+Date: 13:49:44, 02 February, 2009
+Message:
+Refactored the filestorage to support same functionality as stringstorage.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_utils.py
+Modified : /branches/singleconfiguration/source/cone/public/utils.py
+Modified : /branches/singleconfiguration/source/cone/storage/common.py
+Modified : /branches/singleconfiguration/source/cone/storage/filestorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/stringstorage.py
+
+
+Revision: 454
+-------------
+Author: teerytko
+Date: 12:01:15, 02 February, 2009
+Message:
+-Added support for Data elements under Configuration.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/Import.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_base.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_configuration.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_container.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_data.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_feature.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+Deleted : /branches/singleconfiguration/source/cone/public/tests/unittest_resource.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/storage/__init__.py
+Modified : /branches/singleconfiguration/source/cone/storage/persistentdictionary.py
+Modified : /branches/singleconfiguration/source/cone/storage/stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/__init__.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_metadata.py
+Added : /branches/singleconfiguration/source/cone/storage/tests/unittest_resource.py(Copy from path: /branches/singleconfiguration/source/cone/public/tests/unittest_resource.py, Revision, 448
+
+
+Revision: 453
+-------------
+Author: teerytko
+Date: 10:10:37, 30 January, 2009
+Message:
+-Added support for folders.
+-Added support for Storage agnostic open
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Deleted : /branches/singleconfiguration/source/cone/public/persistentdictionary.py
+Deleted : /branches/singleconfiguration/source/cone/public/stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Added : /branches/singleconfiguration/source/cone/storage/common.py
+Modified : /branches/singleconfiguration/source/cone/storage/filestorage.py
+Replacing : /branches/singleconfiguration/source/cone/storage/metadata.py
+Added : /branches/singleconfiguration/source/cone/storage/persistentdictionary.py(Copy from path: /branches/singleconfiguration/source/cone/public/persistentdictionary.py, Revision, 448
+Added : /branches/singleconfiguration/source/cone/storage/stringstorage.py(Copy from path: /branches/singleconfiguration/source/cone/public/stringstorage.py, Revision, 449
+Modified : /branches/singleconfiguration/source/cone/storage/tests/__init__.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/data/.metadata
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage.py
+Added : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage_layer.py
+Replacing : /branches/singleconfiguration/source/cone/storage/tests/unittest_metadata.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_zipstorage.py
+Modified : /branches/singleconfiguration/source/cone/storage/zipstorage.py
+
+
+Revision: 449
+-------------
+Author: teerytko
+Date: 17:21:57, 29 January, 2009
+Message:
+Created a Layer object.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/plugin.py
+Modified : /branches/singleconfiguration/source/cone/public/stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/Import.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_container.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_feature.py
+Added : /branches/singleconfiguration/source/cone/public/tests/unittest_layer.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_public_api.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_utils.py
+Modified : /branches/singleconfiguration/source/cone/public/utils.py
+
+
+Revision: 446
+-------------
+Author: teerytko
+Date: 10:44:16, 23 January, 2009
+Message:
+Added install from source section
+
+Modified : /branches/singleconfiguration/doc/intro.rst
+
+
+Revision: 445
+-------------
+Author: teerytko
+Date: 11:52:21, 22 January, 2009
+Message:
+Refactored the public API to a single Configuration storage.
+
+Modified : /branches/singleconfiguration/source/cone/public/api.py
+Modified : /branches/singleconfiguration/source/cone/public/container.py
+Modified : /branches/singleconfiguration/source/cone/public/persistence.py
+Added : /branches/singleconfiguration/source/cone/public/persistentdictionary.py
+Added : /branches/singleconfiguration/source/cone/public/stringstorage.py(Copy from path: /branches/singleconfiguration/source/cone/public/tests/stringstorage.py, Revision, 425
+Added : /branches/singleconfiguration/source/cone/public/tests/Import.pk
+Modified : /branches/singleconfiguration/source/cone/public/tests/__init__.py
+Deleted : /branches/singleconfiguration/source/cone/public/tests/stringstorage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_configuration.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_container.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_persistence.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_project.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_public_api.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_resource.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_storage.py
+Modified : /branches/singleconfiguration/source/cone/public/tests/unittest_views.py
+Added : /branches/singleconfiguration/source/cone/storage/configurationpersistence.py
+Modified : /branches/singleconfiguration/source/cone/storage/tests/unittest_filestorage_to_filestorage.py
+
+
+Revision: 429
+-------------
+Author: teerytko
+Date: 17:04:13, 09 January, 2009
+Message:
+added makefile mechanism for building cone.
+
+Added : /branches/singleconfiguration/document
+Added : /branches/singleconfiguration/install
+Modified : /branches/singleconfiguration/makefile
+Added : /branches/singleconfiguration/source/makefile
+Added : /branches/singleconfiguration/source/plugins/ConeCliPlugin/makefile
+Added : /branches/singleconfiguration/source/plugins/ConeContentPlugin/makefile
+Added : /branches/singleconfiguration/source/plugins/ConeCustomConfmlPlugin/makefile
+Added : /branches/singleconfiguration/test
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/common.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,63 @@
+Cone command line interface
+===========================
+
+ConE command line interface is desinged to offer different actions. A action can be anything that utilizes the ConE interface and 
+somehow interacts with a Configuration Project. Each action has it's own set of command line arguments.
+
+Calling ConE
+------------
+
+All ConE commands are wrapped up by the cone.cmd, which executes internally cone_tool.py. The cone_tool.py searches for all conesub_*.py 
+matching files under the same scripts folder under cone installation. So basically adding a new action is just adding a new conesub_*.py file.
+
+To get a list of all available cone commands run::
+
+    cone -h
+    
+or::
+
+    cone --help
+  
+And you will get something like this as output::
+
+    Usage: cone_tool.py [action] [options].
+    
+    Available actions
+        info
+        compare
+        merge
+        export
+        generate
+        update
+    
+    Use cone_tool.py [action] -h to get action specific help.
+    
+    Options:
+      --version                         show program's version number and exit
+      -h, --help                        show this help message and exit 
+      -c CONFIG, --configuration=CONFIG  Define the name of the configuration for the action
+      -v LEVEL, --verbose=LEVEL          Print error, warning and information on system out. 
+                                            Possible choices:
+                                                NONE 0
+                                                CRITICAL 1 
+                                                ERROR 2 
+                                                WARNING 3 
+                                                INFO 4 
+                                                DEBUG 5 
+                                            Default is 3.
+      -p STORAGE, --project=STORAGE      Defines the location of current project. Default is the current working directory.
+
+
+ConE actions
+------------
+.. toctree::
+    :maxdepth: 2
+
+    info
+    compare
+    merge
+    export
+    generate
+    update
+    report
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/compare.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,96 @@
+ConE compare action
+===================
+The compare action is intended to enable comparison of two configurations in different ways. The 
+compare logic is done in a Jinja template, which makes it quite customizable. There are default
+templates for data and API comparison that can be used with the --report-type switch, but a custom
+template can also be used with the --template switch (see the examples).
+
+Examples
+--------
+
+**Compare two configurations in current storage**::
+
+    >cd configproject_root
+    >cone compare -s configuration_root1.confml -t configuration_root2.confml
+
+By default the output is generated under current folder to compare.html (use switch --report=FILENAME
+to change the output file).
+
+**Compare configurations between the current storage and some remote storage**:
+
+The target configuration can also include remote storage path, which must be separated from the 
+configuration root by semicolon::
+
+    >cd configproject_root
+    >cone compare -s configuration_root1.confml -t \config_project2;configuration_root2.confml
+
+**Compare configuration API between two configurations**
+
+Use the --report-type switch make an API comparison.::
+
+    >cd configproject_root
+    >cone compare -s configuration_root1.confml -t \config_project2;configuration_root2.confml --report-type api
+
+**Compare configurations using a custom template**
+
+Use the --template switch to specify a custom template file.::
+
+    >cd configproject_root
+    >cone compare -s configuration_root1.confml -t \config_project2;configuration_root2.confml --template my_template.html
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extension.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+
+  Compare options:
+    The generate function will create target files from a specific
+    configuration.The generate will always work with read-only mode of the
+    project, so no changes are saved to project
+
+    -s CONFIG, --sourceconfiguration=CONFIG
+                        defines the name of the sourceconfiguration for the
+                        compare action. The configuration is expected to be
+                        located current storage.
+    -t CONFIG, --targetconfiguration=CONFIG
+                        defines the name of the target configuration for the
+                        compare action. The configuration can be located in
+                        the current storage or it the configurationdefinition
+                        can contain a path to a storage. The storage
+                        definition is given as a pathbefore semicolon. e.g.
+                        x:\data\configproject;productx.confml,
+                        test.cpf;root.confml
+    --report=FILE       The file where the comparison report is written.By
+                        default this value is determined by the used report
+                        type. Example: -r report.html.
+    --template=FILE     Template used in a report generation. By default this
+                        value is determined by the used report type. Example:
+                        -t report_template.html.
+    --report-type=TYPE  The type of the report to generate. This is a
+                        convenience switch for setting the used template.
+                        Possible values:
+                        api  - Report changes in feature definitions
+                        data - Report changes in data values
+                        crml_dc - Report CRML data compatibility issues
+    --impl-filter=PATTERN
+                        The pattern used for filtering implementations for the
+                        comparison. See the switch --impl in action generate
+                        for more info.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/export.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,83 @@
+ConE export action
+==================
+Running action export
+Usage: cone export [options]
+
+The export functionality exports configurations from the current project to a remote project. Default value for the current project is the currently working directory. A project can be either a folder or a CPF/ZIP file.
+
+Examples
+--------
+
+**Export a configuration from folder to a zip file**::
+
+    >cd configproject_root
+    >cone export -c configuration_root.confml --remote=exported.zip
+
+or use the option -p|--project to point to the configuration project root::
+
+    >cone export --project=configproject_root --remote=exported.zip -c configuration_root.confml
+
+**Export a configuration from a zip|cpf file to a folder**
+
+The different to the previous example is that the project parameters are turned otherway around. ::
+
+    >cd configproject_root
+    >cone export --project exported.zip --remote=. -c configuration_root.confml 
+
+**Export a configuration from a webstorage (carbon) file to a folder**
+
+The Carbon functionality will be released in ConE 1.2 release and is not yet officially available. 
+The usage is similar to the previous, but the carbon path is given as http://serverpath/extapi.::
+
+    >cd configproject_root
+    >cone export --project http://carbonqa.nokia.com/extapi -r . -c configuration_root.confml 
+
+See the info action for getting a list of available configurations inside Carbon.
+
+**Export a configuration from a folder to webstorage (carbon)**::
+
+    >cd configproject_root
+    >cone export --remote http://carbonqa.nokia.com/extapi -c configuration_root.confml 
+
+
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extension.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -c CONFIG, --configuration=CONFIG
+                        defines the name of the configuration for the action
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+
+  Export options:
+    The export functionality is meant to export configurations between
+    current project (defined with -p) to an remote project (defined with
+    -r). Default value for the current project is the currently working
+    directory. A project can be either a folder or a cpf/zip file.
+
+    -r STORAGE, --remote=STORAGE
+                        defines the location of remote storage. Default name
+                        for remote storage is the source configuration name
+    -a SET, --add=SET   Add a configuration layer to the given configuration
+                        as last element.The add operation can be used several
+                        times in a single command and it can create even an
+                        empty layer.Example --add foo/root.confml --add bar
+                        /root-confml.
+    --exclude-folders   Excludes empty folders from .cpf export
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/generate.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,114 @@
+ConE generate action
+====================
+Running action generate
+Usage: cone generate [options]
+
+The generate action is intended to generate output files with different implementation plugins. The
+implementation files can be filtered by different mechanism, via the command line options. 
+
+Examples
+--------
+
+**Generate all files of a configurations**::
+
+    >cd configproject_root
+    >cone generate -c configuration_root.confml
+
+or use the option -p|--project to point to the configuration project root::
+
+    >cone generate --project=configproject_root -c configuration_root.confml
+
+**Generate by filtering with values in last layer**
+
+The data can be located in different layers in configuration project. Quite a common use case is to 
+generate only output files that have been changed in the last layer.::
+
+    >cd configproject_root
+    >cone generate -c configuration_root.confml --layer=-1
+
+This will read data value definitions on the last configuration layer (last included confml 
+file in the root file), and run generate only to implementation files that use one of these
+data values.
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extensions.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -c CONFIG, --configuration=CONFIG
+                        defines the name of the configuration for the action
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+
+  Generate options:
+    The generate function will create target files from a specific
+    configuration.The generate will always work with read-only mode of the
+    project, so no changes are saved to project
+
+    -o FOLDER, --output=FOLDER
+                        defines the target folder where the files are is
+                        generated or copied
+    -l LAYER, --layer=LAYER
+                        define layers of the configuration that are included
+                        to the output. The layer operation can be used several
+                        times in a single command.Example -l -1 --layer=-2,
+                        which would append a layers -1 and -2 to the layers =>
+                        layers = -1,-2
+    --all-layers        Include all layers in generation. This switch
+                        overrides all other layer configurations (iMaker API
+                        and using the --layer parameter)
+    -i IMPLS, --impl=IMPLS
+                        Define a Python regular expression filter for actual
+                        ImplML plugin(s) that needs to be executed. The whole
+                        path to ImplML filename is used in the regexp
+                        matching. The impl operation can be used several times
+                        in a single command.
+                        Example1 --impl crml => matches for any ImplML file
+                        that has a CrML string in the path. Example2 --impl
+                        makeml$ => matches for ImplML file that has ends with
+                        MakeML string.
+    --impl-tag=TAG      define a tag for the implementations that are included
+                        to the output. A tag is name value pair and has the
+                        following format: name:value, e.g.
+                        target:rofs3.Example --impl-tag=target:uda --impl-
+                        tag=target:content, which would include impls include
+                        both tags.
+    --impl-tag-policy=TAGS_POLICY
+                        Policy for implementation tags. May have one of the
+                        following values: --impl-tag-policy=AND, --impl-tag-
+                        policy=OR. Default is OR.
+    -s SET, --set=SET   Override a ConfML reference in the execution.The set
+                        operation can be used several times in a single
+                        command.Example -s foo.bar=10 -s foo.fea='test'.
+    --add=CONF          Add a given configuration to the given configuration
+                        as last element.The add operation can be used several
+                        times in a single command.Example --add
+                        foo/root.confml --add bar/root-confml.
+    -r FILE, --report=FILE
+                        Generates a report about settings that are properly
+                        generated.Example -r report.html.
+    -t FILE, --template=FILE
+                        Template used in report generation.Example -t
+                        report_template.html.
+    --report-data-output=FILE
+                        Specifies a file where intermediary report data is
+                        generated.
+    -n, --dryrun        Executes generation without generation output.
+    --add-setting-file=FILE
+                        Generate specific settings in ini format.Example -o
+                        my_generate_settings.cfg.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/info.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,55 @@
+ConE info action
+================
+Running action info
+Usage: cone info [options]
+
+The info functionality is meant for printing information about the contents of a CPF/ZIP file or Configuration Project (folder).
+Examples
+--------
+
+**Get a list of root configurations inside the project**::
+
+    >cd configproject_root
+    >cone info 
+
+or use the option -p|--project to point to the configuration project root::
+
+    >cone info --project=configproject_root 
+
+**Get a list of root configurations inside a carbon storage (Available in ConE 1.2)**::
+
+    >cone info --project=http://carbonqa.nokia.com/extapi
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extension.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -c CONFIG, --configuration=CONFIG
+                        defines the name of the configuration for the action
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+  --dump-api=FILE       Write the confml feature api string representation to
+                        a file.
+
+  Info options:
+    The info functionality is meant for printing information about the
+    contents of a cpf/zip file or Configuration Project (folder).
+
+    --template=FILE     Template used in a report generation.Example -t
+                        report_template.html.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/merge.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,171 @@
+ConE merge action
+=================
+
+The merge functionality is meant to merge configurations/layers from a
+remote project (defined with -r) to the current project (defined with
+-p). Default value for the current project is the current working
+directory. A project can be either a folder or a CPF/ZIP file.
+
+There are two ways to use merge:
+
+    #. Merge a configuration root into another
+    #. Merge a specific source layer into a specific target layer
+
+These translate to two use cases:
+
+    #. Merging an asset into an existing configuration project
+    #. Merging a variant data layer from an exported CPF back into the
+       configuration project
+
+Examples for these two use cases are given below.
+
+Examples
+--------
+
+Files containing the used example data:
+
+    - :download:`config_project.zip <merge/config_project.zip>`
+    - :download:`myasset2.zip <merge/myasset2.zip>`
+
+Merging an asset into configuration project
+'''''''''''''''''''''''''''''''''''''''''''
+
+Say that we have a small configuration project that contains the configuration
+interface and implementation of some component, and we want to merge this asset
+as part of a configuration project, specifically into the ``assets/myassets/``
+layer in the project. This can be done by using the layer -> layer merging
+functionality.
+
+The image below shows what we want to accomplish. You can see that the 
+``assets/myassets/`` layer already contains asset1, and we want to merge asset2
+there too.
+
+    .. image:: merge/asset_merge.png
+
+We need to give ConE the layer root .confml files of the layers we want to
+merge. To do this, run the following command:
+
+::
+
+    > cone merge -p config_project --targetlayer assets/myassets/root.confml -r myasset2 --sourcelayer asset2/root.confml
+    Running action merge
+    Target project: config_project
+    Source project: myasset2
+    Target layer:   assets/myassets/root.confml
+    Source layer:   asset2/root.confml
+    Merging layers...
+    Copying asset2/confml/asset2.confml
+    Copying asset2/content/asset2_data/dummy.txt
+    Copying asset2/implml/asset2.templateml
+    Including confml/asset2.confml in layer root assets/myassets/root.confml
+
+Now the ``assets/myassets`` layer in the configuration project contains also
+the contents of asset2.
+
+Merging a variant configuration into configuration project
+''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
+
+Another use case is merging the variant data layer of an exported CPF back
+into the configuration project. This is where the configuration root merge
+comes in.
+
+First, using the same example project as in the previous example, export a CPF
+containing a variant data layer:
+
+::
+
+    > cd config_project
+    config_project> cone export -c product_x_root.confml -r test.cpf --add variants/variant/root.confml
+    Running action export
+    Export product_x_root.confml to test.cpf done!
+    
+Now the CPF can be modified somehow, here we'll add the content files ``foo.txt``
+and ``bar.txt``. After this we can merge it back into the project as a new
+configuration root that contains also the variant data layer:
+
+::
+
+    config_project> cone merge -c foobar.confml -r test.cpf --rename
+    Running action merge
+    Target project: .
+    Source project: test.cpf
+    Target config:  foobar.confml
+    Source config:  product_x_root.confml
+    Merging 1 layer(s)...
+    Merging variants/variant/root.confml -> variants/variant_foobar/root.confml
+    Copying variants/variant/confml/data.confml
+    Copying variants/variant/content/bar.txt
+    Copying variants/variant/content/foo.txt
+    Including confml/data.confml in layer root variants/variant_foobar/root.confml
+
+The rename option tells ConE to rename the variant layer based on the given
+configuration root name, so that the variant data layer becomes ``variants/variant_foobar/``.
+So, now the project looks like this:
+
+    .. image:: merge/project_after_variant_layer_merge.png
+
+Note that the default merge doesn't overwrite the layers, it only adds/replaces
+files from the source layers. If the entire layer should be overwritten, the
+option --merge-policy can be used to specify that layers should be entirely
+overwritten. For example, if we remove ``foo.txt`` from the variant content
+in the CPF and re-merge like this:
+
+::
+
+    config_project> cone merge -c foobar.confml -r test.cpf --rename --merge-policy overwrite-layer
+    Running action merge
+    Target project: .
+    Source project: test.cpf
+    Target config:  foobar.confml
+    Source config:  product_x_root.confml
+    Merging 1 layer(s)...
+    Merging variants/variant/root.confml -> variants/variant_foobar/root.confml
+    Copying variants/variant/confml/data.confml
+    Copying variants/variant/content/bar.txt
+    Including confml/data.confml in layer root variants/variant_foobar/root.confml
+
+Now ``variants/variant_foobar/content/`` contains only ``bar.txt``.
+
+Options list
+------------
+    -c CONFIG, --configuration=CONFIG
+                        defines the name of the target configuration for the
+                        action
+    -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+    -r STORAGE, --remote=STORAGE
+                        defines the location of remote storage
+    -s CONFIG, --sourceconfiguration=CONFIG
+                        defines the name of the remote configuration inside
+                        the remote storage for the merge action. Default is
+                        the active root of the remote project.
+    --sourcelayer=LAYER_ROOT
+                        Defines a specific layer to use as the layer to merge
+                        from the remote project. Must be the layer root
+                        (ConfML file).For example: --sourcelayer
+                        assets/somelayer/root.confml
+    --targetlayer=LAYER_ROOT
+                        Defines a specific layer (root) to use as the layer to
+                        merge into the target project. Must be the layer root
+                        (ConfML file).For example: --targetlayer
+                        assets/somelayer/root.confml
+    --rename            defines that the merged layers need to be renamed
+    --all               Defines that the entire configuration (all layers)
+                        needs to be merged. This has no effect when merging
+                        layers directly using --sourcelayer and --targetlayer.
+    -l LAYERS, --layer=LAYERS
+                        Define the layers of the source configuration that are
+                        included to merge action. The layer operation can be
+                        used several times in a single command. Note that this
+                        can only be used when merging configuration roots, not
+                        specific layers using --sourcelayer and --targetlayer.
+                        Example -l -1 --layer=-2, which would append a layers
+                        -1 and -2 to the layers => layers = -1,-2
+    --merge-policy=MERGE_POLICY
+                        Specifies the merge policy to use when merging layers.
+                        Possible values:
+                        replace-add - Add/replace files from source layer, but
+                        leave other files in the target as they are.
+                        overwrite-layer - Overwrite the entire layer (remove
+                        all previous content).
Binary file configurationengine/doc/cli/merge/asset_merge.png has changed
Binary file configurationengine/doc/cli/merge/config_project.zip has changed
Binary file configurationengine/doc/cli/merge/myasset2.zip has changed
Binary file configurationengine/doc/cli/merge/project_after_variant_layer_merge.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/report.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,61 @@
+ConE report action
+==================
+
+The report action can be used to create a report based on report generation
+data created beforehand by the generate action using the switch ``--report-data-output``.
+The report can be generated based on a single data file, or by merging multiple files.
+
+Examples
+--------
+
+**Creating a report from a single data file**::
+
+    cone report --input-data report.dat
+
+This would generate a report based on the data in ``report.dat`` into ``report.html``
+in the current directory.
+
+**Creating a report from multiple files**::
+
+    cone report --input-data rofs3.dat --input-data uda.dat --template template.html
+
+This would generate a report based the data from two generation runs, one for ROFS3 data
+and one for UDA data. The used template is overridden using ``--template``.
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extension.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+
+  Report options:
+    The report function generates a report using previously generated
+    intermediary report data as input.
+
+    -i FILE, --input-data=FILE
+                        Defines an input file for report generation. If
+                        specified more than once, the data of all specified
+                        report data files is merged.
+    -r FILE, --report=FILE
+                        Generates a report about settings that are properly
+                        generated.Example -r report.html.
+    -t FILE, --template=FILE
+                        Template used in report generation.Example -t
+                        report_template.html.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/cli/update.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,55 @@
+ConE update action
+===================
+Running action update
+Usage: cone update [options]
+
+The update functionality is meant for ConfML manipulation in current project (defined with -p). Default value for the current project is the currently working directory. A project can be either a folder or a cpf/zip file.
+
+Options list
+------------
+  --version             show program's version number and exit
+  -h, --help            show this help message and exit
+  --print-settings      Print all the default settings from the current
+                        setting container.
+  --print-supported-impls
+                        Print all supported ImplML XML namespaces and file
+                        extension.
+  -v LEVEL, --verbose=LEVEL
+                        Print error, warning and information on system out.
+                        Possible choices: Default is 3.
+                        NONE (all)    0
+                        CRITICAL      1
+                        ERROR         2
+                        WARNING       3
+                        INFO          4
+                        DEBUG         5
+  --log-file=FILE       Location of the used log file. Default is 'cone.log'
+  -c CONFIG, --configuration=CONFIG
+                        defines the name of the configuration for the action
+  -p STORAGE, --project=STORAGE
+                        defines the location of current project. Default is
+                        the current working directory.
+
+  Update options:
+    The update functionality is meant for ConfML manipulation in current
+    project (defined with -p). Default value for the current project is
+    the currently working directory. A project can be either a folder or a
+    cpf/zip file.
+
+    -m META, --add-meta=META
+                        Add given metadata to defined configuration.Example
+                        --add-meta "owner=John Cone" -m product=E75
+    --add-cpf-meta=CPFMETA
+                        Add given CPF identification metadata to defined
+                        configuration.Example --add-cpf-meta
+                        "coreplat_name=Platform1"
+    -d DESC, --add-desc=DESC
+                        Add given description to defined configuration.Example
+                        --add-desc "Customer one CPF" -d Description1
+    --remove-meta=META  Removes given metadata from defined
+                        configuration.Example --remove-meta owner --remove-
+                        meta coreplat_name
+    --remove-desc       Removes description from defined configuration.Example
+                        --remove-desc
+    --add-data=DATA     Add given ConfML data to defined configuration.Example
+                        --add-data "KCRUidAvkon.KAknDefaultAppOrientation=1"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/conf.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,194 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+
+#
+# Cone documentation build configuration file, created by
+# sphinx-quickstart on Tue Dec 30 13:51:34 2008.
+#
+# This file is execfile()d with the current directory set to its containing dir.
+#
+# The contents of this file are pickled, so don't put values in the namespace
+# that aren't pickleable (module imports are okay, they're removed automatically).
+#
+# All configuration values have a default value; values that are commented out
+# serve to show the default value.
+
+import sys, os
+
+# If your extensions are in another directory, add it here. If the directory
+# is relative to the documentation root, use os.path.abspath to make it
+# absolute, like shown here.
+#sys.path.append(os.path.abspath('some/directory'))
+
+# General configuration
+# ---------------------
+
+# Add any Sphinx extension module names here, as strings. They can be extensions
+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
+extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest']
+
+# Add any paths that contain templates here, relative to this directory.
+templates_path = ['_templates']
+
+# The suffix of source filenames.
+source_suffix = '.rst'
+
+# The master toctree document.
+master_doc = 'index'
+
+# General substitutions.
+project = u'ConE'
+copyright = u'2008, Nokia Corporation and/or its subsidiary(-ies)'
+
+# The default replacements for |version| and |release|, also used in various
+# other places throughout the built documents.
+#
+# The short X.Y version.
+version = '1.1'
+# The full version, including alpha/beta/rc tags.
+release = '1.1.5'
+
+# There are two options for replacing |today|: either, you set today to some
+# non-false value, then it is used:
+#today = ''
+# Else, today_fmt is used as the format for a strftime call.
+today_fmt = '%B %d, %Y'
+
+# List of documents that shouldn't be included in the build.
+#unused_docs = []
+
+# List of directories, relative to source directories, that shouldn't be searched
+# for source files.
+exclude_trees = []
+
+# The reST default role (used for this markup: `text`) to use for all documents.
+#default_role = None
+
+# If true, '()' will be appended to :func: etc. cross-reference text.
+#add_function_parentheses = True
+
+# If true, the current module name will be prepended to all description
+# unit titles (such as .. function::).
+#add_module_names = True
+
+# If true, sectionauthor and moduleauthor directives will be shown in the
+# output. They are ignored by default.
+#show_authors = False
+
+# The name of the Pygments (syntax highlighting) style to use.
+pygments_style = 'sphinx'
+
+
+# Options for HTML output
+# -----------------------
+
+# The style sheet to use for HTML and HTML Help pages. A file of that name
+# must exist either in Sphinx' static/ path, or in one of the custom paths
+# given in html_static_path.
+html_style = 'default.css'
+
+# The name for this set of Sphinx documents.  If None, it defaults to
+# "<project> v<release> documentation".
+#html_title = None
+
+# A shorter title for the navigation bar.  Default is the same as html_title.
+#html_short_title = None
+
+# The name of an image file (relative to this directory) to place at the top
+# of the sidebar.
+#html_logo = None
+
+# The name of an image file (within the static path) to use as favicon of the
+# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32
+# pixels large.
+#html_favicon = None
+
+# Add any paths that contain custom static files (such as style sheets) here,
+# relative to this directory. They are copied after the builtin static files,
+# so a file named "default.css" will overwrite the builtin "default.css".
+html_static_path = ['_static']
+
+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
+# using the given strftime format.
+html_last_updated_fmt = '%b %d, %Y'
+
+# If true, SmartyPants will be used to convert quotes and dashes to
+# typographically correct entities.
+#html_use_smartypants = True
+
+# Custom sidebar templates, maps document names to template names.
+#html_sidebars = {}
+
+# Additional templates that should be rendered to pages, maps page names to
+# template names.
+#html_additional_pages = {}
+
+# If false, no module index is generated.
+#html_use_modindex = True
+
+# If false, no index is generated.
+#html_use_index = True
+
+# If true, the index is split into individual pages for each letter.
+#html_split_index = False
+
+# If true, the reST sources are included in the HTML build as _sources/<name>.
+#html_copy_source = True
+
+# If true, an OpenSearch description file will be output, and all pages will
+# contain a <link> tag referring to it.  The value of this option must be the
+# base URL from which the finished HTML is served.
+#html_use_opensearch = ''
+
+# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
+#html_file_suffix = ''
+
+# Output file base name for HTML help builder.
+htmlhelp_basename = 'Conedoc'
+
+
+# Options for LaTeX output
+# ------------------------
+
+# The paper size ('letter' or 'a4').
+#latex_paper_size = 'letter'
+
+# The font size ('10pt', '11pt' or '12pt').
+#latex_font_size = '10pt'
+
+# Grouping the document tree into LaTeX files. List of tuples
+# (source start file, target name, title, author, document class [howto/manual]).
+latex_documents = [
+  ('index', 'Cone.tex', u'ConE Documentation',
+   u'Teemu Rytkönen', 'manual'),
+]
+
+# The name of an image file (relative to this directory) to place at the top of
+# the title page.
+#latex_logo = None
+
+# For "manual" documents, if this is true, then toplevel headings are parts,
+# not chapters.
+#latex_use_parts = False
+
+# Additional stuff for the LaTeX preamble.
+#latex_preamble = ''
+
+# Documents to append as an appendix to all manuals.
+#latex_appendices = []
+
+# If false, no module index is generated.
+#latex_use_modindex = True
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/configurationml085.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1965 @@
+#######################################
+Configuration ML Specification Document
+#######################################
+
+**Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).** All rights reserved. This component and the accompanying materials are made available under the terms of "Eclipse Public License v1.0" which accompanies this distribution, and is available at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+
+==================
+Table of contents:
+==================
+
+.. contents::
+
+===================
+1. Document Control
+===================
+
+1.1 References
+--------------
+
+#. Customization tool interoperability Requirements Specification
+   http://www8.connecting.nokia.com/nmp/msw/tsw/series60/series60dm.nsf/WebAllByID/XXXJ16313-EN
+#. XML Inclusions (XInclude) Version 1.0, W3C Recommendation, 20 December 2004
+   http://www.w3.org/TR/xinclude/
+#. Extensible Markup Language (XML) 1.0 (Third Edition), W3C Recommendation,
+   http://www.w3.org/TR/2004/REC-xml-20040204
+#. Modularization of XHTML, W3C Recommendation
+   http://www.w3.org/TR/2001/REC-xhtml-modularization-20010410
+#. XML Linking Language (XLink) Version 1.0, W3C Recommendation, 27 June 2001
+   http://www.w3.org/TR/xlink/
+#. XML Path Language (XPath) Version 1.0, W3C Recommendation, 16 November 1999
+   http://www.w3.org/TR/xpath
+#. XML Schema Part 2: Datatypes Second Edition, W3C Recommendation, 28 October 2004
+   http://www.w3.org/TR/xmlschema-2/
+#. XHTML(TM) 2.0 - W3C Working Draft 22 July 2004
+   http://www.w3.org/TR/xhtml2/
+#. Extending and Versioning XML Languages with XML Schema
+   http://www.pacificspirit.com/Authoring/Compatibility/ExtendingAndVersioningXMLLanguages.html
+#. 
+#. RELAX NG Specification, OASIS Committee Specification, 3 December 2001
+   http://www.relaxng.org/spec-20011203.html
+#. Uniform Resource Identifiers (URI): Generic Syntax, August 1998
+   http://www.ietf.org/rfc/rfc2396.txt
+#. S60 Customization Tool
+   http://s60wiki.nokia.com/S60Wiki/S60_Customization_Tool
+
+1.2 Glossary
+------------
+
+.. glossary::
+
+   Central Repository
+      `Symbian OS <http://s60wiki.nokia.com/S60Wiki/Symbian_OS>`_ service that provides a user interface to allow one or more clients to open repositories, and to provision and retrieve information from those repositories.
+   Configuration
+      Specific values for a collection of settings. Used to configure terminal SW for certain platform release, product or trade customer (for example operator). In Configuration ML the root element of the language and includes also feature and setting definitions.
+   Configuration element
+      Defines a `configuration <http://s60wiki.nokia.com/S60Wiki/S60_Terminal_SW_Configuration>`_  capability of software. Is used to define using one or more settings or features.
+   Configuration enabler
+      A software functionality that at runtime implements configurability for one or more setting
+   Configuration Tool
+      Tool used for configuring SW build (for example variant)
+   ConfML
+      Configuration Markup Language, language defined in this document
+   Customization Tool
+      S60 specific tool to configuring SW build (for example variant). Replaced by Configuration Tool. 
+   Extension policy
+      A mechanism for controlling how sequence item-settings for single setting in multiple configurations are handled.
+   Feature
+      A collection of related settings.
+   Group
+      For structuring settings in view.
+   Item-setting
+      A single item in a data of a sequence setting. Each item-setting defines values for sub-settings. For example, every contact in a data for phone book setting is an item-setting.
+   lowerCamelCase
+      Practice of writing `compound words <http://en.wikipedia.org/wiki/Compound_noun_and_adjective>`_ or phrases in which the words are joined without `spaces <http://en.wikipedia.org/wiki/Whitespace_%28computer_science%29>`_ and are `capitalized <http://en.wikipedia.org/wiki/Capitalization>`_ with the exception of the first word within the compound (http://en.wikipedia.org/wiki/CamelCase).
+   Option
+      Allowed value for a setting.
+   Restore Factory Settings (RFS)
+      Feature for reinitialising device data to factory settings stored on ROM.
+   Setting
+      Defines a single configurable element (for example mailbox name).
+   Setting implementation
+      Information about platform specific implementation. Used when building a configuration. Specific for the used configuration enabler
+   Sub-configuration
+      A configuration included in other configuration.
+   Sub-setting
+      Individual setting data elements that are available for each item-setting of a sequence data. For example, phone number field of every contact item-setting is a sub-setting.
+   Value
+      Defines a value of a setting. Single customizable value of a certain setting. For example Mailbox name.
+   Variant 
+      A specific kind of configuration. Term used in Customization Tool for customer specific values.
+   View
+      For rearranging settings into new structure and redefining their properties regardless how they where defined originally.
+
+===============
+2. Introduction
+===============
+
+2.1 Purpose and scope
+---------------------
+
+Configuration ML (later in document 'Configuration ML' or 'ConfML') is a XML-based markup language (that is, an XML application) for defining SW configuration elements and configuration data of SW product. 
+
+Configuration ML is an evolution of XML language designed and used for S60 Customization Tool. Full compatibility with the tools already supporting so-called variant data files of earlier format was first seen as important. However, it was afterwards seen that compatibility would only make Configuration ML more complicated than needed. Also new features of such as mapping Boolean settings to bitmasks key in Central Repository and enabling incremental definition of sequences would have not been supported by old format. Therefore The Configuration ML is not compatible with variant features or variant data XML formats used by S60 Customization Tool. On the other hand it is possible to develop tools that support reading and/or writing both formats. Configuration ML language itself is not S60 specific and therefore can be used also outside S60.
+
+2.2 Main concepts
+-----------------
+
+The Configuration ML consists of four plus one main components as shown in Figure 1.
+
+.. image:: images/configurationml085-f1.gif 
+
+Figure 1 The main components of Configuration ML
+
+Configuration ML is primarily used to define configurations, features, settings, and data. The fourth component is Restore Factory Settings component, rfs. All these components are optional. Configuration is the top level concept of the language. It groups together relevant configuration features and values for them. Features consist of settings. Configurations are typically defined incrementally, and therefore configuration can be defined by means of any number of other configurations. Chapter 3 explains in detail the main concepts of the language.
+
+Setting implementation definitions are defined using separate languages, which are defined in separate documents. One of the main goals of Configuration ML is to separate the logical feature definitions from the actual implementation specific details. Setting implementation definitions contain all the required logic to convert values in data part to implementation specific values that are used either at ROM image creation time or by the terminal software at runtime.
+
+2.3 Applicability
+-----------------
+
+This specification defines how Configuration ML can be used to define all SW related configurability aspects of a software system. 
+
+Configuration ML is most typically used for those local or global functionality and user experience related configuration elements that are used for localization, differentiation and customization purposes.
+
+When defining configuration elements in using Configuration ML suitable abstraction level should be selected. In complex cases it might be better to use for example domain specific language and external file to describe the fine details, and only then have selection of an external file as a setting in Configuration ML. This approach also enables to build dedicated (possible graphical) tools to define the internal details of the element.
+
+2.4 Namespace
+-------------
+
+All the elements of Configuration ML are defined in a single versioned namespace called http://www.s60.com/xml/confml/2 . The namespace is updated for major, possibly non-backward compatible versions only. New minor versions must maintain compatibility. The root element of the document, configuration, must contain an xmlns declaration for this namespace. None of the attributes in this specification belong to any namespaces and therefore are never prefixed.  
+
+Example::
+
+  <configuration xmlns="http://www.s60.com/xml/confml/2" />
+
+When elements of Configuration ML are stored in a separately included file, namespace needs to be redefined. Refer to chapter 3.2.3 for more information on how to use multiple files to define a configuration.
+
+The setting implementation information is defined in implementation specific namespace.  
+
+The namespace of Configuration ML must not be used for any other elements than defined in this document. All extensions must be therefore defined in some other namespace.
+
+2.5 MIME types and file name extensions
+---------------------------------------
+
+The MIME type for XML files of Configuration ML is 'text/application+xml'. 
+
+It is recommended that all Configuration ML files use file name extension '.confml' (all lowercase) on all platforms.
+
+The file name extensions of setting implementation XML files are implementation specific.
+
+2.6 Reuse and Extensibility
+---------------------------
+
+Configuration ML relies heavily on other existing XML language. Following XML languages are used one way or another: XPATH [6], XInclude [2], and XML schema [7].
+
+XPath is a language for addressing parts of an XML document. In support of this primary purpose, it also provides basic facilities for manipulation of strings, numbers, and Booleans. XPath uses a compact, non-XML syntax to facilitate use of XPath within URIs and XML attribute values. XPath operates on the abstract, logical structure of an XML document, rather than its surface syntax. Refer to chapter 3.4 and 3.3.2 for more information on XPath expressions are used in configuration ML.
+
+XInclude is a standard for assembling XML instances into another XML document through inclusion. It enables larger documents to be dynamically created from smaller XML documents without having to physically duplicate the content of the smaller files in the main file. Refer to chapter 3.2.3 for more information on working with multiple files.
+
+Configuration ML itself is designed to be extensible meaning that it can be further developed by defining new elements in own namespace.  
+
+2.7 Validation and usage
+------------------------
+
+This document is the official definition for the Configuration ML XML language.
+
+All Configuration ML documents must be valid XML 1.0 documents. The applications and tools supporting Configuration ML are assumed to check the well-formedness of the Configuration ML document instances.  
+
+Every Configuration ML document should have XML declaration with version as the first thing in the file. 
+
+The root element of every Configuration ML document must be configuration. The version attribute for this element must be specified as '1.0'.
+
+Example::
+
+  <?xml version="1.0"?>
+    <configuration xmlns="http://www.s60.com/xml/confml/2" version="1.0">
+    <!-- the body of the document -->
+    </configuration>
+
+2.8 Localization
+----------------
+
+As all XML documents, Configuration ML supports both UTF-8 and UTF-16 encodings. It is recommended to declare used encoding with XML declaration. This declaration is mandatory when other encoding than UTF-8 or UTF-16 is used. By default, UTF-8 encoding should be used, in case there is no good reason to do otherwise.  
+
+Example::
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <!-- the rest of the document ->
+
+Any characters from Unicode character set can be written in XML using XML Numerical Character Reference syntax: &#<decimal_character_code>; or &#x<hex_character_code>; .  
+
+======================================================
+3. Overview
+======================================================
+
+3.1 Components of Configuration ML
+----------------------------------
+
+Figure 2 depicts the main elements of Configuration ML language and how they map to implementation elements.
+
+.. image:: images/configurationml085-f2.gif 
+
+Figure 2 The main elements of Configuration ML
+
+The elements shown in yellow are part of the Configuration ML. The elements shown in blue are implementation specific elements. For most of the Configuration ML elements shown in the Figure 2 there is a corresponding XML element. Those elements are defined in chapter 6. The elements named inside brackets represent either feature or setting specific XML elements as explained in chapter 3.4. The cardinalities of the elements are shown next to the connecting lines. The proximity of the cardinality marking defines the reading direction, for example "configuration can have any number of features".
+
+3.2 Configuration
+-----------------
+
+Configuration is the top level concept in Configuration ML. Configuration has three main roles:
+
+1. Defines configuration elements in terms of features and settings (chapter 3.3)
+2. Defines views for visually rearranging settings (chapter 3.5)
+3. Defines data (values) for settings (chapter 3.4)
+
+Any configuration can have all the above rules or just one of them. Configuration can also just contain other configurations as explained in chapter 3.2.2.
+
+3.2.1 Release specificity
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Configuration ML is agnostic to versioning of software. Managing multiple versions of software component(s) that have varying configurability capabilities will typically require multiple (independent) Configuration ML documents. Release element of meta element can be used to identify the release of a software component, platform or product in question if required.
+
+3.2.2 Hierarchical configurations
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Configurations are not typically defined in isolation, but they are parts of other configurations. To support this configuration can contain any number of other configurations (also called 'sub-configurations') as shown in the Figure 2. This enables features (including their settings), views, and data of a configuration to be defined using other configurations, which all can also be used independently of the including configurations when needed. The containment hierarchy of configurations would typically follow software or product architecture, or/and organisation developing the software or product.
+
+For example when defined according to software architecture of a terminal product, there would be a 'master' configuration for the product itself that could include configurations of manufacturer specific platforms. These platform configurations could itself consist of configurations defining each architecture domain and eventually each subsystem and component in the platform. Each of these component configurations could define the relevant features, settings, and default values, while including configurations typically refine the values further.  
+
+Each of the configurations can be created and used independently, in case they contain all the required includes so that referred setting definitions can be found. In addition they might override some or all the default values of the settings defined in included configurations.
+
+Please note that only data (that is, setting values) of the contained configurations can be overridden but not views, features, or settings.
+
+As a special case data of sequential settings can also be defined incrementally. In this case configuration extends (as a contrary to overriding) data of a setting that is defined in any of the included sub-configurations.
+
+3.2.3 Structuring configurations to files
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Typically features need to created and maintained by several persons/organisation and therefore storing all feature definitions into one file would cause problems. The definitions of a configuration can be split to any number of XML files by using include elements of XInclude specification [2]. Therefore it is possible to have each of the sub-configurations in own files. The only constraints are that every included file itself must be a complete valid Configuration ML XML document (that is, with configuration as the root element). When using multiple Configuration ML files it is also important to make sure that every feature and setting is defined only once. Refining features or setting is not allowed except when using view definitions (see chapter 3.5).
+
+When under single root configuration there exists multiple configurations with each own values, the priority of the values depends on the order: values later in XML document tree traversal order overrides any earlier values.
+
+An example hierarchy of files is shown in Figure 3.
+
+.. image:: images/configurationml085-f3.gif 
+
+Figure 3 An example hierarchy of configuration files
+
+In the example, there is two full configurations, one for product family and other for product variant (customised by operator). These configuration are composed by using includes. In a way, product family configuration is a subset of product variant configuration, and thus product variant could also include product family configuration and refine it further with product and variant specific definitions. However having each of the stakeholder represented as an a independent configuration, allows composing any kind of configuration more freely (e.g. free ordering, selecting only a subset). The order of inclusions defines also the override order, effectively acting as a method to define the inheritance order of configurations.
+
+Only a subset of XInclude specification is required[1] to be supported with Configuration ML. First of all, support for inclusion of local resources with relative URI is required. All included resources are to be parsed as xml and therefore parse attribute is not required. Also, support for xi:fallback element is not required. Refer to chapter 4.5 for complete list of supported attributes of xi:include element.
+
+.. [1] "Required" means here that some tools might choose to support more that what is required by this specification but must not assume the same from other tools.
+
+3.3 Features and settings
+-------------------------
+
+3.3.1 Defining features and settings
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Each configuration defines zero or more configuration elements in terms of features and settings. A feature groups together related settings. One setting describes a certain configuration capability implemented in software. Every feature must be identified uniquely using ref attribute. Each feature must be unique and defined only once in configuration including any sub-configurations included in it. In the same way every setting must be uniquely identified inside a feature. Once feature or setting is defined, it cannot be anymore redefined or extended elsewhere in the configuration.  
+
+3.3.2 Linking implementation to settings
+----------------------------------------
+
+Implementations of settings are defined in a separate file(s) as already shown in Figure 2. No implementation is defined on feature level but every setting can and should have its own implementation. Relative XPATH location path definitions are used to link the setting implementations to the settings. To create a location path that is unique in the configuration the ref path of the feature and setting is concatenated together.
+
+3.4 Data
+--------
+
+3.4.1 Defining values
+^^^^^^^^^^^^^^^^^^^^^
+
+One of the main roles of configuration is to define values for settings. Values can be defined only for settings that have been declared in the configuration (including any sub-configurations). Although there can be only one data element containing the values in a configuration, all sub-configuration can also contain own data elements and therefore also values.
+
+When values can be defined for settings in multiple places inside a configuration, it is important to understand the priority rules for interpreting them. One of the main use cases of Configuration ML is to allow overriding values of settings that were already defined in the included configuration. This is accomplished by utilizing normal xinclude expansion rules. In principle, include statements found from a configuration are expanded so that included document becomes a part of the including document. Prioritization of overrides is done by ordering the inclusions properly in the configuration.
+
+Figure 4 shows example configuration hierarchy on top, and the processed (expanded) version on the bottom. In this example, value 3 is applied to setting A/B.
+
+.. image:: images/configurationml085-f4.gif
+
+Figure 4 Priority of values
+
+As a special case, data of sequential settings can also be defined incrementally. In this case configuration can optionally extend (as a contrary to overriding) data of a setting that is defined in any of the included sub-configurations. This behaviour is controlled using extension policy of the setting data element (chapter 6.9). The extension can either append the new data to the end of existing data or prefix the existing data. If every configuration in the Figure 4 would contain value with append policy, then the actual data of that setting would be constructed in order of inclusions; first item(s) would be used from sub3.confml and the last items from the main configuration.
+
+Most of the settings defined in configurations are meant to be configured on product or customer level. In order to allow defining the value of read-only attribute, values defined for settings that are defined directly in the same configuration do not need to obey read-onlyness statement of setting. Essentially this means that read-only settings can be modified locally in the defining configuration (which is usually in the same file as the setting definition), in other configurations (usually in other files) it is locked for modifications.
+
+A configuration can directly define value at most only once of each setting.
+
+3.4.2 Linking settings and values
+---------------------------------
+
+Values of a configuration are defined using element. Values can be defined for zero or more settings. Relative XPATH[6] paths are used to link values to settings on two levels: first on feature level and then on a setting level. See Figure 5 for illustration of how ref attributes are used.
+
+.. image:: images/configurationml085-f5.gif 
+
+Figure 5 Linking settings and values
+
+Elements under data elements that do not match to any setting should be preserved during all processing but can be excluded from validation.
+
+3.5 Views
+---------
+
+View definitions in configurations can be used to visually  rearrange selected features and settings into new structure regardless how they where defined originally. By default settings are clustered according to features they are defined in but with views this can be overridden by use of group elements. Support for hierarchical groups is not limited.
+
+Any number of views can be defined in a configuration (including its sub-configurations) and it is up to tool or user of the tool to choose the active view if and when needed. Views are useful for creating for example terminal product specific views that show only the relevant settings and hide all the others. In addition to grouping selected features and settings, additional setting and option definitions can also be defined. This can be used for example to provide additional documentation for the user or to allow only restricted set of values to be defined. These additional definitions must never change the original meaning of the settings but can only restrict valid values even further from what was defined in the original setting definition. Therefore set of valid values according to the view must be a subset of valid values, as defined by the original setting definition. When validating data it is possible to use these additional restrictions in the active views also. As an example, if setting was originally defined to accept only values from 3 to 100, a view can add additional constraint that only allows odd numbers between 50 and 100. However, it would be illegal for view to define range from 2 to 110.
+
+It is important to note that view only affects how the features, settings, and values are visualized and optionally validated. The view must not have any effect to meaning (including type and data reference) of it or existence of data, when using data for example for building a configuration. Therefore all constraints and dependencies in original setting definitions apply whether or not the features and/or settings are part of the active view.
+
+================================
+4. Common definition conventions
+================================
+
+This document defines Configuration ML language and its semantics. This section describes the conventions used in Configuration ML. These conventions are based on [4].
+
+4.1 Structure
+-------------
+
+The language definition is structured in the following way:
+
+- An abstract definition of the elements, attributes, and content models, as appropriate.
+- A sub-section for each element; These sub-sections contain the following components:
+
+ - A brief description of the element,
+ - A definition of each attribute or attribute collection usable with the element, and
+ - A detailed description of the behaviour of the element, if appropriate.
+
+Examples are provided with most of the definitions. Please note that they typically only show the element and attribute relevant for the definition in question, and therefore should not be taken as complete Configuration ML examples. More complete examples are provided in implementation markup language specifications.
+
+4.2 Syntactic Conventions
+-------------------------
+
+.. list-table::
+
+   - - expr ?
+     - Zero or one instances of expr are permitted.
+   - - expr +
+     - One or more instances of expr are required.
+   - - expr *
+     - Zero or more instances of expr are permitted.
+   - - a ; b
+     - Expression a and b are required in no specific order.
+   - - a , b
+     - Expression a is required, followed by expression b.
+   - - a | b
+     - Either expression a or expression b is required.
+   - - a - b
+     - Expression a is permitted, omitting elements in expression b.
+   - - parentheses
+     - n is contained within parentheses, evaluation of any sub-expressions within the parentheses take place before evaluation of expressions outside of the parentheses (starting at the deepest level of nesting first).
+   - - defining required attributes
+     - When an element requires the definition of an attribute, that attribute name is followed by an asterisk (*).
+   - - defining the type of attribute values
+     - When a module defines the type of an attribute value, it does so by listing the type in parentheses after the attribute name.
+   - - defining the legal values of attributes
+     - When the legal values are defined for an attribute, it does so by listing the explicit legal values (enclosed in quotation marks), separated by vertical bars (|), inside of parentheses following the attribute name. If the attribute has a default value, that value is followed by an asterisk (*). If the attribute has a fixed value, the attribute name is followed by an equals sign (=) and the fixed value enclosed in quotation marks.
+
+4.3 Content Types
+-----------------
+
+Minimal, atomic content models are defined for each element. These minimal content models reference the elements in the language itself. They may also reference elements in other languages upon which the language depends. Finally, the content model in some cases requires that text be permitted as content to one or more elements. In these cases, the symbol used for text is PCDATA[3]. This is a term refers to processed character data. Content type can also be ANY, meaning that any elements can be supported. A content type can also be defined as EMPTY, meaning the element has no content in its minimal content model.
+
+4.4 Attribute Types
+-------------------
+
+Following table lists definitions for all used XML attribute types. 
+
+.. list-table::
+
+   - - Attribute Types
+     - Definition
+   - - CDATA
+     - Character data [3]
+   - - IDREF
+     - A reference to a document-unique identifier [3]
+   - - NMTOKEN
+     - A name composed of only name tokens as defined in XML 1.0 [3]. All leading and trailing whitespace is removed but no whitespace is allowed within the value itself.
+   - - NMTOKENS
+     - A whitespace separated list of NMTOKENs.
+   - - NUMBER
+     - Sequence consisting only digits ([0-9]) [3]
+   - - URI
+     - A Uniform Resource Identifier [12].
+   - - XPATH (path)
+     - An XPATH [6] location path. Support for only relative element location paths defined in abbreviated syntax is required. Only subset of XPATH language is supported; refer to examples for details.
+   - - 
+     - 
+   - - xs:token
+     - Whitespace-replaced and collapsed strings as defined in XML Schema [7]. In addition to removing all leading and trailing whitespace, also all consecutive spaces, carriage returns, linefeeds and tabs within the value itself are replaced by a single space.
+
+4.5 Naming conventions
+----------------------
+
+Element, attribute, and type names are composed of words in the English language, using the British English spellings.
+
+Lower Camel Case (LCC) is used for naming attributes, elements, and types. Lower Camel Case capitalizes the first character of each word except the first word and compounds the name.
+
+=====================
+5. Common definitions
+=====================
+
+This chapter contains common attribute and element definitions used by elements in Configuration ML and setting implementation languages.
+
+.. list-table::
+
+   - - Elements
+     - Attributes
+     - Content Model
+   - - `elements supporting CommonAttrs <#_Common_attributes_(CommonAttrs)>`_
+     - id (NMTOKEN)
+     - N/A
+   - - `meta <#_Meta_elements>`_
+     - CommonAttrs
+     - id?; date?; owner?; editor?; status?; version?; platform?; product?; release?; customer?; origin?; target?; desc?; icon?; link*
+   - - `desc <#_The_desc_element>`_
+     - CommonAttrs, xl:href (URI), xl:title (CDATA)
+     - PCDATA
+   - - `icon <#_The_icon_element>`_
+     - CommonAttrs, xl:href* (URI), xl:title (CDATA)
+     - EMPTY
+   - - `link <#_The_link_element>`_
+     - CommonAttrs, xl:href* (URI), xl:title (CDATA)
+     - EMPTY
+   - - xi:include
+     - CommonAttrs, href* (URI)
+     - EMPTY
+
+Elements starting with xi namespace prefix are defined in XInclude[2]. Only listed attributes are supported for those elements. The rest of the elements are defined in the following sections.
+
+5.1 Common attributes (CommonAttrs)
+-----------------------------------
+
+The CommonAttrs attribute collection defines common attributes used by all Configuration ML elements. These attributes don't belong to any namespace and therefore must not be prefixed. These attributes are optional always.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - id
+     - NMTOKEN
+     - not defined
+     -  The identifier of an element. Not used within language for identification. If defined ) the id of an element must be unique within the user interface definition. Typically descriptive ids that describe the purpose of the element should be used.
+
+Example::
+
+  <feature id="myfeatureid">
+   <setting id="thesetting"/>
+  </feature>
+
+5.2 Meta elements
+-----------------
+
+The meta elements define common metadata for certain elements in configuration and setting implementation documents. The meta element is the parent for all other meta elements. Typically meta element is the first child of the root element. None of the meta elements have any attributes but all the content is defined as PCDATA.
+
+In addition to common elements the following meta specific elements are defined in this specification.
+
+.. list-table::
+
+   - - Elements
+     - Attributes
+     - Content Model
+   - - id
+     - CommonAttrs
+     - PCDATA
+   - - date
+     - CommonAttrs
+     - PCDATA in the format CCYY-MM-DD\[z\|\(-\|+\)hh\:mm\]
+   - - owner
+     - CommonAttrs
+     - PCDATA
+   - - editor
+     - CommonAttrs
+     - PCDATA
+   - - status
+     - CommonAttrs
+     - PCDATA
+   - - version
+     - CommonAttrs
+     - PCDATA
+   - - platform
+     - CommonAttrs
+     - PCDATA
+   - - product
+     - CommonAttrs
+     - PCDATA
+   - - release
+     - CommonAttrs
+     - PCDATA
+   - - customer
+     - CommonAttrs
+     - PCDATA
+   - - origin
+     - CommonAttrs
+     - PCDATA
+   - - target
+     - CommonAttrs
+     - PCDATA
+
+The date is defined according to data type 'date' of XML Schema [7]. UTC time zone can be defined with letter Z at the end of the date string. Other time zones are represented by their difference from UTC in the format +hh:mm or -hh:mm. If no time zone is defined then it is undefined. Meta element can be extended by defining new child elements in a separate namespace.
+
+Example::
+
+  <configuration>
+   <meta>
+    <date>2006-06-19</date>
+    <owner>John Smith</owner>
+    <editor>John smith Junior</editor>
+    <status>draft</status>
+    <platform>S60</platform>
+    <product>N99</product>
+    <release>3.9</release>
+    <desc>Reference configuration</desc>
+    <customer>MegaOperator</customer>
+   </meta>
+  </configuration>
+
+5.3 The desc element
+--------------------
+
+The desc element can be used for description or documentation for any element. The data can be defined either as the content of the element or using xl:href attribute.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions
+   - - xl:href
+     - URI
+     - not defined
+     - Used to define the location of external description or documentation.
+       From XLink [5].  
+   - - xl:title
+     - CDATA
+     - not defined
+     - Used to define title for the link defined using xl:href.
+       From XLink [5].
+
+Example::
+
+  <group id="cameragroup">
+   <desc xl:href="file:howtoconfigurecamera.html" xl:title="Help"/>
+  </group>
+  <group id="someothergroup">
+   <desc>Configure the camera</desc> 
+  </group>
+
+5.4 The icon element
+--------------------
+
+The icon element can be used to define graphical icon for an element.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions
+   - - xl:href*
+     - URI
+     - not defined
+     - Used to define the location of the icon.
+       From XLink [5].  
+   - - xl:title
+     - CDATA
+     - not defined
+     - Used to define title for the link defined using xl:href.
+       From XLink [5].
+
+Example::
+
+  <group id="cameragroup">
+   <icon xl:href="file:camera.svg" xl:title="icon"/>
+  </group>
+
+5.5 The link element
+--------------------
+
+The link element can be used to locate any external resource.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions
+   - - xl:href*
+     - URI
+     - not defined
+     - Used to define the location of the resource.
+       From XLink [5].  
+   - - xl:title
+     - CDATA
+     - not defined
+     - Used to define title for the link defined using xl:href.
+       From XLink [5].
+
+Example::
+
+  <group id="cameragroup">
+   <link xl:href="http://coolcameras.html" xl:title="camera shop"/>
+  </group>
+
+===================
+6. Configuration
+===================
+
+The Configuration ML is used define the configuration elements and values for them. The root element of the document is configuration element.
+
+The elements and attributes included in this module are:
+
+.. list-table::
+
+   - - Elements
+     - Attributes
+     - Content Model
+   - - configuration
+     - CommonAttrs, xmlns (URI = " http://www.s60.com/xml/confml/2"), version (NMTOKEN = "1.0"), name (xs:token)
+     - meta?; desc*; icon*; link*; xi:include*; feature*; view*; configuration*; data?; rfs?
+   - - `feature <#_The_header_element>`_
+     - CommonAttrs, name (xs:token), ref* (XPATH), relevant (xs:token)
+     - desc*; icon*; link*; setting*
+   - - `setting <#_The_include_element>`_
+     - CommonAttrs, relevant (xs:token), required (NMTOKEN), constraint (xs:token), readOnly (NMTOKEN), name (xs:token), type* (NMTOKEN), ref* (XPATH), minOccurs (NUMBER), maxOccurs (NMTOKEN), mapKey (XPATH), mapValue (XPATH)
+     -  desc*; icon*; link*; option*; setting*; xs:minInclusive?; xs:maxInclusive?; (line-break) xs:minExclusive?; xs:maxExclusive?; xs:pattern*; xs:minLength?; maxLength?; totalDigits?; property*; localPath*; targetPath*)
+   - - localPath
+     - CommonAttrs, constraint (xs:token), readOnly (NMTOKEN), required (NMTOKEN), map (XPATH)
+     - desc*; icon*; link*
+   - - targetPath
+     - CommonAttrs, constraint (xs:token), readOnly (NMTOKEN), required (NMTOKEN), map (XPATH)
+     - desc*; icon*; link*
+   - - `option <#_The_views_element>`_
+     - CommonAttrs, name* (xs:token), value* (CDATA), relevant (xs:token), map (XPATH)
+     - desc*; icon*; link*
+   - - `property <#_The_property_element>`_
+     - CommonAttrs, name (xs:token), value (CDATA), unit (xs:token)
+     - desc*; icon*; link*
+   - - `view <#_The_view_element_1>`_
+     - CommonAttrs, name* (xs:token)
+     - meta?; desc*; icon*; link*; group*
+   - - `group <#_The_group_element>`_
+     - CommonAttrs, name* (xs:token)
+     - group*; desc*; icon*; link*; setting*
+   - - xs:minInclusive 
+     - value (NUMBER)
+     - EMPTY
+   - - xs:maxInclusive
+     - value (NUMBER)
+     - EMPTY
+   - - xs:minExclusive 
+     - value (NUMBER)
+     - EMPTY
+   - - xs:maxExclusive
+     - value (NUMBER)
+     - EMPTY
+   - - xs:pattern
+     - value (xs:token)
+     - EMPTY
+   - - xs:length
+     - value (NUMBER)
+     - EMPTY
+   - - xs:minLength
+     - value (NUMBER)
+     - EMPTY
+   - - xs:maxLength
+     - value (NUMBER)
+     - EMPTY
+   - - xs:totalDigits
+     - value (NUMBER)
+     - EMPTY
+   - - `data <#_The_data_element>`_
+     - CommonAttrs
+     - ANY
+   - - `rfs <#_The_rfs_element>`_
+     - CommonAttrs
+     - ANY
+
+All restriction elements (known as facets) starting with xs namespace prefix are defined in XML Schema [7]. Only listed attributes are supported for those elements. The rest of the elements are defined in the following sections.
+
+6.1 The configuration element
+-----------------------------
+
+The configuration element is the root element of Configuration ML document. Version of the used specification must be defined using version attribute.
+
+Typically first child element under configuration is meta element. After that feature, view, and data elements follow.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions.
+   - - version*
+     - NMTOKEN
+     - not defined
+     - The version of the document. This attribute is mandatory and its value must be "1.0".
+   - - name
+     - xs:token
+     - not defined
+     - Textual name of the configuration. 
+
+Example::
+
+  <?xml version="1.0"?>
+  <configuration xmlns="http://www.s60.com/xml/confml/2" version="1.0" name="myfirstconfiguration">
+   <meta/>
+   <feature/>
+   <data/>
+   <rfs/>
+  </configuration>
+
+6.2 The feature element
+-----------------------
+
+The feature element defines one or more configuration elements in terms of settings. Feature element is used to group settings into logical collections. A configuration ML feature typically maps into a feature of a subsystem, a platform or a product.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions.
+   - - name
+     - xs:token
+     - not defined
+     - Textual name of the feature.
+   - - ref*
+     - XPATH (path)
+     - not defined
+     - Uniquely identifies the feature in the configuration.
+       A path to the feature specific element containing values for all the setting. The path must be defined using )relative location path in abbreviated XPATH [6] form. The path must map to at most one feature element.
+       Together with ref element of a setting, the path must be relative location path to a setting specific element in abbreviated XPATH [6] form.  
+       The ref attribute of the feature is also used for identifying settings inside view definitions.
+       This attribute is mandatory for all features.
+   - - relevant
+     - xs:token
+     - true
+     - Defines whether the feature is used. Can be used to exclude all the settings of the feature that are not relevant in some context. Values with this property value false for the parent feature are not used.
+       The grammar of expression language is defined in chapter 8.
+
+Example::
+
+  <feature id="f_camf_00" name="Camcorder Features" ref="CamcorderFeatures">
+   <desc/>
+   <setting/>
+   <setting/>
+  </feature>
+
+6.3 The setting element
+-----------------------
+
+The setting element defines a single configurable setting. When used inside a view element, setting element is used to include the setting in a view, and possibly redefine any of its properties.
+
+Sequential settings are defined using hierarchical settings definitions where setting element contains one or more setting definitions. The settings of each item in a sequence are defined using sequence elements under the setting element. The number of settings in a sequence can be limited with minOccurs and maxOccurs attributes.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions.
+   - - name
+     - xs:token
+     - ""
+     - Textual name of the setting. To be used in user interfaces of tools and documentation.
+   - - type*
+     - NMTOKEN
+     - not defined
+     - Type of the element. Refer to chapter 7 for supported types. Attribute is not allowed when element is inside a view.
+   - - ref*
+     - XPATH (path)
+     - not defined
+     - Uniquely identifies the setting under the parent feature. A path to the element containing value for the setting. The path must be defined using relative location path in abbreviated XPATH [6] form. The path must map to at most one value element. The ref attribute is also used for uniquely identifying settings inside view definitions and in setting implementation. Because of this ref of a setting must be unique under the feature. This attribute is mandatory for all settings under a feature element. Attribute is not allowed when element is inside a view.
+   - - constraint
+     - xs:token
+     - true
+     - Defines any constrains for the values supported by the setting. Values with this property evaluating to false are invalid. The grammar of expression language is defined in chapter 8.
+   - - relevant
+     - xs:token
+     - true
+     - Defines whether the setting is used. Can be used to exclude settings that are not relevant in some context. Values with this property evaluating to false are not used. The grammar of expression language is defined in chapter 8.
+   - - readOnly
+     - NMTOKEN
+     - false
+     - Defines the settings as non-modifiable. Values to settings with this attribute value true are restricted from being defined outside the configuration where they where originally defined in. Therefore only the initial default values can be defined for read only settings. The supported values are true and false.
+   - - required
+     - NMTOKEN
+     - false
+     - Defines whether a value must be defined for the settings before the configuration is complete. Can be used to force user to define a value for settings that can not use any default value. Missing required value must not prevent saving configuration at any point. In case defined for a setting of type sequence, requiredness mandates having at least one item-setting defined. In case defined for a sub-setting of a sequence, requiredness is evaluated separately for each item-setting. The supported values are true and false. The use of requiredness information is tool specific. Completeness of a configuration might be required by a configuration tool in case of validation or generation of a variant. 
+   - - minOccurs
+     - NUMBER
+     - 0
+     - The minimum number of value elements allowed in case of sequence type of setting.
+   - - maxOccurs
+     - NMTOKEN
+     - "unbounded"
+     -  The maximum number of value elements allowed in case of sequence type of setting. When any number of elements are allow, value "unbounded" can be used.
+   - - mapKey
+     - XPATH (path)
+     - not defined
+     - In case setting is used as enumeration source for name-id mapping (see chapter 6.11), value of this attribute defines the key part of the enumeration. If used, setting's type must be sequence. All the values residing in the attribute must be unique within the sequence.
+   - - mapValue
+     - XPATH (path)
+     - not defined
+     - In case setting is used as enumeration source for name-id mapping (see chapter 6.11), value of this attribute defines the value part of the enumeration. If used, setting's type must be sequence.
+
+Example::
+
+  <setting constraint=". &gt; '1'" name="Audio Codec" type="Selection" ref="AudioCodec">
+   <desc/>
+   <option/>
+   <option/>
+  </setting>
+  <setting id="bookmarks" type="sequence" maxOccurs="50" ref="Bookmark">
+    <setting id="bookmark_name" name="Name" required="true" type="string" ref="Name">
+     <xs:maxLength value="50"/>
+    </setting>
+    <setting id="bookmark_serveradd" name="Server Address" required="true" type="string" ref="ServerAddress">
+     <xs:maxLength value="250"/>
+    </setting>
+  </setting>
+
+6.4 The file and folder elements
+--------------------------------
+
+The file and folder elements define the copying rules of files and folders. Both elements consist of sub-settings called localPath and targetPath. The following attributes are applicable for both of these sub-settings. For more detailed explanation along with the examples, see chapter 7.5.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions.
+   - - constraint
+     - xs:token
+     - true
+     - Defines any constrains for the values supported by the path definition.  Values with this property evaluating to false are invalid. The grammar of expression language is defined in chapter 8.
+   - - readOnly
+     - NMTOKEN
+     - false
+     - Defines the path as non-modifiable. Values to paths with this attribute value true are restricted from being defined outside the configuration where they where originally defined in. Therefore only the initial default values can be defined for read only settings. The supported values are true and false.
+   - - required
+     - NMTOKEN
+     - false
+     - Defines whether a value must be defined for the path before the configuration is complete. Can be used to force user to define a value for path that can not use any default value. Missing required value must not prevent saving configuration at any point. The supported values are true and false. The use of requiredness information is tool specific. Completeness of a configuration might be required by a configuration tool in case of validation or generation of a variant.
+   - - map
+     - XPATH (path)
+     - not defined
+     - In case path definition uses symbolic paths which require resolving, the map attribute defines the xpath to sequence that contains this mapping information. See (bookmark-ref (@ (reference-format chapter) (ref-name _Ref210621287)) 7.5) for more elaborate description.
+
+6.5 The option element
+----------------------
+
+The option element defines pre-defined named value for a setting. The value stored in the data is defined using value attribute. It can be used with any type of setting but when used for a selection or multiSelection, only the values defined using option element are allowed. In case of other types, not all allowed values need to be pre-defined making it possible to support for example free form input in addition to mostly used values. The values defined by option element must be valid values for the setting; options with non-valid values (also taking account the additional restrictions defined in a view) are not allowed.
+
+When used inside a view element, option element is used to add or redefine any of the options.  
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions. 
+   - - name*
+     - xs:token
+     - not defined
+     - Optional descriptive name for the value. Can be used in tools instead of the value itself.
+   - - value*
+     - CDATA
+     - not defined
+     - The value of the option as used in elements under data element. Note that this value and the implementation specific value used at runtime are not necessarily the same.
+   - - relevant
+     - xs:token
+     - true()
+     - Defines whether the option is valid. Can be used to exclude options that are not relevant in some context. Options with this property evaluating to false are not applicable for the setting. The grammar of expression language is defined in chapter 8.
+   - - map
+     - XPATH (path)
+     - not defined
+     - Can be used in case the setting where option resides uses name-id mapping (see chapter 6.11). Value of this attribute defines the path to the setting, where from values and names are fetched. Note that referred setting must be of type sequence.
+
+Example::
+
+  <setting name="MMS Message Size" type="Int" ref="MMSMessageSize">
+   <option name="small" value="0"><desc/></option>
+   <option name="medium" value="2" relevant="MMSMedium = true"/>
+   <xs:minInclusive value="0"/>
+   <xs:maxInclusive value="10"/>
+  </setting>
+
+6.6 The property element
+------------------------
+
+The property element defines additional properties for settings. Property elements can be used for example to define additional constraints for settings that are not expressible using other attributes. The use of properties is application specific.  
+
+Refer to chapter 9 for recommended names of commonly used properties.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions.
+   - - name*
+     - xs:token
+     - Not defined
+     - Identifier of the property.
+   - - value*
+     - CDATA
+     - Not defined
+     - The value of the property.
+   - - unit
+     - xs:token
+     - As defined for the property
+     - The unit of the value.
+
+Example::
+
+  <setting>
+   <property name="mime" value="image/svgt image/bmp"/>
+   <property name="resolution" value="100x100"/>
+   <property name="maxSize" value="100" unit="kB"/>
+
+6.7 The view element
+--------------------
+
+The view element defines a subset of settings under one or more group elements. Views can therefore be used to group needed elements for easy visualization and manipulation. The view elements are defined directly under configuration element.
+
+Any number of views can be defined in a configuration, but typically only one of them can be then activated at time by the application using configuration.
+
+The view is defined using one or more groups. Settings in views are always defined inside a group. A setting can exist only once in a single view. All the settings referred there must have been previously defined using feature and setting elements. All the data elements and their values in the configuration still exist, and should be validated and used, even though they could be hidden from the active view. Because of this, tools might optionally still visualize values that are invalid, but are not part of the active view. Refer to chapter 3.5 for more information about use of views.
+
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions. 
+   - - name*
+     - xs:token
+     - not defined
+     - The name of the view.
+
+Example::
+
+  <view name="Isetta View">
+   <desc/>
+   <group/>
+   <group/>
+  </view>
+
+6.8 The group element
+---------------------
+
+The group element (re-)defines the logical grouping of settings inside a view. When view is not used, the settings are clustered according to features they are defined in. Group elements therefore can be used to create virtual features with settings selected from one or more features.
+
+Settings included in group are identified using ref attribute of the setting. Please notice that ref of the setting can refer only to one setting.
+
+Groups can contain groups for creating hierarchical grouping. It is not possible to directly use features as grouping elements in group hierarchy; views always contain only groups and/or settings.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions. 
+   - - name*
+     - xs:token
+     - not defined
+     - Textual name of the group.
+
+Example::
+
+  <group name="Common Settings">
+   <desc>A group description</desc>
+   <setting ref="CamcorderFeatures/MMSMessageSize" name="MMS Message Size" type="Int">
+    <option name="small" value="1"/> <!-- was zero -->
+    <option name="medium" value="2"/>
+    <option name="large" value="4"/> <!-- added -->
+    <xs:minInclusive value="0"/>
+    <xs:maxInclusive value="9"/> <!-- was 10 -->
+    <desc>A better description added here</desc>
+   </setting>
+   <group>
+    <setting ref="OtherFeatures/*"/> <!-- selects all the settings of the feature -->
+   <group>
+  </group>
+   <setting ref="CamcorderFeatures/othersetting"/>
+  </group>
+  </group>
+
+6.9 The data element
+--------------------
+
+The data defines the values of the configuration. Only one data element is allowed directly under a configuration element, but because of the hierarchical nature of configurations, there can be several data elements in a configuration. Values under data element can be for example product or operator specific, or they can be even default values defined by the owner of the feature.
+
+Following attributes are supported for all descendant elements of the data element.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions. 
+
+The following attributes are supported for all descendant elements of data element that define data for sequence settings only. These attributes can be defined only for item-setting level elements and not for sub-setting level elements.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - extensionPolicy
+     - NMTOKEN
+     - "replace"
+     - Defines whether the setting replaces or extends the previously defined data of the sequence setting. Extension allows incremental definition of sequence item-settings in multiple configurations. This attribute can be defined only for the first item-setting. Same extension policy is automatically applied to all other defined item-settings of the same setting in that configuration. The valid values are: replace (default), append and prefix. By default (extensionPolicy="replace") the data defined completely replaces all the items that where previously defined in any included configuration according to priority rules defined in chapter 3.4.1. When this attribute has value "append" the defined sequence items are interpreted to be added to the end of the previously defined items. When this attribute has value "prefix" the defined sequence items are interpreted to be added to the front of the previously defined items. In both cases with append and prefix, any changes made to data in an included configuration will therefore be automatically included as part of the settings data. Refer to chapter 7.6 for full explanation of sequence templates.
+   - - template
+     - NMTOKEN
+     - false
+     - Marks sequence item-setting to be a sequence template instead. If template has value true , then the values of the sub-settings are not used as item-settings. Setting templates can be defined for a setting only in the same configuration that defined the setting. There can be at zero or one template per each setting. Refer to chapter 7.6 for full explanation of sequence templates.
+
+The following attributes are supported for data elements, which define data for name-id mapping cases (see chapter 6.11).
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - map
+     - XPATH
+     - not defined
+     - Defines the xpath to a setting used for name-id mapping.
+
+The names of descendant elements of data element are feature-specific. The name of the element is defined using the ref attribute of the feature. Under these feature specific elements there are one or more setting specific elements each of them defining a value for a setting. The name of these elements under one feature is defined using the ref attribute of the setting.
+
+See chapter 7 for setting type specific data examples.
+
+6.10 The rfs element
+--------------------
+
+The data defines the Restore Factory Setting (RFS) policies of the settings. RFS policy for a setting is defined under feature and setting specific elements, as defined using ref attributes of the feature and setting in question.  
+
+Only one rfs element is allowed directly under a configuration element, but because of the hierarchical nature of configurations, there can be several rfs elements in a configuration. Values under rfs element can be for example product or operator specific or they can be default values defined by the owner of the feature. The RFS policy values are always of Boolean type. By default no settings are restored in RFS. In case there are multiple settings that are stored into a single restorable entity such a Central Repository key, then the whole entity is restored always in case there even one of the settings have RFS enabled.
+
+Following attributes are supported for all descendant elements of data element.
+
+.. list-table::
+
+   - - Attributes name
+     - Type
+     - Default
+     - Description
+   - - CommonAttrs
+     - 
+     - 
+     - Common attribute definitions defined in Common definitions. 
+
+Example::
+
+  <configuration>
+   <rfs>
+    <MyFeature>
+     <MySetting>true</MySetting>
+     <MyOtherSetting>true</MyOtherSetting>
+    </MyFeature>
+    <MyOtherFeature>
+     <MyBooleanSetting>true</MyBooleanSetting> <!-- can cause also other Boolean settings
+       to be restored in case they are all stored into single Central Repository key -->
+    </MyOtherFeature>
+   </rfs>
+  </configuration>
+
+6.11 Name-Id mapping for setting elements
+-----------------------------------------
+
+In some cases, dynamically created name-id sequences act as enumeration values for other settings. As an example, one of the configurations define a setting for listing available device access points. Each access point has identifier, name and some other attributes. Other configurations use these definitions in their own settings, so that one of these predefined access points can be selected (e.g. device default access point). The mechanism to do this is explained in this chapter.
+
+At first, setting used as name-id mapping source is defined. This setting must be type of sequence, and it must have attributes mapKey and mapValue. Attribute mapKey defines the mapping key for a subsettings, while mapValue defines the value part. Example of this is seen below (both the feature definition and related data)::
+
+  <feature name="Connectivity Settings" ref="ConnectivitySettings">
+   <setting type="sequence" maxOccurs="10" mapKey="APID" mapValue="APName" name="Device Accesspoints" ref="DeviceAccesspoint"> 
+    <setting name="Name" ref="APName" type="string" required="true" /> 
+    <setting name="ID" ref="APID" type="int" required="true" /> 
+    <setting name="Comments" ref="Comments" type="string" /> 
+   </setting>
+  </feature>
+  <data>
+   <ConnectivitySettings>
+    <DeviceAccesspoint>
+     <APName>Internet</APName>
+     <APID>2</APID>
+    </DeviceAccesspoint>
+    <DeviceAccesspoint>
+     <APName>Operator</APName>
+     <APID>3</APID>
+    </DeviceAccesspoint>
+    <DeviceAccesspoint>
+     <APName>MMS</APName>
+     <APID>4</APID>
+    </DeviceAccesspoint>
+   </ConnectivitySettings>
+  </data>
+
+These definitions then can be used in the referring settings. The mechanism to do that is to use option element. Option element defines map-attribute, which refers to name-id mapping source. Referring setting can define multiple mappings via multiple options. Separation of possibly conflicting identifiers is done by using setting paths along with the intended key values. Also mixing of non-mapping values (e.g. plain named option or freeform text) with mapping options is allowed. In principle it is possible to have a non-mapping value with the exact same syntax than reserved for mapping value. Therefore in data section, mapping definitions are separated from value definition by stating mapping XPath in separate attribute, called "map".
+
+See the example below for clarification::
+
+  <feature name="Device Defaults" ref="DeviceDefaults">
+    <setting name="Device Default Accesspoint" type="int" ref="DeviceDefaultAccesspoint">
+     <option map="ConnectivitySettings/DeviceAccesspoint"/>
+     <option map="SomeOther/Possible/AccessPointList"/>
+     <option name="No accesspoint" value="-1"/>
+    </setting>
+  </feature>
+  <data>
+   <DeviceDefaults>
+     <DeviceDefaultAccesspoint map="ConnectivitySettings/DeviceAccesspoint[@key='2']" />
+   </DeviceDefaults>
+  </data>
+
+In general it is not encouraged to create settings with multiple mapping options, since this might provide confusing views to the end user of configuration tools, which are processing these definitions. E.g. in case several name-id maps define the same names, this might result duplicate name entries on tool UI. In case of conflicts emerging from multiple mapping options, tools must report this. Tools must also enforce the uniqueness of mapKey within the sequence settings.
+
+=============
+7. Data types
+=============
+
+The following data types are supported.
+
+- `int <#the-int-data-type>`_ (integer)
+
+- `boolean <#the-boolean-data-type>`_
+
+- `real <#the-real-data-type>`_
+
+- `string <#the-string-data-type>`_
+
+- `file and folder <#the-file-and-folder-types>`_ 
+
+- `sequence <#the-sequence-data-type>`_
+
+- `selection <#the-selection-data-type>`_
+
+- `multiSelection <#the-selection-data-type>`_
+
+- `dateTime <#the-datetime-duration-time-and-date-data-types>`_
+
+- `duration <#the-datetime-duration-time-and-date-data-types>`_
+
+- `time <#the-datetime-duration-time-and-date-data-types>`_
+
+- `date <#the-datetime-duration-time-and-date-data-types>`_
+
+7.1 The int data type
+---------------------
+
+The data type int represents signed integer.  The lexical representation of the int data type is a sequence of digits.  Leading zeros and sign ('+' (optional for positive values) or '-') are permitted, but decimal points are not. 
+
+By default all integer values are valid, although implementation might restrict that. 
+
+Following XML Schema facets can be used to define additional restrictions for the value:
+
+- xs:minInclusive 
+
+ - The value must be greater than or equal to specified value 
+ 
+- xs:maxInclusive
+ 
+ - The value must be less than or equal to specified value 
+
+- xs:minExclusive
+ 
+ - The value must be greater than the specified value 
+
+- xs:maxExclusive
+ 
+ - The value must be less than the specified value 
+
+- xs:pattern
+ 
+ - Restricts values to a particular pattern represented by a regular expression 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns 
+ - Example: "\\d{1,2}" restricts the size to one or two digits 
+
+- xs:totalDigits
+ 
+ - The maximum number of digits in a number
+
+Please note that options defined for integer settings cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+Example integer type of data::
+
+    <data>
+     <Feature>
+      <Setting>123</Setting>
+      <OtherSetting>456</OtherSetting>
+      <SomeOtherSetting>999</SomeOtherSetting>
+     </Feature>
+    </data>
+
+7.2 The boolean data type
+-------------------------
+
+The data type boolean [2]_ represents logical yes/no values. The only valid values are 'true', 'false', '1', and '0'. Value '1' equals to value 'true' and '0' equals to value 'false'.
+
+Following XML Schema facets can be used to define additional restrictions for the value:
+
+- xs:pattern
+
+ - Restricts values to a particular pattern represented by a regular expression 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns 
+ - Example: "true|1" restricts the value to only "true" value
+
+Please note that options defined for Boolean settings cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+Example 'boolean' type of data::
+
+  <data>
+    <Feature>
+      <Setting>True</Setting>
+      <OtherSetting>1</OtherSetting>
+      <SomeOtherSetting>False</SomeOtherSetting>
+    </Feature>
+  </data>
+
+.. [2] The type like all the types in CofML is written with lower case 'b' although the data type correctly written always in captitalised form: 'Boolean'
+
+7.3 The real data type
+----------------------
+
+The data type real represents floating point number. The lexical representation of the real data type is a sequence of digits, optionally containing period. Leading zeros and sign ('+' (optional for positive values) or '-') are permitted. The usage of scientific notation (power of ten stated with character 'e') is also allowed.
+
+By default all real values are valid, although implementation might restrict that.
+
+Following XML Schema facets can be used to define additional restrictions for the value:
+
+- xs:minInclusive
+ 
+ - The value must be greater than or equal to specified value
+  
+- xs:maxInclusive
+ 
+ - The value must be less than or equal to specified value
+  
+- xs:minExclusive
+ 
+ - The value must be greater than the specified value
+  
+- xs:maxExclusive
+ 
+ - The value must be less than the specified value
+  
+- xs:pattern
+ 
+ - Restricts values to a particular pattern represented by a regular expression 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns
+
+Please note that options defined for real settings cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+Example real type of data::
+
+  <data>
+    <Feature>
+      <Setting>1.23</Setting>
+      <OtherSetting>-456.3242</OtherSetting>
+      <SomeOtherSetting>3.3e5</SomeOtherSetting>
+    </Feature>
+  </data>
+
+7.4 The string data type
+------------------------
+
+The data type string represents character string that may contain any Unicode character. Certain characters, namely the 'less than' symbol ()<), the ampersand (&) and the double quote (") must be escaped (using entities &lt;, &amp; and &quot; ). All the whitespace of the string values is preserved.
+
+By default, any number of any characters can be stored in a string, although implementation might restrict length or characters supported.
+
+Following XML Schema facets can be used to define additional restrictions for the value:
+
+- xs:pattern
+ 
+ - Restricts values to a particular pattern represented by a regular expression 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns 
+ - Example: "\\d{1,2}" restricts the size to one or two digits
+  
+- xs:length
+ 
+ - The exact length of value in a number
+  
+- xs:minLength
+
+ - The minimum length of value in a number
+  
+- xs:maxLength
+ 
+ - The maximum length of value in a number
+
+Please note that options defined for string settings cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+Example string type of data::
+
+  <data>
+    <Feature>
+      <Setting>Foo</Setting>
+      <OtherSetting>Bar</OtherSetting>
+      <SomeOtherSetting/> <!-- empty string -->
+    </Feature>
+  </data>
+
+7.5 The file and folder data types
+----------------------------------
+
+The data type file describes how file is copied from local file structure to target file system. The data type folder describes how folder (directory) is copied from local file structure to target file system. The value of file and folder type setting is stored as a combination of local path and target path, both being strings. Therefore string restrictions apply also to path values.
+
+Local path is defined in a relative URI form in relation to content folder used in configuration. Content folder defines all variable content for the configuration, and usually it is not bound to target file system of used software platform in any way.
+
+Target path is defined in a relative URI form in relation to either raw file system of the target software platform, or preferably in relation symbolic path of the abstracted software platform. In case symbolic paths are used, URI scheme is used to define the symbolic part. Symbolic paths are resolved to raw file system paths using mapping definitions. Mappings between symbolic paths and raw file system paths are defined in a separate mapping sequence, which is referred from the setting using that symbolic definition. In case local path is a file, and target path is a directory, local path file name is re-used when copying occurs. In case target path defines a new name for a file, renaming is done during copying.
+
+When defining data for a file or folder type of setting, and in case either of sub settings (local path or target path) has no attribute and no value definitions, they can be left out from the data definitions. Therefore only the sub settings which need data definitions are actually defined. This enables e.g. overriding of only localPath, while keeping targetPath as it was earlier defined.
+
+Both in local and target paths, the character / is used to denote separator for directories. The ending slash character in the end folder value is optional. Both paths can have readOnly and constraint attributes. Following XML Schema facets can be used to define additional restrictions for the values:
+
+- xs:pattern 
+
+ - Restricts values to a particular pattern represented by a regular expression as defined in XML Schema [7] 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns 
+ - Example: "[^./:]*\.zip" restricts the value to zip files in the current directory
+  
+- xs:length
+ 
+ - The exact length of value in a number
+  
+- xs:minLength
+
+ - The minimum length of value in a number
+  
+- xs:maxLength
+ 
+ - The maximum length of value in a number
+
+Please note that options defined for file and folder settings cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+The following example explains how to use file data type. The same example applies to folder data type as well.
+
+First in some place of the configuration, path mappings are defined using the syntax defined in chapter 6.11::
+
+  <feature ref="paths" ...>
+    <setting type="sequence" ref="allPaths" mapKey="symName" mapValue="realName...>
+      <setting type="string" ref="symName".../>
+      <setting type="string" ref="realName".../>
+    </setting>
+  </feature>
+  <data>
+    <paths>
+      <allPaths>
+        <symName>MMC</symName>
+        <realName>E:/</realName>
+      </allPaths>
+      <allPaths>
+        <symName>BUILD</symName>
+        <realName></realName>
+      </allPaths>...
+    </paths>
+  </data>
+
+These definitions can then be referred in individual settings::
+
+  <feature ref="animations" ...>
+    <setting type="file" ref="startup" ...>
+      <localPath/>
+      <targetPath map="paths/allPaths" constraint="'MMC' | 'Animations'" />
+    </setting>
+  </feature>
+  <data>
+    <animations>
+      <startup>
+        <localPath>/resources/startup.avi</localPath>
+        <targetPath>MMC://animations</targetPath>
+      </startup>
+    </animations>
+  </data>
+
+When mapping definition is used as part of the URI scheme, it does not follow the mapping syntax defined in chapter 6.11. Mapping is always done against single mapping definition instead of collection of definitions. Therefore URI scheme's mapping ID can be always resolved unambiguously. 
+
+7.6 The sequence data type
+--------------------------
+
+The data of a sequence type setting represents an ordered collection (that is, a list) of item-settings that each consists of one or more sub-settings. Each of the item-setting in the sequence must have exactly the same set of sub-settings. The sub-settings can be of any data-type, except sequence. Therefore sequence of sequences is not allowed [3]_. The sub-settings of a sequence are defined using child setting elements of the sequence setting.
+
+Following sequence specific attributes can be used to define additional restrictions for the sequences:
+
+- minOccurs
+ 
+ - The minimum allowed size for the collection in a number 
+ - Defaults to zero (0)
+ 
+- maxOccurs
+ 
+ - The maximum allowed size for the collection in a number. When any number of settings is allowed, value 'unbounded' can be used. 
+ - Defaults to 'unbounded'
+
+Value for each item-setting in a sequence is defined by repeating element with location path that matches to ref of the sequence setting. The values for each sub-setting are defined as child elements of the item-setting. Data for an empty sequence can be expressed by defining one item element with empty content.
+
+Example setting definition::
+
+  <feature ref="Feature">
+    <setting type="sequence" ref="Setting" maxOccurs="3">
+      <setting type="int" ref="IntElem"/>
+      <setting type="string" ref="StringElem"/>
+    </setting>
+    <setting type="int" ref="SomeOtherSetting"/>
+  </feature>
+
+Example data of sequence of length two::
+
+  <data>
+    <Feature>
+      <Setting>
+        <IntElem>123</IntElem>
+        <StringElem>foo</StringElem>
+      </Setting>
+      <Setting>
+        <IntElem>456</IntElem>
+        <StringElem>bar</StringElem>
+      </Setting>
+      <SomeOtherSetting>999</SomeOtherSetting>
+    </Feature>
+  </data>
+
+Example data of two empty sequences::
+
+  <data>
+    <Feature>
+      <Setting>
+      </Setting>
+      <otherSetting/>
+    </Feature>
+  </data>
+
+Because there is no parent value element that groups together all the item settings of a sequence, there can be any other settings under the same feature element.
+
+Item-settings of a sequence can be defined incrementally in multiple configurations by using append and prefix extension policies. 
+
+Example of defining in total four items for a setting in two separate configurations incrementally::
+
+  <data> <!-- This one is included by the configuration below -->
+    <Feature>
+      <Setting>
+        <IntElem>1</IntElem>
+        <StringElem>first</StringElem>
+      </Setting>
+    </Feature>
+  </data>
+  <data> <!-- This one includes the above configuration -->
+    <Feature>
+      <Setting extensionPolicy="append"> <!-- this item-setting and the following 
+      items will be appended after the item-setting in the included configuration -->
+        <IntElem>2</IntElem>
+        <StringElem>second</StringElem>
+      </Setting>
+      <Setting>
+        <IntElem>3</IntElem>
+        <StringElem>third</StringElem>
+      </Setting>
+      <Setting>
+        <IntElem>4</IntElem>
+        <StringElem>fourth</StringElem>
+      </Setting>
+    </Feature>
+  </data>
+
+When a setting element has attribute 'template' with value 'true', then that setting is considered as being setting template and not an item-setting. The values of sub-settings in a template are therefore never used as a configuration data. There can be zero or one template for each sequence setting.
+
+Setting template provides initial values for one or more sub-settings that can be utilised as initial values when constructing new item-setting. The template values are not inherited by new settings-items; instead they can be only copied as one time operation to a newly created item-setting. Modifying template data does not therefore affect in any way any of the already defined item-settings. All initial values defined in a template must be valid values. Templates can be defined only in the same configuration where the setting has been defined. Therefore templates cannot be overridden once defined.
+
+Template::
+
+  <data> 
+    <Bookmarks>
+      <Bookmark template="true"> <!-- template item for bookmark; not used as data-->
+        <iap>Internet</iap>
+        <folder>Default</folder>
+      </Bookmark>
+      <Bookmark> <!-- Normal data item: the first bookmark -->
+        <name>Nokia</name>
+        <name>www.nokia.com</name>
+        <iap>Internet</iap>
+        <folder>Default</folder>
+      </Bookmark>
+      <Bookmark> <!-- Normal data item: The second bookmark -->
+        <name>S60</name>
+        <name>www.s60.com</name>
+        <iap>Internet</iap>
+        <folder>S60</folder>
+      </Bookmark>
+    </Bookmarks>
+  </data>
+  
+.. [3] It is quite probable that support for deeper sequences is introduced in later versions of the language.
+
+7.7 The selection and multiSelection data types
+-----------------------------------------------
+
+The selection and multiSelection are special data types, that can represent any value that is defined using option elements. All option values must have the same data type for a single selection setting. The data type does not need to be explicitly defined. The data type of values can be integer, real or string. No other values than those defined by the options are accepted. No other restrictions can or need to be defined for the value.
+
+The only difference between selection and multiSelection is that selections allow only one of the option values to be defined at a time, where as multiSelection allows any number of options to be selected. The individual values of multiSelection settings are separated with whitespace. In case value has spaces in itself, then it must be enclosed within double quotes. In case string has double quotes in itself, they must be escaped with "&quot;" (see example).
+
+MultiSelection settings should be used only when all the options are closely related to single setting. It should not be used for grouping arbitrary independent settings that maybe are implemented as a single bitmask.
+
+Example::
+
+  <setting type="selection" ref="Setting">
+    <option name="FirstOption" value="17"/>
+    <option name="TheOtherOption" value="3"/>
+  </setting>
+  <setting type="multiSelection" ref="OtherSetting">
+    <option name="FirstOption" value="First value"/>
+    <option name="TheOtherOption" value="Second value"/>
+    <option name="OptionWithQuote" value="Option with &quot;"/>
+  </setting>
+  <data>
+    <afeature>
+      <Setting>17</Setting>
+      <OtherSetting>"First value" "Option with &quot;"</Setting>
+    </afeature>
+  </data>
+
+7.8 The dateTime, duration, time and date data types
+----------------------------------------------------
+
+The data types dateTime, duration, time and date can be used to represent information related times, dates or combination of them. Types are modelled according to chapter 1.1.
+
+The dateTime is specified in the following form "YYYY-MM-DDThh:mm:ss" where:
+
+- YYYY indicates the year
+- MM indicates the month
+- DD indicates the day
+- T indicates the start of the required time section
+- hh indicates the hour
+- mm indicates the minute
+- ss indicates the second
+
+All of the mentioned components are required. Time zone can (optionally) be specified either by adding "Z" behind the time (which means UTC time), or by adding an offset from the UTC time with positive or negative value behind the time (in format of hh:mm).
+
+The following is an example of dateTime declaration::
+
+  <data>
+    <Feature>
+      <Setting>2008-09-1915:42:12Z</Setting>
+      <OtherSetting>2008-10-09-11:32:02+06:00</OtherSetting>
+    </Feature>
+  </data>
+
+The duration is specified in the following form "PnYnMnDTnHnMnS" where:
+
+- P indicates the period (required)
+- nY indicates the number of years
+- nM indicates the number of months
+- nD indicates the number of days
+- T indicates the start of a time section (required if hours, minutes, or seconds are specified)
+- nH indicates the number of hours
+- nM indicates the number of minutes
+- nS indicates the number of seconds
+
+The following is an example of duration declaration::
+
+  <data>
+    <Feature>
+      <FirstSetting>P5Y</FirstSetting>
+      <SecondSetting>P5Y2M10D</SecondSetting>
+      <ThirdSetting>PT15H</ThirdSetting>
+    </Feature>
+  </data>
+
+FirstSetting defines a period of five years. SecondSetting defines a period of five years, two months and 10 days. ThirdSettings defines a period of 15 hours.
+
+Time is specified specified in similar fashion as dateTime, but only hh:mm:ss part is used. The same applies to date, but only YYYY-MM-DD part is used. Same timezone rules also apply. Example::
+
+  <data>
+    <Feature>
+      <TimeSetting>15:42:12</TimeSetting>
+      <DateSetting>2008-10-09Z</DateSetting>
+    </Feature>
+  </data>
+
+Following XML Schema facets can be used to define additional restrictions for the value:
+
+- xs:minInclusive 
+
+ - The value must be greater than or equal to specified value 
+ 
+- xs:maxInclusive 
+
+ - The value must be less than or equal to specified value 
+ 
+- xs:minExclusive 
+
+ - The value must be greater than the specified value 
+ 
+- xs:maxExclusive 
+
+ - The value must be less than the specified value 
+ 
+- xs:pattern 
+
+ - Restricts values to a particular pattern represented by a regular expression 
+ - If multiple patterns are defined for a single setting, the value must match at least one of the patterns 
+ 
+Please note that options defined for any of these setting types cannot be used to relax or restrict values in any way. The values of all the options must therefore also be valid values.
+
+==============
+8. Expressions
+==============
+
+This chapter defines grammar for both constraint and relevant attribute values used for features, settings and options. The grammar is heavily based on XPATH, but is simplified to contain only parts that are needed to express simple value comparisons.
+
+SettingValueRef "." (dot) refers to the value of the setting itself when used in constraint or relevant attributes of a setting or option. SettingValueRefs can be either absolute or relative. Absolute ones must be used to refer to value of a setting in other feature and therefore include NCNames (name without colons) of feature, setting and optionally also sub-setting (in case of sequences). Relative ones can be used to refer to value of a setting/sub-setting inside the same feature/sequence, and therefore contain only NCName of setting and/or sub-setting. To refer to any item-setting of a sequence, asterisk (")* ") is used after NCName of a sequence setting. To refer a specific sequence-item, the index of item is defined in brackets after NCName of sequence setting.
+
+For readability, whitespace may be used in expressions even though not explicitly allowed by the grammar.
+
+8.1 Basic expressions
+---------------------
+
+:: 
+
+  Expr ::= OrExpr
+  PrimaryExpr ::= SettingValueRef
+      | '(' OrExpr ')'
+      | Literal
+      | Number
+
+8.2 Boolean expressions
+-----------------------
+
+::
+
+  OrExpr ::= AndExpr
+      | OrExpr 'or' AndExpr
+  AndExpr ::= EqualityExpr
+      | AndExpr 'and' EqualityExpr
+  EqualityExpr ::= RelationalExpr
+      | EqualityExpr '=' RelationalExpr
+      | EqualityExpr '!=' RelationalExpr
+  RelationalExpr ::= AdditiveExpr
+      | RelationalExpr '<' AdditiveExpr
+      | RelationalExpr '>' AdditiveExpr
+      | RelationalExpr '<=' AdditiveExpr
+      | RelationalExpr '>=' AdditiveExpr
+
+Note that:
+
+- '<' must be escaped using "&lt;"
+- '<=' may be represented as "&lte;"
+- '>' must be escaped using "&gt;"
+- '<=' may be represented as "&gte;"
+
+8.3 Numeric Expressions
+-----------------------
+
+::
+
+  AdditiveExpr ::= MultiplicativeExpr
+      | AdditiveExpr '+' MultiplicativeExpr
+      | AdditiveExpr '-' MultiplicativeExpr
+  MultiplicativeExpr ::= UnaryExpr
+      | MultiplicativeExpr '*' UnaryExpr
+      | MultiplicativeExpr 'div' UnaryExpr
+      | MultiplicativeExpr 'mod' UnaryExpr
+  UnaryExpr ::= PrimaryExpression
+      | '-' UnaryExpr
+
+8.4 Expression lexical structure
+--------------------------------
+
+::
+
+  SettingValueRef ::= '.'
+      | Ref
+      | Ref '/' Ref
+      | Ref '/' Ref '/' Ref
+  Literal ::= '"' [^"]* '"'
+      | "'" [^']* "'"
+  Number ::= Digits ('.' Digits?)?
+      | '.' Digits
+  Digits ::= [0-9]+
+  Ref ::= NCName
+      | NCName '*'
+      | NCName '[' Number ']'
+
+Note that:
+
+- ampersand character (&) must be escaped using "&amp;"
+- the double-quote character (") must be escaped using "&quot;".
+- single-quote character (') may be represented as "&apos;"
+
+8.5 Examples
+------------
+
+Examples of various constraint and relevant expressions::
+
+  <feature ref="FeatureA">
+    <setting type="int" ref="SettingA" constraint=". <= SettingB"/>
+    <setting type="int" ref="SettingB" constraint=". <= FeatureB/SettingA"/>
+    <setting type="int" ref="SettingC" relevant ="FeatureC*/SettingB = 1"/>
+  </feature>
+  <feature ref="FeatureB">
+    <setting type="int" ref="SettingA" constraint=". <= SettingB + SettingC"/>
+    <setting type="int" ref="SettingB" constraint="SettingA + Setting"/>
+    <setting type="int" ref="SettingC" relevant="FeatureC/SettingB[3]/SettingBB = 3.1"/>
+  </feature>
+  <feature ref="FeatureC">
+    <setting type="string" ref="SettingA" constraint=". = ( &quot;foo&quot; or . = &quot;bar&quot;"/>
+    <setting type="sequence" ref="SettingB">
+      <setting type="Boolean" ref="SettingBA"/>
+      <setting type="Real" ref="SettingBB" relevant="SettingBA != &quot;true&quot;"/>
+    </setting>
+  </feature>
+
+=============
+9. Properties
+=============
+
+The property element (chapter 6.6) can be used to define additional definitions for settings. Properties can be used for example to define domain specific constraints for data. Every setting can have zero or more property definitions. Every property has name, value, and optionally a unit. This chapter lists commonly used properties names to be used with graphics and file specific settings.
+
+9.1 Graphics
+------------
+
+Following properties are defined for file type settings that define a file that represents an image or animation:
+
+- type
+ 
+ - white-space separated list of type definitions 
+ - Example values: image/svgt image/bmp image/svg 
+ - default unit: mime type
+
+- maxBits
+ 
+ - maximum number of units per pixel 
+ - Example values: 24 
+ - default unit: bits
+
+- maxWidth
+ 
+ - maximum width of graphic in units 
+ - Example values: 200 
+ - default unit: pixel
+
+- maxHeight
+ 
+ - maximum height of graphic in units 
+ - Example values: 120 
+ - default unit: pixel
+
+- minWidth
+ 
+ - minimum width of graphic in units 
+ - Example values: 100 
+ - default unit: pixel
+
+- minHeight
+ 
+ - minimum height of graphic in units 
+ - Example values: 60 
+ - default unit: pixel
+
+- width
+ 
+ - the width of graphic in units; shorthand for cases where minWidth equals maxWidth 
+ - Example values: 150 
+ - default unit: pixel
+
+- height
+ 
+ - the height of graphic in units; shorthand for cases where minHeight equals maxHeight 
+ - Example values: 80 
+ - default unit: pixel
+
+- maxColor 
+
+  - maximum number of distict color values 
+  - Example values: 240000
+
+9.2 Files
+---------
+
+- maxFileSize
+ 
+ - maximum size of the file to be identified by the setting 
+ - Example values: 500 
+ - default unit: kb
+
+- recommendedFileSize 
+
+ - recommended size of the file to be identified by the setting 
+ - Example values: 100 
+ - default unit: kb
+
+======================
+10. Appendix: Examples
+======================
+
+10.1 A configuration file
+-------------------------
+
+::
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <configuration xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" version="1.0">
+  <meta>
+    <id>x99_001</id>
+    <date>2006-06-19</date>
+    <owner>John Smith</owner>
+    <editor>John Smith</editor>
+    <status>proposal</status>
+    <product>X99</product>
+    <desc>X99 Customization features</desc>
+    <version>0.1</version>
+    <platform>p60</platform>
+    <customer>AnOperator</customer>
+  </meta>
+  <xi:include href="ProductSpecificFeatures.confml"/>
+  <xi:include href="PlatformFeatures.confml"/>
+  <xi:include href="ProductDefaultData.confml"/>
+  <xi:include href="GlobalOperatorData.confml"/>
+  <xi:include href="OperatorView.confml"/>
+  <data>
+    <GroovyFeature>
+      <DriveWay1>2344</DriveWay1>
+      <DriveWay2>1298</DriveWay2>
+    </GroovyFeature>
+    <OperatorAnimation>
+      <FrameDelay>400</FrameDelay>
+    </OperatorAnimation>
+  </data>
+    <rfs>
+      <GroovyFeature>
+        <DriveWay1>true</DriveWay1>
+        <DriveWay2>true</DriveWay2>
+      </GroovyFeature>
+    </rfs>
+  </configuration>
+
+===============
+Change history:
+===============
+
+.. list-table::
+
+   - - 0.1
+     - 8.5.2006
+     - Draft
+     - Incomplete draft.
+   - - 0.2
+     - 16.6.2006
+     - Draft
+     - Updated based on comments.
+   - - 0.3
+     - 1.8.2006
+     - Draft
+     - Lots of corrections and clarifications. Explained data types. Added Central Repository language definitions.
+   - - 0.3.1
+     - 4.8.2006
+     - Draft
+     - Minor corrections to central repository XML. Attached schema for cenrepml and XML Schema version for all schemas added. Removed redundant comments.
+   - - 0.4
+     - 18.8.2006
+     - Draft
+     - Added readOnly attribute for key element. Explained how to define release specific attribute values. The name of setting element was made optional. Including settings with wildcard removed. Exclude element removed. Hiearchical grouping supported with maximum of two levels of groups. Added list of supported releases to configuration metadata. Defined how release information must be interpreted. Updated schemas and examples. Restructuring chapter 3. Added some tool implementation to the appendix.
+   - - 0.5
+     - 20.12.2006
+     - Draft
+     - Supported release information redesigned: new releases and release elements. Release element removed from meta. Including other than valid configuration ML or "Variant" data files are no longer allowed. Added support for defining ranges of keys in Central Repository ML. Schemas and examples updated according to changes.
+   - - 0.51
+     - 27.3.2007
+     - Draft
+     - Explained how empty sequence is defined. Minor corrections to schemas (namespace fixups for XInclude use). Fixed errors related to releases element in content model of configuration and repository elements. Support for real type added to settings. Fixed some examples. Removed support for length attributes for int type. Clarification to required attribute added. Definging multiple values for multiSelection settings defined.
+   - - 0.6
+     - 19.9.2007
+     - Draft
+     - New chapter 4.5 for naming conventions. Removed excludeOptions element; same can be achieved by redefining option in view with relevant=false(). Added support for incremental definition of sequence settings using extensionPolicy attribute. Added comment about multiSelection usage. CenrepML: rw access type removed; types must be idefined with small case letter. New setting type: boolean. New properties: minWidth, width, minHeight, height. Common elements allowed for property element. The namespace of CenrepML modified. Proposal for Generic Configuration File ML. Schemas updated.
+   - - 0.7
+     - 5.12.2007
+     - Draft
+     - Added comment about maximum number of the access elements in Central Repository ML. Feature Implementation term replace with Setting Implementation to emphasise that each setting can have different implementation. Added bit element to Central Repository ML for mapping Booleans to integer and binary keys. Removed release(s) elements and release specific attributes; change element removed from Central Repository ML: ConfML is now agnostic to versioning. Added simple release element back to meta. Sequence template concept introduced. Added rfs element as a sibling element to data for defining rfs policy for settings. Added keyRange element to Central Repository ML for defining ranges or keys and allowing mapping sequences to them. Replaced use of XPATH expressions with either literal Boolean values or simpler expression language chapter 8. Same expression language used for PCDATA of value element in CenRepML. Clarified the use of extensionPolicy attribute. Introduced folder type. ExtensionPolicy value "prepend" replace with correct English word "prefix". The schema definitions have not been updated for include changes in this version of the specification.
+   - - 0.7.1
+     - 28.12.2007
+     - Draft
+     - Removed int attribute of keyRange element in Central Repository ML as a redundant attribute. Updated schemas. Added schema for GenConfML. Minor corrections to GenConfML example. 
+   - - 0.80
+     - 16.5.2008
+     - Draft
+     - Divided Configuration ML, Generic Configuration File ML and Central Repository ML into separate specifications. Removed schema specifications (not totally up to date and not used by the tools). Removed tool implementation considerations (incorporated into configuration tool work already). Removed chapter "Detailed configuration examples" (hard to keep up to date, working "examples" are also provided part of S60 build).
+       Several minor modifications.
+   - - 0.81
+     - 16.5.2008
+     - Draft
+     - Added name-id mapping functionality into the specification
+   - - 0.82
+     - 26.5.2008
+     - Draft
+     - Fixes from inspection: cardinality of the elements shown in the picture describing confml structure. Clarified read-onlyness of a setting. Added notes about uniqueness of mapKey attributes. Removed multiSelection data type. 
+   - - 0.83
+     - 2.6.2008
+     - Draft
+     - Clean version for next update round.
+   - - 0.84
+     - 18.9.2008
+     - Draft
+     - Changed inclusion priorities to match official xinclude definitions. Changed default Unicode encoding. Added file element description. Added multiSelection back with refined syntax. Added support for more levels into views to satisfy needs from other platforms. Added time related data types. Updated confml namespace versioning due to different include processing logic.
+   - - 0.85
+     - 6.10.2008
+     - Draft
+     - Corrections from inspection. Added meta elements required by configuration project. Changed name-id mapping to use separate map attribute in data definitions.
+  
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/development.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+Cone development
+================
+This page should describe all relevant information on any developer who has or will create any functionality on
+top of the ConE functionality.
+
+
+ConE is open source
+-------------------
+
+ConE is a open source project (Currently under Eclipse Public License v1.0), which can take contributions from anyone interested in ConE. In future the ConE 
+will propably be split to two separate parts; core and plugins. The core of ConE is mainly the public interface
+and the storage agnostic functionality of ConE. This core part is intended to be more generic and functional on 
+any platform. The plugin part is meant for extensions of ConE that could be for example platform specific 
+implementation plugins that generate output files based on the configurations.
+
+
+Developing ConE plugin
+----------------------
+
+See :ref:`plugin-howto`.
+
+
+Using ConE API
+==============
+
+.. toctree::
+    :maxdepth: 2
+
+    api/api
+    rule
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/extref.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+External references
+===================
+
+Configuration specifications
+----------------------------
+.. toctree::
+    :maxdepth: 1
+
+    configurationml085
+
+ConE API documentation
+----------------------
+
+* `Cone API epydoc <./epydoc/index.html>`_
+
+Links to related documentation
+------------------------------
+
+* `S60wiki ConfML <https://s60wiki/S60Wiki/Configuration_ML>`_
+* `s60wiki ConE <https://s60wiki/S60Wiki/Configuration_Project_Specification/Configuration_Engine_(ConE)>`_
+* `C13y specifications trac <https://trace1.isource-nokia.nokia.com/trac/c13y_specs/>`_
+* `C13y specifications isource <https://isource-nokia.nokia.com/projects/c13y_specs/>`_
Binary file configurationengine/doc/images/ConeP.gif has changed
Binary file configurationengine/doc/images/configuration_project.bmp has changed
Binary file configurationengine/doc/images/configurationml085-f1.gif has changed
Binary file configurationengine/doc/images/configurationml085-f2.gif has changed
Binary file configurationengine/doc/images/configurationml085-f3.gif has changed
Binary file configurationengine/doc/images/configurationml085-f4.gif has changed
Binary file configurationengine/doc/images/configurationml085-f5.gif has changed
Binary file configurationengine/doc/images/file_explorer.bmp has changed
Binary file configurationengine/doc/images/imaker_cone.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/imakercone.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+iMaker-ConE integration
+=======================
+
+	iMaker tool is able to create images from CPF file. This mechanism is used for example in Carbide.v 
+	where iMaker plugin (Eclipse plugin) is calling iMaker to create flash images for modified CPF file.
+	The following picture shows how the calling hierarchy goes.
+	
+	.. image:: images/imaker_cone.jpg
+	
+#.	Carbide.v's iMaker plugin instantiates call to iMaker where CPF and configuration inside the CPF is given as parameter.
+	Also other information like report template and report output filename is given. Imaker plugin is responsible of providing
+	progress information to Carbide.v user so that he/she knows that generation is progressing.
+#. 	iMaker calls ConE to generate makefile that contains image creation configuration for this CPF.
+#.	ConE returns makefile to iMaker
+#. 	iMaker calls itself using the makefile. Default target in the makefile is create_selected and in Carbide.v use cases it
+	contains ROFS3 and UDA targets.	
+#.	iMaker calls ConE to generate content for ROFS3 (parameter --impl-tag=target:rofs3) and gives output directory as parameter.	
+#.	ConE filters implementations as defined by iMaker and calls each plugin separately to create output files to output folder. 	
+#.	Data is generated to output folder.
+#.	iMaker creates ROFS3 image from that data using normal iMaker variant build step.
+#.	iMaker calls ConE to generate content for UDA (parameter --impl-tag=target:uda) and gives output directory as parameter.	
+#.	ConE filters implementations as defined by iMaker and calls each plugin separately to create output files to output folder. 	
+#.	Data is generated to output folder.
+#.	iMaker creates UDA image from that data using normal iMaker variant build step.
+#.	iMaker performs data package copy step which basically uses predefined dcp, vpl and signature files and copies flash images
+	based on variant configuration to one folder with certain filenames. This way there is no need to resign the package anymore.
+	Downside of this approach is that data package definition and information cannot be changed but in case of operator variant
+	verification it is not that critical. Of course same data package cannot be used in production.
+#.	Data package and generation reports are located in places that Carbide.v specified in the first call.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/index.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+.. Cone documentation master file, created by sphinx-quickstart on Tue Dec 30 13:51:34 2008.
+   You can adapt this file completely to your liking, but it should at least
+   contain the root `toctree` directive.
+
+Welcome to Cone's documentation!
+================================
+
+Contents:
+
+.. toctree::
+    :maxdepth: 2
+
+    intro
+    cli/common
+    development
+    plugins/index
+    extref
+    imakercone
+    
+Indices and tables
+==================
+
+* :ref:`genindex`
+* :ref:`modindex`
+* :ref:`search`
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/intro.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,173 @@
+Introduction
+============
+
+ConE installation offers three different use scenarios of the tool.
+
+#. ConE API (read, write)
+#. ConE plugin API (A plugin interface to add functionality to ConE)
+#. ConE command line interface (tools/utilities that use the API)
+
+ConE API
+--------
+The ConE API tries to offer a simple way to access the configurations inside the Configuration
+project. The concepts of confml and the Configuration project are quite complicated, but the API
+simplifies the project quite a bit to enable effective programming. Although the API aims for 
+simplicity, everything is made available via the API.
+The API is described in this document with python api documentation tool *epydoc*.  
+
+ConE plugin API
+---------------
+The purpose of the plugin API is to offer the possibility to expand the functionality of Configuration project. Normal use case
+is an implementation plugin which reads data from the configuration and transforms it into some other form 
+(e.g. centralrepository text file).
+
+ConE command line interface
+---------------------------
+The main purpose of ConE is to offer the above APIs, but ConE installation as tool
+offers also set of command line utilities that can used to modify, read and utilize (generate other output files 
+with implementation plugins) from a Configuration project. These utilities lie on the cone-script package and 
+are described in the ConE command line interface section.
+
+Installation
+------------
+
+Requirements
+^^^^^^^^^^^^
+
+ConE installation requires:
+ 
+* Python 2.5 (though 2.6 probably works too)
+* Ant (Required for installing from source)
+* Python setuptools - http://pypi.python.org/pypi/setuptools. (Required to install ConE as part of python)
+
+ConE can be installed in two different ways:
+
+1. In the Python environment under site-packages like any other Python package
+
+  - Makes it possible to use the ConE API from Python scripts
+
+2. As a standalone installation in a separate directory
+
+  - Contains the CLI and a set of plug-ins
+
+Installing from source
+^^^^^^^^^^^^^^^^^^^^^^
+
+In order to install from source, you obviously need to first get the ConE sources:
+
+* Clone the Mercurial repository:
+
+  * ``hg clone https://developer.symbian.org/sfl/MCL/sftools/depl/swconfigmdw/``
+  
+* -- or -- checkout from SVN (if you are in Nokia intranet):
+
+  * ``svn checkout https://trace1.isource-nokia.nokia.com/isource/svnroot/cone/trunk cone_src``
+
+**Installing under site-packages**
+
+Simply install using ``setup.py`` like for any Python package:
+  
+* ``cd cone_src/source``
+* ``python setup.py install``
+
+This will install the ConE core module into your Python environment. To install a plug-in,
+do the same in the desired plug-in's source directory (e.g. ``cone_src/plugins/common/ConeRulePlugin``).
+
+**Installing the standalone ConE**
+
+The normal installation in windows environment creates a directory containing the needed
+libraries and ConE plug-ins, and a ``cone.cmd`` wrapper script. The directory can then
+be added somewhere into your PATH, and then the CLI can be used by running ``cone``.
+
+To install, run:
+
+* <windows> ``install.cmd /path/to/install common``
+* <linux> *Not available yet*
+
+Notice the parameter ``common`` in the install command. This specifies the plug-in package to install.
+It can be omitted, in which case it defaults to ``common``. Replace this with e.g. ``symbian`` to create
+a Symbian-specific ConE installation.
+
+.. note::
+    Currently the standalone installation is Windows-specific in the sense that only a batch file
+    wrapper (``cone.cmd``) is included and some Symbian-specific plug-ins have dependencies to
+    Windows applications and Python libraries with native components. However, the ``common``
+    plug-in package should contain only pure Python, so it should work in Unix. Also, a ``cone.sh``
+    script is available under ``source/``, which can be used to replace ``cone.cmd`` in Unix.
+
+Install from ZIP
+^^^^^^^^^^^^^^^^
+
+Fetch the latest ConE build from our CruiseControl build server (works only in Nokia intranet):
+  
+* Goto http://trwec021.nmp.nokia.com:8080/buildresults/cone-build
+* Click on the Build Artifacts to get the latest build. Older builds are also available for some time.
+* Download the zip file
+
+The ZIP file should contain a pre-built standalone installation described in the previous section.
+Simply unzip it where you please.
+
+
+.. _installation-export-tests:
+
+Standalone test set
+^^^^^^^^^^^^^^^^^^^
+
+A standalone ConE installation can be tested using an automated standalone test set, which tests the
+ConE CLI functionality. Like the ``install`` command, exporting the test set also needs to
+be given the plug-in package name (it wouldn't make much sense to test a Symbian ConE
+installation using a Maemo-specific test set).
+
+* Export the test set:
+
+  * ``cd cone_src``
+  * <windows> ``export_bat.cmd /path/to/tests common``
+  * <linux> *Not available yet*
+
+
+.. warning::
+    The path specified as the target path will be cleared before the actual
+    export takes place, so be sure not to pass anything like C:\\ there.
+
+* Run the test set:
+  
+  * Copy the ConE installation to test into ``/path/to/tests/cone/``
+  * ``cd /path/to/tests``
+  * ``runtests.cmd``
+
+You can also run the tests so that a standalone ConE installation is built and then tested
+with its corresponding test set:
+
+  * ``cd cone_src``
+  * <windows> ``run_bat.cmd /path/to/tests common``
+  * <linux> *Not available yet*
+
+If you simply want to test that ConE works correctly on your machine, you can
+also run:
+
+  * ``ant test``
+  
+This will export the test set, install ConE and run the tests inside a temporary
+build directory in the working copy.
+  
+Build and install debian packages (Maemo)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+  1. Install tools and cone dependencies, as root or with sudo.
+  
+    * ``sudo apt-get install dpkg-dev fakeroot python-setuptools python-central``
+    
+  2. Build python-cone and cone-tool. The packages are placed in parent directory.
+   
+    * ``cd cone/trunk``
+    * ``dpkg-buildpackage -rfakeroot -b``
+    
+  3. Install the binary packages, as root or with sudo.
+   
+    * ``sudo dpkg -i ../python-cone*.deb ../cone-tool*.deb``
+
+  4. Install Jinja2 (not part of all Debian-based distros)
+
+    * ``sudo easy_install Jinja2``
+
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/licence-configurationengine.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,258 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"><head>
+
+
+
+
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Eclipse Public License - Version 1.0</title>
+<style type="text/css">
+  body {
+    size: 8.5in 11.0in;
+    margin: 0.25in 0.5in 0.25in 0.5in;
+    tab-interval: 0.5in;
+    }
+  p {  	
+    margin-left: auto;
+    margin-top:  0.5em;
+    margin-bottom: 0.5em;
+    }
+  p.list {
+  	margin-left: 0.5in;
+    margin-top:  0.05em;
+    margin-bottom: 0.05em;
+    }
+  </style>
+
+</head><body lang="EN-US">
+
+<h2>Eclipse Public License - v 1.0</h2>
+
+<p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR
+DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS
+AGREEMENT.</p>
+
+<p><b>1. DEFINITIONS</b></p>
+
+<p>"Contribution" means:</p>
+
+<p class="list">a) in the case of the initial Contributor, the initial
+code and documentation distributed under this Agreement, and</p>
+<p class="list">b) in the case of each subsequent Contributor:</p>
+<p class="list">i) changes to the Program, and</p>
+<p class="list">ii) additions to the Program;</p>
+<p class="list">where such changes and/or additions to the Program
+originate from and are distributed by that particular Contributor. A
+Contribution 'originates' from a Contributor if it was added to the
+Program by such Contributor itself or anyone acting on such
+Contributor's behalf. Contributions do not include additions to the
+Program which: (i) are separate modules of software distributed in
+conjunction with the Program under their own license agreement, and (ii)
+are not derivative works of the Program.</p>
+
+<p>"Contributor" means any person or entity that distributes
+the Program.</p>
+
+<p>"Licensed Patents" mean patent claims licensable by a
+Contributor which are necessarily infringed by the use or sale of its
+Contribution alone or when combined with the Program.</p>
+
+<p>"Program" means the Contributions distributed in accordance
+with this Agreement.</p>
+
+<p>"Recipient" means anyone who receives the Program under
+this Agreement, including all Contributors.</p>
+
+<p><b>2. GRANT OF RIGHTS</b></p>
+
+<p class="list">a) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free copyright license to reproduce, prepare derivative works
+of, publicly display, publicly perform, distribute and sublicense the
+Contribution of such Contributor, if any, and such derivative works, in
+source code and object code form.</p>
+
+<p class="list">b) Subject to the terms of this Agreement, each
+Contributor hereby grants Recipient a non-exclusive, worldwide,
+royalty-free patent license under Licensed Patents to make, use, sell,
+offer to sell, import and otherwise transfer the Contribution of such
+Contributor, if any, in source code and object code form. This patent
+license shall apply to the combination of the Contribution and the
+Program if, at the time the Contribution is added by the Contributor,
+such addition of the Contribution causes such combination to be covered
+by the Licensed Patents. The patent license shall not apply to any other
+combinations which include the Contribution. No hardware per se is
+licensed hereunder.</p>
+
+<p class="list">c) Recipient understands that although each Contributor
+grants the licenses to its Contributions set forth herein, no assurances
+are provided by any Contributor that the Program does not infringe the
+patent or other intellectual property rights of any other entity. Each
+Contributor disclaims any liability to Recipient for claims brought by
+any other entity based on infringement of intellectual property rights
+or otherwise. As a condition to exercising the rights and licenses
+granted hereunder, each Recipient hereby assumes sole responsibility to
+secure any other intellectual property rights needed, if any. For
+example, if a third party patent license is required to allow Recipient
+to distribute the Program, it is Recipient's responsibility to acquire
+that license before distributing the Program.</p>
+
+<p class="list">d) Each Contributor represents that to its knowledge it
+has sufficient copyright rights in its Contribution, if any, to grant
+the copyright license set forth in this Agreement.</p>
+
+<p><b>3. REQUIREMENTS</b></p>
+
+<p>A Contributor may choose to distribute the Program in object code
+form under its own license agreement, provided that:</p>
+
+<p class="list">a) it complies with the terms and conditions of this
+Agreement; and</p>
+
+<p class="list">b) its license agreement:</p>
+
+<p class="list">i) effectively disclaims on behalf of all Contributors
+all warranties and conditions, express and implied, including warranties
+or conditions of title and non-infringement, and implied warranties or
+conditions of merchantability and fitness for a particular purpose;</p>
+
+<p class="list">ii) effectively excludes on behalf of all Contributors
+all liability for damages, including direct, indirect, special,
+incidental and consequential damages, such as lost profits;</p>
+
+<p class="list">iii) states that any provisions which differ from this
+Agreement are offered by that Contributor alone and not by any other
+party; and</p>
+
+<p class="list">iv) states that source code for the Program is available
+from such Contributor, and informs licensees how to obtain it in a
+reasonable manner on or through a medium customarily used for software
+exchange.</p>
+
+<p>When the Program is made available in source code form:</p>
+
+<p class="list">a) it must be made available under this Agreement; and</p>
+
+<p class="list">b) a copy of this Agreement must be included with each
+copy of the Program.</p>
+
+<p>Contributors may not remove or alter any copyright notices contained
+within the Program.</p>
+
+<p>Each Contributor must identify itself as the originator of its
+Contribution, if any, in a manner that reasonably allows subsequent
+Recipients to identify the originator of the Contribution.</p>
+
+<p><b>4. COMMERCIAL DISTRIBUTION</b></p>
+
+<p>Commercial distributors of software may accept certain
+responsibilities with respect to end users, business partners and the
+like. While this license is intended to facilitate the commercial use of
+the Program, the Contributor who includes the Program in a commercial
+product offering should do so in a manner which does not create
+potential liability for other Contributors. Therefore, if a Contributor
+includes the Program in a commercial product offering, such Contributor
+("Commercial Contributor") hereby agrees to defend and
+indemnify every other Contributor ("Indemnified Contributor")
+against any losses, damages and costs (collectively "Losses")
+arising from claims, lawsuits and other legal actions brought by a third
+party against the Indemnified Contributor to the extent caused by the
+acts or omissions of such Commercial Contributor in connection with its
+distribution of the Program in a commercial product offering. The
+obligations in this section do not apply to any claims or Losses
+relating to any actual or alleged intellectual property infringement. In
+order to qualify, an Indemnified Contributor must: a) promptly notify
+the Commercial Contributor in writing of such claim, and b) allow the
+Commercial Contributor to control, and cooperate with the Commercial
+Contributor in, the defense and any related settlement negotiations. The
+Indemnified Contributor may participate in any such claim at its own
+expense.</p>
+
+<p>For example, a Contributor might include the Program in a commercial
+product offering, Product X. That Contributor is then a Commercial
+Contributor. If that Commercial Contributor then makes performance
+claims, or offers warranties related to Product X, those performance
+claims and warranties are such Commercial Contributor's responsibility
+alone. Under this section, the Commercial Contributor would have to
+defend claims against the other Contributors related to those
+performance claims and warranties, and if a court requires any other
+Contributor to pay any damages as a result, the Commercial Contributor
+must pay those damages.</p>
+
+<p><b>5. NO WARRANTY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION,
+ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY
+OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+responsible for determining the appropriateness of using and
+distributing the Program and assumes all risks associated with its
+exercise of rights under this Agreement , including but not limited to
+the risks and costs of program errors, compliance with applicable laws,
+damage to or loss of data, programs or equipment, and unavailability or
+interruption of operations.</p>
+
+<p><b>6. DISCLAIMER OF LIABILITY</b></p>
+
+<p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT
+NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</p>
+
+<p><b>7. GENERAL</b></p>
+
+<p>If any provision of this Agreement is invalid or unenforceable under
+applicable law, it shall not affect the validity or enforceability of
+the remainder of the terms of this Agreement, and without further action
+by the parties hereto, such provision shall be reformed to the minimum
+extent necessary to make such provision valid and enforceable.</p>
+
+<p>If Recipient institutes patent litigation against any entity
+(including a cross-claim or counterclaim in a lawsuit) alleging that the
+Program itself (excluding combinations of the Program with other
+software or hardware) infringes such Recipient's patent(s), then such
+Recipient's rights granted under Section 2(b) shall terminate as of the
+date such litigation is filed.</p>
+
+<p>All Recipient's rights under this Agreement shall terminate if it
+fails to comply with any of the material terms or conditions of this
+Agreement and does not cure such failure in a reasonable period of time
+after becoming aware of such noncompliance. If all Recipient's rights
+under this Agreement terminate, Recipient agrees to cease use and
+distribution of the Program as soon as reasonably practicable. However,
+Recipient's obligations under this Agreement and any licenses granted by
+Recipient relating to the Program shall continue and survive.</p>
+
+<p>Everyone is permitted to copy and distribute copies of this
+Agreement, but in order to avoid inconsistency the Agreement is
+copyrighted and may only be modified in the following manner. The
+Agreement Steward reserves the right to publish new versions (including
+revisions) of this Agreement from time to time. No one other than the
+Agreement Steward has the right to modify this Agreement. The Eclipse
+Foundation is the initial Agreement Steward. The Eclipse Foundation may
+assign the responsibility to serve as the Agreement Steward to a
+suitable separate entity. Each new version of the Agreement will be
+given a distinguishing version number. The Program (including
+Contributions) may always be distributed subject to the version of the
+Agreement under which it was received. In addition, after a new version
+of the Agreement is published, Contributor may elect to distribute the
+Program (including its Contributions) under the new version. Except as
+expressly stated in Sections 2(a) and 2(b) above, Recipient receives no
+rights or licenses to the intellectual property of any Contributor under
+this Agreement, whether expressly, by implication, estoppel or
+otherwise. All rights in the Program not expressly granted under this
+Agreement are reserved.</p>
+
+<p>This Agreement is governed by the laws of the State of New York and
+the intellectual property laws of the United States of America. No party
+to this Agreement will bring a legal action under this Agreement more
+than one year after the cause of action arose. Each party waives its
+rights to a jury trial in any resulting litigation.</p>
+
+</body></html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/license-jinja2-2.1.1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,44 @@
+    1: Copyright (c) 2006-2008 by the respective authors (see AUTHORS file).
+    2: All rights reserved.
+    3: 
+    4: Redistribution and use in source and binary forms, with or without
+    5: modification, are permitted provided that the following conditions are
+    6: met:
+    7: 
+    8:     * Redistributions of source code must retain the above copyright
+    9:       notice, this list of conditions and the following disclaimer.
+   10: 
+   11:     * Redistributions in binary form must reproduce the above
+   12:       copyright notice, this list of conditions and the following
+   13:       disclaimer in the documentation and/or other materials provided
+   14:       with the distribution.
+   15: 
+   16:     * The names of the contributors may not be used to endorse or
+   17:       promote products derived from this software without specific
+   18:       prior written permission.
+   19: 
+   20: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   21: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   22: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   23: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+   24: OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+   25: SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   26: LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+   27: DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+   28: THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   29: (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+   30: OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Jinja2-2.1.1/AUTHORS:
+
+    1: Jinja is written and maintained by Armin Ronacher <armin.ronacher@active-4.com>.
+    2: 
+    3: Other contributors (as mentionend in :copyright:s) are:
+    4: 
+    5: - Armin Ronacher <armin.ronacher@active-4.com>
+    6: - Georg Brandl
+    7: - Lawrence Journal-World.
+    8: - Bryan McLemore
+    9: - Mickaël Guérin <kael@crocobox.org>
+   10: - Cameron Knight
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/license-lxml-2.2.2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+
+    1: Copyright (c) 2004 Infrae. All rights reserved.
+    2: 
+    3: Redistribution and use in source and binary forms, with or without
+    4: modification, are permitted provided that the following conditions are
+    5: met:
+    6: 
+    7:   1. Redistributions of source code must retain the above copyright
+    8:      notice, this list of conditions and the following disclaimer.
+    9:    
+   10:   2. Redistributions in binary form must reproduce the above copyright
+   11:      notice, this list of conditions and the following disclaimer in
+   12:      the documentation and/or other materials provided with the
+   13:      distribution.
+   14: 
+   15:   3. Neither the name of Infrae nor the names of its contributors may
+   16:      be used to endorse or promote products derived from this software
+   17:      without specific prior written permission.
+   18: 
+   19: THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+   20: "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+   21: LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+   22: A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INFRAE OR
+   23: CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   24: EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+   25: PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+   26: PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+   27: LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+   28: NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   29: SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+----
+
+    1: Zope Public License (ZPL) Version 2.0
+    2: -----------------------------------------------
+    3: 
+    4: This software is Copyright (c) Zope Corporation (tm) and
+    5: Contributors. All rights reserved.
+    6: 
+    7: This license has been certified as open source. It has also
+    8: been designated as GPL compatible by the Free Software
+    9: Foundation (FSF).
+   10: 
+   11: Redistribution and use in source and binary forms, with or
+   12: without modification, are permitted provided that the
+   13: following conditions are met:
+   14: 
+   15: 1. Redistributions in source code must retain the above
+   16:    copyright notice, this list of conditions, and the following
+   17:    disclaimer.
+   18: 
+   19: 2. Redistributions in binary form must reproduce the above
+   20:    copyright notice, this list of conditions, and the following
+   21:    disclaimer in the documentation and/or other materials
+   22:    provided with the distribution.
+   23: 
+   24: 3. The name Zope Corporation (tm) must not be used to
+   25:    endorse or promote products derived from this software
+   26:    without prior written permission from Zope Corporation.
+   27: 
+   28: 4. The right to distribute this software or to use it for
+   29:    any purpose does not give you the right to use Servicemarks
+   30:    (sm) or Trademarks (tm) of Zope Corporation. Use of them is
+   31:    covered in a separate agreement (see
+   32:    http://www.zope.com/Marks).
+   33: 
+   34: 5. If any files are modified, you must cause the modified
+   35:    files to carry prominent notices stating that you changed
+   36:    the files and the date of any change.
+   37: 
+   38: Disclaimer
+   39: 
+   40:   THIS SOFTWARE IS PROVIDED BY ZOPE CORPORATION ``AS IS''
+   41:   AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+   42:   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+   43:   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+   44:   NO EVENT SHALL ZOPE CORPORATION OR ITS CONTRIBUTORS BE
+   45:   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   46:   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   47:   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   48:   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   49:   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   50:   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+   51:   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   52:   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+   53:   DAMAGE.
+   54: 
+   55: 
+   56: This software consists of contributions made by Zope
+   57: Corporation and many individuals on behalf of Zope
+   58: Corporation.  Specific attributions are listed in the
+   59: accompanying credits file.
+
+----
+
+Copyright (c) 1999-2003 by Secret Labs AB
+    4: Copyright (c) 1999-2003 by Fredrik Lundh
+    5: 
+    6: By obtaining, using, and/or copying this software and/or its
+    7: associated documentation, you agree that you have read, understood,
+    8: and will comply with the following terms and conditions:
+    9: 
+   10: Permission to use, copy, modify, and distribute this software and its
+   11: associated documentation for any purpose and without fee is hereby
+   12: granted, provided that the above copyright notice appears in all
+   13: copies, and that both that copyright notice and this permission notice
+   14: appear in supporting documentation, and that the name of Secret Labs
+   15: AB or the author not be used in advertising or publicity pertaining to
+   16: distribution of the software without specific, written prior
+   17: permission.
+   18: 
+   19: SECRET LABS AB AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO
+   20: THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+   21: FITNESS.  IN NO EVENT SHALL SECRET LABS AB OR THE AUTHOR BE LIABLE FOR
+   22: ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+   23: WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+   24: ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+   25: OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/license-setuptools-0.6c9.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,326 @@
+    1: Zope Public License (ZPL) Version 2.1
+    2: -------------------------------------
+    3: 
+    4: A copyright notice accompanies this license document that
+    5: identifies the copyright holders.
+    6: 
+    7: This license has been certified as open source. It has also
+    8: been designated as GPL compatible by the Free Software
+    9: Foundation (FSF).
+   10: 
+   11: Redistribution and use in source and binary forms, with or
+   12: without modification, are permitted provided that the
+   13: following conditions are met:
+   14: 
+   15: 1. Redistributions in source code must retain the
+   16:    accompanying copyright notice, this list of conditions,
+   17:    and the following disclaimer.
+   18: 
+   19: 2. Redistributions in binary form must reproduce the accompanying
+   20:    copyright notice, this list of conditions, and the
+   21:    following disclaimer in the documentation and/or other
+   22:    materials provided with the distribution.
+   23: 
+   24: 3. Names of the copyright holders must not be used to
+   25:    endorse or promote products derived from this software
+   26:    without prior written permission from the copyright
+   27:    holders.
+   28: 
+   29: 4. The right to distribute this software or to use it for
+   30:    any purpose does not give you the right to use
+   31:    Servicemarks (sm) or Trademarks (tm) of the copyright
+   32:    holders. Use of them is covered by separate agreement
+   33:    with the copyright holders.
+   34: 
+   35: 5. If any files are modified, you must cause the modified
+   36:    files to carry prominent notices stating that you changed
+   37:    the files and the date of any change.
+   38: 
+   39: Disclaimer
+   40: 
+   41:   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS''
+   42:   AND ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT
+   43:   NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
+   44:   AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+   45:   NO EVENT SHALL THE COPYRIGHT HOLDERS BE
+   46:   LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+   47:   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+   48:   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+   49:   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+   50:   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+   51:   CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+   52:   OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+   53:   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+   54:   DAMAGE.
+
+----
+
+Python 2.4 license
+
+This is the official license for the Python 2.4 release:
+
+A. HISTORY OF THE SOFTWARE
+==========================
+
+Python was created in the early 1990s by Guido van Rossum at Stichting
+Mathematisch Centrum (CWI, see http://www.cwi.nl) in the Netherlands
+as a successor of a language called ABC.  Guido remains Python's
+principal author, although it includes many contributions from others.
+
+In 1995, Guido continued his work on Python at the Corporation for
+National Research Initiatives (CNRI, see http://www.cnri.reston.va.us)
+in Reston, Virginia where he released several versions of the
+software.
+
+In May 2000, Guido and the Python core development team moved to
+BeOpen.com to form the BeOpen PythonLabs team.  In October of the same
+year, the PythonLabs team moved to Digital Creations (now Zope
+Corporation, see http://www.zope.com).  In 2001, the Python Software
+Foundation (PSF, see http://www.python.org/psf/) was formed, a
+non-profit organization created specifically to own Python-related
+Intellectual Property.  Zope Corporation is a sponsoring member of
+the PSF.
+
+All Python releases are Open Source (see http://www.opensource.org for
+the Open Source Definition).  Historically, most, but not all, Python
+releases have also been GPL-compatible; the table below summarizes
+the various releases.
+
+    Release         Derived     Year        Owner       GPL-
+		    from                                compatible? (1)
+
+    0.9.0 thru 1.2              1991-1995   CWI         yes
+    1.3 thru 1.5.2  1.2         1995-1999   CNRI        yes
+    1.6             1.5.2       2000        CNRI        no
+    2.0             1.6         2000        BeOpen.com  no
+    1.6.1           1.6         2001        CNRI        yes (2)
+    2.1             2.0+1.6.1   2001        PSF         no
+    2.0.1           2.0+1.6.1   2001        PSF         yes
+    2.1.1           2.1+2.0.1   2001        PSF         yes
+    2.2             2.1.1       2001        PSF         yes
+    2.1.2           2.1.1       2002        PSF         yes
+    2.1.3           2.1.2       2002        PSF         yes
+    2.2.1           2.2         2002        PSF         yes
+    2.2.2           2.2.1       2002        PSF         yes
+    2.2.3           2.2.2       2003        PSF         yes
+    2.3             2.2.2       2002-2003   PSF         yes
+    2.3.1           2.3         2002-2003   PSF         yes
+    2.3.2           2.3.1       2002-2003   PSF         yes
+    2.3.3           2.3.2       2002-2003   PSF         yes
+    2.3.4           2.3.3       2004        PSF         yes
+    2.4             2.3         2004        PSF         yes
+
+Footnotes:
+
+(1) GPL-compatible doesn't mean that we're distributing Python under
+    the GPL.  All Python licenses, unlike the GPL, let you distribute
+    a modified version without making your changes open source.  The
+    GPL-compatible licenses make it possible to combine Python with
+    other software that is released under the GPL; the others don't.
+
+(2) According to Richard Stallman, 1.6.1 is not GPL-compatible,
+    because its license has a choice of law clause.  According to
+    CNRI, however, Stallman's lawyer has told CNRI's lawyer that 1.6.1
+    is "not incompatible" with the GPL.
+
+Thanks to the many outside volunteers who have worked under Guido's
+direction to make these releases possible.
+
+
+B. TERMS AND CONDITIONS FOR ACCESSING OR OTHERWISE USING PYTHON
+===============================================================
+
+PSF LICENSE AGREEMENT FOR PYTHON 2.4
+------------------------------------
+
+1. This LICENSE AGREEMENT is between the Python Software Foundation
+("PSF"), and the Individual or Organization ("Licensee") accessing and
+otherwise using Python 2.4 software in source or binary form and its
+associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, PSF
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 2.4
+alone or in any derivative version, provided, however, that PSF's
+License Agreement and PSF's notice of copyright, i.e., "Copyright (c)
+2001, 2002, 2003, 2004 Python Software Foundation; All Rights Reserved"
+are retained in Python 2.4 alone or in any derivative version prepared
+by Licensee.
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 2.4 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 2.4.
+
+4. PSF is making Python 2.4 available to Licensee on an "AS IS"
+basis.  PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 2.4 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+2.4 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.4,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. Nothing in this License Agreement shall be deemed to create any
+relationship of agency, partnership, or joint venture between PSF and
+Licensee.  This License Agreement does not grant permission to use PSF
+trademarks or trade name in a trademark sense to endorse or promote
+products or services of Licensee, or any third party.
+
+8. By copying, installing or otherwise using Python 2.4, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+BEOPEN.COM LICENSE AGREEMENT FOR PYTHON 2.0
+-------------------------------------------
+
+BEOPEN PYTHON OPEN SOURCE LICENSE AGREEMENT VERSION 1
+
+1. This LICENSE AGREEMENT is between BeOpen.com ("BeOpen"), having an
+office at 160 Saratoga Avenue, Santa Clara, CA 95051, and the
+Individual or Organization ("Licensee") accessing and otherwise using
+this software in source or binary form and its associated
+documentation ("the Software").
+
+2. Subject to the terms and conditions of this BeOpen Python License
+Agreement, BeOpen hereby grants Licensee a non-exclusive,
+royalty-free, world-wide license to reproduce, analyze, test, perform
+and/or display publicly, prepare derivative works, distribute, and
+otherwise use the Software alone or in any derivative version,
+provided, however, that the BeOpen Python License is retained in the
+Software, alone or in any derivative version prepared by Licensee.
+
+3. BeOpen is making the Software available to Licensee on an "AS IS"
+basis.  BEOPEN MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, BEOPEN MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF THE SOFTWARE WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+4. BEOPEN SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF THE
+SOFTWARE FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS
+AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THE SOFTWARE, OR ANY
+DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+5. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+6. This License Agreement shall be governed by and interpreted in all
+respects by the law of the State of California, excluding conflict of
+law provisions.  Nothing in this License Agreement shall be deemed to
+create any relationship of agency, partnership, or joint venture
+between BeOpen and Licensee.  This License Agreement does not grant
+permission to use BeOpen trademarks or trade names in a trademark
+sense to endorse or promote products or services of Licensee, or any
+third party.  As an exception, the "BeOpen Python" logos available at
+http://www.pythonlabs.com/logos.html may be used according to the
+permissions granted on that web page.
+
+7. By copying, installing or otherwise using the software, Licensee
+agrees to be bound by the terms and conditions of this License
+Agreement.
+
+
+CNRI LICENSE AGREEMENT FOR PYTHON 1.6.1
+---------------------------------------
+
+1. This LICENSE AGREEMENT is between the Corporation for National
+Research Initiatives, having an office at 1895 Preston White Drive,
+Reston, VA 20191 ("CNRI"), and the Individual or Organization
+("Licensee") accessing and otherwise using Python 1.6.1 software in
+source or binary form and its associated documentation.
+
+2. Subject to the terms and conditions of this License Agreement, CNRI
+hereby grants Licensee a nonexclusive, royalty-free, world-wide
+license to reproduce, analyze, test, perform and/or display publicly,
+prepare derivative works, distribute, and otherwise use Python 1.6.1
+alone or in any derivative version, provided, however, that CNRI's
+License Agreement and CNRI's notice of copyright, i.e., "Copyright (c)
+1995-2001 Corporation for National Research Initiatives; All Rights
+Reserved" are retained in Python 1.6.1 alone or in any derivative
+version prepared by Licensee.  Alternately, in lieu of CNRI's License
+Agreement, Licensee may substitute the following text (omitting the
+quotes): "Python 1.6.1 is made available subject to the terms and
+conditions in CNRI's License Agreement.  This Agreement together with
+Python 1.6.1 may be located on the Internet using the following
+unique, persistent identifier (known as a handle): 1895.22/1013.  This
+Agreement may also be obtained from a proxy server on the Internet
+using the following URL: http://hdl.handle.net/1895.22/1013".
+
+3. In the event Licensee prepares a derivative work that is based on
+or incorporates Python 1.6.1 or any part thereof, and wants to make
+the derivative work available to others as provided herein, then
+Licensee hereby agrees to include in any such work a brief summary of
+the changes made to Python 1.6.1.
+
+4. CNRI is making Python 1.6.1 available to Licensee on an "AS IS"
+basis.  CNRI MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR
+IMPLIED.  BY WAY OF EXAMPLE, BUT NOT LIMITATION, CNRI MAKES NO AND
+DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS
+FOR ANY PARTICULAR PURPOSE OR THAT THE USE OF PYTHON 1.6.1 WILL NOT
+INFRINGE ANY THIRD PARTY RIGHTS.
+
+5. CNRI SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON
+1.6.1 FOR ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS
+A RESULT OF MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 1.6.1,
+OR ANY DERIVATIVE THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF.
+
+6. This License Agreement will automatically terminate upon a material
+breach of its terms and conditions.
+
+7. This License Agreement shall be governed by the federal
+intellectual property law of the United States, including without
+limitation the federal copyright law, and, to the extent such
+U.S. federal law does not apply, by the law of the Commonwealth of
+Virginia, excluding Virginia's conflict of law provisions.
+Notwithstanding the foregoing, with regard to derivative works based
+on Python 1.6.1 that incorporate non-separable material that was
+previously distributed under the GNU General Public License (GPL), the
+law of the Commonwealth of Virginia shall govern this License
+Agreement only as to issues arising under or with respect to
+Paragraphs 4, 5, and 7 of this License Agreement.  Nothing in this
+License Agreement shall be deemed to create any relationship of
+agency, partnership, or joint venture between CNRI and Licensee.  This
+License Agreement does not grant permission to use CNRI trademarks or
+trade name in a trademark sense to endorse or promote products or
+services of Licensee, or any third party.
+
+8. By clicking on the "ACCEPT" button where indicated, or by copying,
+installing or otherwise using Python 1.6.1, Licensee agrees to be
+bound by the terms and conditions of this License Agreement.
+
+        ACCEPT
+
+
+CWI LICENSE AGREEMENT FOR PYTHON 0.9.0 THROUGH 1.2
+--------------------------------------------------
+
+Copyright (c) 1991 - 1995, Stichting Mathematisch Centrum Amsterdam,
+The Netherlands.  All rights reserved.
+
+Permission to use, copy, modify, and distribute this software and its
+documentation for any purpose and without fee is hereby granted,
+provided that the above copyright notice appear in all copies and that
+both that copyright notice and this permission notice appear in
+supporting documentation, and that the name of Stichting Mathematisch
+Centrum or CWI not be used in advertising or publicity pertaining to
+distribution of the software without specific, written prior
+permission.
+
+STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
+THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
+FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/license-simplejson-2.0.9.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+Copyright (c) 2006 Bob Ippolito
+
+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.
+
Binary file configurationengine/doc/plugins/commandml-plugin/commandml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/commandml-plugin/commandml.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,270 @@
+User guide for Command Plugin
+-----------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use ConE command plugin. Command plugin is a ConE plugin, 
+which purpose is to run external tools and scripts to generate files to target image.
+Command plugin is configured in CommandML files that describes tools that are run 
+and options that are used.
+
+CommandML files are executed by default in **normal** :ref:`invocation phase <implml-common-invocation-phase>`.
+
+CommandML
+'''''''''
+
+The CommandML syntax is a extension of Configuration markup language (confml). The term in confml for this extension 
+is implementation method language (implml), which in CommandML case is a xml file. 
+
+All input values can be given as ConfML refs or as plain text. Also mixing text and ConfML ref information
+is supported. 
+
+  * Namespace: ``http://www.s60.com/xml/commandml/1``
+  * File extension: ``commandml``
+
+.. note::
+
+   More information about :ref:`file extensions <implml-file-extensions>`. 
+
+CommandML Elements
+..................
+
+The CommandML model is drawn out as a uml model in below picture.
+
+  .. image:: commandml.jpg
+
+.. note::
+
+   CommandML supports also common ImplML elements. More information about :ref:`ImplML elements <implml-common-elements>`. 
+
+<commandml> Element
+**************************
+
+The ``commandml`` element is the root element of the configuration, and acts as a container to the rest of the elements.
+
+Child Elements
+++++++++++++++++++++++++++
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+condition             0 .. *                  Defines a group of commands that are run only if command is evaluated as True.
+command               0 .. *                  Defines properties for one executable.
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+  <commandml xmlns="http://www.s60.com/xml/commandml/1">
+ 
+<condition> Element
+**************************
+
+``Condition`` element defines a group of commands that are run only if command is evaluated as True. 
+
+
+Child Elements
+++++++++++++++++++++++++++
+
+Condition can contain arbitrary number of commands and they are run in definition order so that next command is executed
+only after the previous has ended.
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+command               0 .. *                  Defines properties for one executable.
+====================  ======================  ===============================================================================
+
+Attributes
+++++++++++++++++++++++++++
+
+Condition has only one attribute ``value`` which can contains any Python code and ConfML refs. Refs are first expanded
+and then the value is evaluated using Python eval function.
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+value                 Yes                     Defines a condition value that can contain any Python code and ConfML refs.
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+  <condition value="${runconfig.notepad} != ''">
+    <command executable="notepad.exe"/>
+  </condition>
+	
+This will run notepad.exe only if value in ConfML ref ``runconfig.notepad`` is not empty.
+
+<command> Element
+**************************
+
+``Command`` element defines properties for one executable. Basically it provides same features that Python subprocess 
+module. Commands can be defined either inside condition elements and directly under ``commandml``. Running order of 
+commands is the same that is defined in commandml file. Definition of those can be found from 
+`Python subprocess documentation <http://docs.python.org/library/subprocess.html>`_.
+
+Child Elements
+++++++++++++++++++++++++++
+
+Command element can have arguments, pipes and filters as sub-elements.
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+argument              0 .. *                  Defines argument for executable.
+pipe                  0 .. *                  Defines pipe for executable.
+filter                0 .. *                  Defines filter for executable.
+====================  ======================  ===============================================================================
+
+
+Attributes
+++++++++++++++++++++++++++
+
+Command element has one mandatory argument ``executable`` and four optional attributes: ``shell``, ``env``, ``cwd``, ``bufsize``.
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+executable            Yes                     Defines a program to execute. Value can contain any Python code and ConfML refs.
+shell                 No                      Defines is the specified command executed through the shell. 
+env                   No                      Defines the environment variables for the new process. 
+cwd                   No                      Defines the current directory that will be changed to cwd before command is
+                                              executed. Note that this directory is not considered when searching the
+                                              executable, so you can't specify the program's path relative to cwd. 
+bufsize               No                      Defines the pipe buffering: 0 means unbuffered, 1 means line buffered, 
+                                              any other positive value means use a buffer of (approximately) that size. 
+                                              A negative bufsize means to use the system default, which usually means
+                                              fully buffered. The default value for bufsize is 0 (unbuffered). 
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+	<command executable="\Preinstallation\preinstallation.exe" cwd="x:\" shell="true" env="{'MYVAR':'123'}">
+
+
+
+<argument> Element
+**************************
+
+``Argument`` element defines one command line argument for it's parent command.
+
+
+Attributes
+++++++++++++++++++++++++++
+
+Value is given in attribute ``value`` and can contain any string value. When executing the command all attributes are 
+combined to be a single string that is passed as a parameter to executable.
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+value                 Yes                     Defines a one command line argument for it's parent command.
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+	<argument value="-o output/content" />
+	<argument value="--add-setting-file=c:\temp.txt" />
+	<argument value="${preinstallmeta.product}"/>
+
+<pipe> Element
+**************************
+
+Pipes are used to specify executed program's standard input, output and error file handles.    
+
+Attributes
+++++++++++++++++++++++++++
+
+``Pipe`` has two mandatory arguments ``name`` and ``value``.
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+name                  Yes                     Defines the name of the pipe. Possible values are: "stdin", "stdout" and 
+                                              "stderr". That are executed programs' standard input, standard output and 
+                                              standard error file handles, respectively.
+value                 Yes                     Value can be either PIPE to indicate that new should be defined or then 
+                                              filename. Stderr additionally can have also value STDOUT, which indicates that 
+                                              the stderr data from the applications should be captured into the same file 
+                                              handle as for stdout.
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+	<pipe name="stdout" value="x:\\logia.txt"/>
+	<pipe name="stderr" value="STDOUT"/>
+
+<filter> Element
+**************************
+
+Filters are used to analyse output of executed command and report the findings to ConE log file. This enables that 
+executed program's errors are easily available for users. 
+
+Attributes
+++++++++++++++++++++++++++
+
+``Filter`` element has four attributes: ``severity``, ``condition``, ``input`` and ``formatter``.
+ 
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+severity              Yes                     Defines logging level e.g. "info" means that possible findings are reported as
+                                              info elements. Other options for severity are "warning", "debug", "exception",
+                                              "error" and "critical". Default value is "info".
+condition             Yes                     Defines a Python regexp pattern that is used to match lines from the 
+                                              defined input pipe. Notice that you can use named groups to get some relevant 
+                                              information stored for formatter use.
+input                 Yes                     Input can be either "stdout" or "stderr". 
+formatter             No                      Formatter defines how the findings are reported in ConE output. It is 
+                                              sprintf-style string which can contain named groups from condition. If 
+                                              formatter is empty found line is printed as such. See examples below.
+====================  ======================  ===============================================================================
+
+Example
+++++++++++++++++++++++++++
+
+.. code-block:: xml
+
+	<filter severity="info" condition="\s*\'(?P&lt;name&gt;.*)\' => \'(?P&lt;uid&gt;.*)\'" input="stdout" formatter="Installed %(name)s using UID: %(uid)s"/>
+	<filter severity="debug" condition=".*successfully.*" input="stdout"/>
+	<filter severity="error" condition="Installation of \'(?P&lt;name&gt;.*)\' failed! See the log for details and contact Delevopment team." input="stdout" formatter="Install manually %(name)s!"/>
+			
+The first one defines that findings are reported as info elements. Condition element defines two named groups "name" and
+"uid" which are also used in formatter when printing information to ConE's log file. 
+The second one tries to find any line containing word "successfully" and prints the whole line as debug element.
+The last one print all failed cases as errors and uses again named groups to extract data from input stream. 
+
+
+Full example files
+''''''''''''''''''
+
+.. literalinclude:: preinstall.commandml
+   :language: xml
+ 
+
+XSD
+'''
+
+.. note::
+
+   This will be added later.
+
+
+FAQ
+'''''''''''''
+
+This will be updated based on the questions.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/commandml-plugin/preinstall.commandml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<commandml xmlns="http://www.s60.com/xml/commandml/1">
+
+	<condition value="${preinstallmeta.input} != ''">
+		<command executable="\Preinstallation\preinstallation.exe" cwd="x:\" shell="true">
+			<argument value="${preinstallmeta.product}"/>
+			<argument value="${preinstallmeta.input}" />
+			<argument value="%CONE_OUT_ABSOLUTE%\content" />
+			<argument value="01" />
+			<pipe name="stdout" value="x:\\logia.txt"/>
+			<pipe name="stderr" value="STDOUT"/>
+		
+			<filter severity="info" condition="\s*\'(?P&lt;name&gt;.*)\' => \'(?P&lt;uid&gt;.*)\'" input="stdout" formatter="Installed %(name)s using UID: %(uid)s"/>
+			<filter severity="debug" condition=".*successfully.*" input="stdout"/>
+			<filter severity="error" condition="Installation of \'(?P&lt;name&gt;.*)\' failed! See the log for details and contact Delevopment team." input="stdout" formatter="Install manually %(name)s!"/>		
+		</command>
+	
+		<command executable="notepad.exe">
+			<argument value="x:\\logia.txt"/>		
+		</command>
+	</condition>
+
+</commandml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/contentml-plugin/content.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,168 @@
+How to use the ConE Content plugin
+==================================
+
+Introduction
+'''''''''''''
+The basic concept of Content plugin is to transfer file resources from
+one place to another. So one may have for example; an audio file stored in the
+configuration project and needs to define the audio file location in the
+device. With ConE Content plugin you can basically define a copy operation. 
+You just create <somename>.content (or general *.implml file) type file to the configuration project implml folder 
+and set the rules or filters in there.    
+
+
+content elements
+----------------
+The content model is drawn out as a uml model in below picture.
+
+  .. image:: content2.jpg
+
+content
+^^^^^^^
+The root element of the content file is always content, which defines the xml namespace (xmlns) 
+to http://www.s60.com/xml/content/2 in the current version. 
+
+**content example**::
+
+  <content xmlns="http://www.s60.com/xml/content/2"/>
+
+tag
+^^^^
+
+Implementation tag elements can be defined under the root element. See the page on `tags <tags.html>`_ for more info.
+
+output
+^^^^^^
+The output element can define a output folder where content is copied from :ref:`content-input` elements that 
+are children of this particular output. There can be several output elements inside a single content 
+file or block.
+
+**output example**::
+
+  <output dir="foobar"/>
+
+The above statement defines that content is copied under foobar folder in the cone output folder.
+
+
+.. _content-input:
+
+input
+^^^^^^
+The user can define input under the output element. The input element can define a source directory and two file filters for 
+that directory (include and exclude filters). The input element will always search files under the content directories of the 
+configuration project. But the content of the search directory is a layered content of all configuration project content directories 
+(See content layering in Configuration project specification (TODO: add link here)).
+
+**input example**::
+
+  <input dir="foobar"/>
+
+the above statement would include all files found under foobar directory.::
+
+  <input file="foobar/file1.txt"/>
+
+the above statement would include file1.txt from folder foobar to the copy operation.
+
+include
+^^^^^^^^
+The include filter can be used inside input statement to filter files for the copy operation.
+
+The include filter can have following attributes.
+
++------------------+-------------------------------------------+
+| Attribute name   | description                               |
++==================+===========================================+
+| files            | comma separated list of inpu files.       |
++------------------+-------------------------------------------+
+| pattern          | regexp pattern to filter input files that |
+|                  | are found in the input folder.            |
++------------------+-------------------------------------------+
+| flatten          | "true"|"false" to define if the directory |
+|                  | struture is flattened at output.          |
++------------------+-------------------------------------------+
+
+**input include example**
+
+This would copy files foobar/test/override.txt and foobar/test/s60.txt to output if they are found.::
+
+  <input dir="foobar">
+    <include files="test/override.txt, test/s60.txt"/>
+  <input>
+
+The below statement would copy all files ending with ".jpg" from userdata and copy them 
+directly to the output root folder.::
+
+  <input dir="userdata">
+    <include pattern="\.jpg$" flatten="true"/>
+  <input>
+
+exclude
+^^^^^^^^
+The exclude filter can be used similarly as the include filter, but in a negative meaning. 
+For example to ensure that files beginning with a dot are never copied.
+
+The exclude filter can have following attributes.
+
++------------------+-------------------------------------------+
+| Attribute name   | description                               |
++==================+===========================================+
+| pattern          | regexp pattern to filter input files that |
+|                  | are found in the input folder.            |
++------------------+-------------------------------------------+
+
+**input exclude example**
+
+This would exclude all files that have .svn as part of the file path::
+
+  <input dir="foobar">
+    <exclude pattern="\.svn"/>
+  <input>
+
+
+How to create a content file
+----------------------------
+
+* Create a new file in the content folder name for ex. mycontentfile.content
+* Set the file encoding to UTF-8
+* Set the definition tag first *<?xml version="1.0" encoding="UTF-8"?>*
+* Set the content tag *<content xmlns="http://www.s60.com/xml/content/1">*
+* Set the description tag *<desc>Copy only prod</desc>*
+* Set a content configuration tag for ex. *<include pattern="prod"/>*
+* Set another content configuration tag for ex. *<output dir="content"/>*
+* Close the content tag *</content>*
+
+Now you have content file which copies the prod files to the content directory in the device configuration 
+
+**example of a entire content file**
+
+The example defines here two copy operations to two different outputs. First one to content with selected 
+files as input and the other to include, where it tries to copy all \*.hrh files to the root of the include 
+directory.
+
+.. literalinclude:: example.content
+
+
+Logic and rules
+---------------
+
+What may you define with content file logic. Here are some explanations.
+
+* *<include pattern="prod"/>* include the files in the prod folder
+* *<exclude pattern="prod"/>* exclude the files in the prod folder
+* *<input dir="${content.inputdir}"/>* input files are setted in the value of the content/inputdir reference link in confml
+* *<output dir="${content.outputdir}"/>* output files are setted in the value of the content/outputdir reference link in confml
+
+So you may include and exclude folder and files. Content file definition supports regex patterns
+You may give the location of the content as a confml reference link, *note: use the dots instead of slashes*  
+ 
+ 
+XSD
+---
+
+.. literalinclude:: ../../xsd/contentml2.xsd
+   :linenos:
+
+ 
+FAQ
+---
+This will be updated based on the questions.
Binary file configurationengine/doc/plugins/contentml-plugin/content2.jpg has changed
Binary file configurationengine/doc/plugins/contentml-plugin/content_model.bmp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/contentml-plugin/example.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <tag name='target' value='foo'/>
+  <output dir="test/out" flatten='true'>
+    <input file="foobar/input/file1.txt"/>
+  </output>
+  <output dir="content">
+    <input>
+      <include files="test/override.txt, test/s60.txt"/>
+    </input>
+  </output>
+  <output dir="include" flatten='true'>
+    <input>
+      <include pattern="\.hrh$"/>
+    </input>
+  </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/convertprojectplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+User guide for Convert Project Plugin
+-------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use and configure Convert Project plugin. This plugin is 
+used to convert old style configuration structure to Configuration project. The plugin 
+can be used to create files and folders. For a folder you can define using absolute paths
+or wildcards which files from previous structure are copied to the new structure. For files
+it is possible just to copy a file from one location to another, create layer and configuration
+root files. For these more complex type of files you can select which files are included using
+absolute path or wildcards.
+
+
+Configuring
+''''''''''''
+Plugin is configured by modifying .convertprojectml file that must be located in some layer's implml folder
+that is included in generated configuration. Typical case is that the plugin is used in products that don't
+have configuration project and layers. In that case refer to Installation/Running part.
+
+Convert Project ML format
+~~~~~~~~~~~~~~~~~~~~~~~~~~
++------------------+-----------------+----------------+-------------------------------+
+| Elements         | Attributes      | Content model  | Description                   |
++==================+=================+================+===============================+
+| convertprojectml | xmlns           |targetProject   | Collective/Top-most element   |
+|                  |                 |layer*          | defines the namespace used    |
+|                  |                 |foreach*        | in the file.                  |
++------------------+-----------------+----------------+-------------------------------+
+| targetProject    | path            |                | Defines output path. By the   |
+|                  | validate        |                | default all the paths later   |
+|                  |                 |                | are relative to this path.    |
++------------------+-----------------+----------------+-------------------------------+
+| layer            | path            | folder*        | Defines one configuration     |
+|                  |                 | file*          | layer. Creates new layer      |
+|                  |                 |                | folder defined in the path.   |
+|                  |                 |                | Folder and file paths are     |
+|                  |                 |                | relative to this path.        |    
++------------------+-----------------+----------------+-------------------------------+
+| folder           | path            | filter*        | Defines one folder inside a   |
+|                  |                 |                | layer. Creates new folder     |
+|                  |                 |                | using path. Filter paths are  |
+|                  |                 |                | relative to this path.        |
++------------------+-----------------+----------------+-------------------------------+
+| file             | path            | filter*        | Element which can be used     |
+|                  | type            |                | for three different purposes. |
+|                  |                 |                | Copying files, creating layer |
+|                  |                 |                | roots and configuration roots.| 
+|                  |                 |                | Path defines target filename  |
+|                  |                 |                | and type which kind of file   |
+|                  |                 |                | is created.                   |
++------------------+-----------------+----------------+-------------------------------+
+| filter           | action          |                | Filter is the element that    |
+|                  | data            |                | does all the work. It has     |
+|                  | remove_includes |                | attribute action, which can be|
+|                  |                 |                | add, remove, include_file or  |
+|                  |                 |                | include_layer. Data defines   |
+|                  |                 |                | the search pattern for action | 
+|                  |                 |                | Remove_includes can be used to|
+|                  |                 |                | remove all existing includes  |
+|                  |                 |                | from files that are included  |
+|                  |                 |                | in layer root file.           |
++------------------+-----------------+----------------+-------------------------------+
+
+
+Installation/Running
+'''''''''''''''''''''
+1. Download and install ConE according the ConE installation documentation.
+2. Go to \\epoc32\\rom\\config folder
+3. Create convertproject and convertproject\\implml folders
+4. Copy example create_project.convertprojectml to convertproject\\implml folder
+5. Modify according your needs
+6. Create a layer root file called root.confml in convertproject folder. Use the following content:
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="ASCII"?>
+  <confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xmlns:confml="http://www.s60.com/xml/confml/2" 
+    xmlns:xi="http://www.w3.org/2001/XInclude" 
+    xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  </confml:configuration>
+
+7. Create configuration root file called convert.confml in \epoc32\rom\config folder. Use the following content:
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="ASCII"?>
+  <confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+    xmlns:confml="http://www.s60.com/xml/confml/2" 
+    xmlns:xi="http://www.w3.org/2001/XInclude" 
+    xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  	<xi:include href="convertproject/root.confml"/>
+  </confml:configuration>
+
+8. Run ConE to generate content. 
+
+::
+
+  \epoc32\rom\config>cone --action generate -c convert.confml
+
+
+Examples
+'''''''''
+
+XSD
+'''
+
+Download: :download:`projectml.xsd </xsd/projectml.xsd>`
+
+
+FAQ
+'''''''''
+This will be updated based on the questions.
+
+
+
+
+
Binary file configurationengine/doc/plugins/crml-plugin/crml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/crml-plugin/crmlplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,203 @@
+User guide for Crml Plugin usage in ConE
+----------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use ConE crml plugin. Crml plugin generates cenrep files out of 
+configuration project which contains valid confml files and matching crml files.
+Generated files can be included in phone image and creates settings according to confml and crml files.
+You may change confml values and generate or regenerate confml project and thge generated cenrep files are changed
+to given values. All files will be file encoded to UTF-16, (so you need a UTF-16 supported editor to view the
+contents of the files)
+
+CrML files are executed by default in **normal** :ref:`invocation phase <implml-common-invocation-phase>`.
+
+CrML
+'''''''''
+
+The CrML syntax is a extension of Configuration markup language (confml). The term in confml for this extension 
+is implementation method language (implml), which in CrML case is a xml file. 
+
+All input values can be given as ConfML refs or as plain text. Also mixing text and ConfML ref information
+is supported. 
+
+  * Namespace: ``http://www.s60.com/xml/cenrep/1``
+  * File extension: ``crml``
+
+.. note::
+
+   More information about :ref:`file extensions <implml-file-extensions>`. 
+
+CrML Elements
+.............
+
+The CrML model is drawn out as a uml model in below picture.
+
+  .. image:: crml.jpg
+
+.. note::
+
+   CrML supports also common ImplML elements. More information about :ref:`ImplML elements <implml-common-elements>` . 
+
+
+<repository> Element
+**************************
+
+The repository element represents a single key repository (keyspace) in Central Repository.
+
+Child Elements
+++++++++++++++
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+key                   0 .. *                  Defines a single key in repository in Central Repository.
+keyRange              0 .. *                  Defines a range of keys in repository in Central Repository.
+access                0 .. 2                  Defines a represents read or write access control policy for a single key 
+                                              or a key range. 
+====================  ======================  ===============================================================================
+
+Attributes
+++++++++++
+
+===================================  ======================  ===============================================================================
+Attribute                            Required                Description
+===================================  ======================  ===============================================================================
+version                              Yes                     Defines the version of the language used. Must have value "1.0".
+uidName                                                      Defines the unique identifier of the repository in symbolic form.
+uidValue                                                     Defines the unique identifier of the repository in hexadecimal form. 
+initialialisationFileVersion                                 Defines the version of the initialization file format. Default value is "1".
+owner                                                        Defines the SID of the application or component which is responsible for 
+                                                             backing up the repository. Defined in the form of hexadecimal number. 
+                                                             Mandatory in case if repository contents are to be backed up by the secure
+                                                             backup server.
+backup                                                       Defines the default backup policy for runtime created keys. The supported 
+                                                             values are "true" and "false". Should be set to true for non-read-only 
+                                                             (that is, runtime writable) keys only. Default value is false.
+===================================  ======================  ===============================================================================
+
+
+Example
++++++++
+
+.. code-block:: xml
+
+  <repository version="1.0" uidName="KCRUidAvkon" uidValue="0x101F876E" owner="0x10207218">
+        <desc>Keys for Avkon</desc>
+        <meta>
+            ...
+        <meta/>
+        <change>First version</change>
+        <key>
+            ...
+        <key/>
+        <key>
+            ...
+        <key/>
+        <access>
+            ...
+        </access>
+  </repository>
+
+
+<key> Element
+**************************
+
+The key element represents a single key in repository in Central Repository.
+
+Child Elements
+++++++++++++++
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+value                 0 .. *                  Defines a mapping from a logical value in Configuration ML to an implementation
+                                              specific value in a key in Central Repository.
+bit                   0 .. *                  Defines a mapping from values of set of Boolean type settings in Configuration
+                                              ML to a bitmask stored in a single key in Central Repository..
+access                0 .. 2                  Defines a represents read or write access control policy for a single key 
+                                              or a key range. 
+====================  ======================  ===============================================================================
+
+Attributes
+++++++++++
+
+===================================  ======================  ===============================================================================
+Attribute                            Required                Description
+===================================  ======================  ===============================================================================
+name                                 Yes                     Defines the version of the language used. Must have value "1.0".
+===================================  ======================  ===============================================================================
+
+
+Example
++++++++
+
+.. code-block:: xml
+
+  <repository version="1.0" uidName="KCRUidAvkon" uidValue="0x101F876E" owner="0x10207218">
+        <desc>Keys for Avkon</desc>
+        <meta>
+            ...
+        <meta/>
+        <change>First version</change>
+        <key>
+            ...
+        <key/>
+        <key>
+            ...
+        <key/>
+        <access>
+            ...
+        </access>
+  </repository>
+
+
+
+
+
+
+
+
+
+
+
+Examples
+'''''''''
+
+**Cenrep file example**
+
+* cenrep
+* version 1
+* [defaultmeta]
+* 0
+* cap_rd=alwayspass cap_wr=alwayspass
+* [Main]
+* 0x1 int 21 0 cap_rd=alwayspass cap_wr=alwaysfail
+* 0x3 int 1801115478 0 cap_wr=alwaysfail
+* 0x4 int 1082261569 0 cap_wr=alwaysfail
+
+**What do the values mean**
+
+
+* cenrep = tells that this is a cenrep configuration
+* version = current version value
+* [defaultmeta] = if the value is zero this file is not backuped in the rofs
+* [platsec] = the values tells that which capabilities are passed or failed
+* [Main] = start of the cenrep value information
+* ex. 0x4 int 1082261569 0 cap_wr=alwaysfail
+* eq. key key type value backup value capabilities
+
+XSD
+'''''''''
+
+Download: :download:`crml.xsd </xsd/crml.xsd>`
+
+
+FAQ
+'''''''''
+This will be updated based on the questions.
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/dev-plugin/diagrams.uml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1801 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
+<XPD:HEADER>
+<XPD:SUBUNITS>
+</XPD:SUBUNITS>
+<XPD:PROFILES>
+</XPD:PROFILES>
+</XPD:HEADER>
+<XPD:BODY>
+<XPD:OBJ name="DocumentElement" type="UMLProject" guid="6KeNJgr/wES9F4tJ3lK8RAAA">
+<XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
+<XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="NmvwO09X4Uu7xy6qNwdIDQAA">
+<XPD:ATTR name="Name" type="string">Model1</XPD:ATTR>
+<XPD:REF name="Namespace">6KeNJgr/wES9F4tJ3lK8RAAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="xjfMh7hHB0yRVVZEtg/P0gAA">
+<XPD:ATTR name="Name" type="string">plugin_classes</XPD:ATTR>
+<XPD:REF name="DiagramOwner">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="BK0yJT3ojkSZinQsh3vGQAAA">
+<XPD:REF name="Diagram">xjfMh7hHB0yRVVZEtg/P0gAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">32</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLPackageView" guid="Nppn0CUEP0Stsi3DAR1qEQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">108</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">68</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">693</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">285</XPD:ATTR>
+<XPD:REF name="Model">Hwg8xLPVZkC6P9CDdGGF+AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="m1xRcmhV3UyjQ4RTwTs8uAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="NxczqaRxM0mWAC1PQpqRGAAA">
+<XPD:ATTR name="Text" type="string">ConE</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="nkzileV5sUKhi9VoagXc6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="wAAlrvfxtEKOP+5swZsyqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLPackageView" guid="xW95yby7XEChYzUI8UtliAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">440</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">380</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">377</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">117</XPD:ATTR>
+<XPD:REF name="Model">4cKvVc5Dtk6rtkH3X3B9egAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="SnrE2qvpfkqqEhfAdodwrAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="pt7kf3gtgE2QaGIWooJS7wAA">
+<XPD:ATTR name="Text" type="string">SomePlugin</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="TPJ0sV2ccESTEqRqozuu6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="D62/1pL0YUCwaBKlkMYEZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="EFzcsknNQ0O+rr8VseO9MAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">140</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">148</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">91</XPD:ATTR>
+<XPD:REF name="Model">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="tdytcNfaxE6dLcteHN1B8AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="5pV++MiEqEOKb94vAbT4XQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplContainer</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="yaxWkeq5K0CCgd5PiKKC0wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="x9M32RZcg0uVFEqdfPB9RQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="SdderwBH1U26ZhKsIrAmQwAA">
+<XPD:REF name="Model">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="53//Or3SzEObbCGytvM8TQAA">
+<XPD:REF name="Model">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="SQxim4OCp0+ZJfNVeMS4aAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="KeRNcoIQK0KSH6AGF9UzjAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">468</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">128</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">137</XPD:ATTR>
+<XPD:REF name="Model">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JCQ7VQT7f0q1y37o1kshfgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="KyMG+/a5EEqEL/gStwB+pgAA">
+<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplBase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="cVzPEcn/CUq8D3tJ26laAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="nK3wVMSMhkKPpbjBqZz6wwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="94btHH+JUU+ao60nWTUwWgAA">
+<XPD:REF name="Model">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="kRd6Ga/WzUSYRVtlWUo1fwAA">
+<XPD:REF name="Model">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qDts8Y2Udkq6d1jGIg7T4wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="2t2cUMI4f0SGZ3fMzCfV2QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">704</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">152</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">78</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:REF name="Model">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="ehCmhp0KiEuLmmRuBQAhrAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="D7s0nT3D0EWZSzGPHYybZgAA">
+<XPD:ATTR name="FontStyle" type="integer">3</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ReaderBase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ak1TN+w/1UOcgkM/VETGpAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="MCmsHWgktUuKBkikcg1EcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="/u6i3dXZNU2AP0PCNI7GSQAA">
+<XPD:REF name="Model">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="uNXhwkTmbEquIsikeV1LWAAA">
+<XPD:REF name="Model">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="88ZZOi003UKll1SgqtSxEQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="zI4lKX8LzEOx0+WhlofgbAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">248</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">264</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">132</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
+<XPD:REF name="Model">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="af3LLWcMPkGyURaYxfc0PQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="9B6aMcJu6kCp86tR5CEk1wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplFactory</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="rI5tkKMEZ0WV8ZI9MzBHpQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="X0PWYwham0edPgfaRSVhRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ddVvnRrsbk6JMbZwvUAIMwAA">
+<XPD:REF name="Model">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="SrKOQ+6xAEixnwjVm44qzwAA">
+<XPD:REF name="Model">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="i49PYXAsJEeL78AfaOuTSwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLNoteView" guid="rgxZZaZClU6wEpDN1SC00gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">468</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">516</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">207</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">38</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">The reader parses an ElementTree into
+an implementation instance
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="4SjQyNgUikC1rO8p+sfTWgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">684</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">412</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">109</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="jznMZQeVzkW1SptgwxOiEAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="mWWlefArAESLdwpVLw1WfAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SomeImplReader</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="HdoZu+iK+EO/cgK+6uBd5AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="k0pwPjJ5ZEue8AFHR2yWkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="85Z9UACcZEOduM93pKK9dwAA">
+<XPD:REF name="Model">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="WpQE1QO6okWgjYYOPj427QAA">
+<XPD:REF name="Model">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="jA/eMkbe1UOQyseQvko2pAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLClassView" guid="3rR9ifA3E0iINKcyT2xupAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">488</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">412</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="TLAmQA1HRUqeQKkBeNs7ZQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="YV171cCGik2BSK/UXFONfQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SomeImpl</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="XBZdFiOKF0uGZBnbWyXdHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="39Oq5qy3f0ih5ZaSXrrNyAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="H66ci42eykeVpww3gwtXTwAA">
+<XPD:REF name="Model">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="irrPzs4H9UeRXWlc31bdZQAA">
+<XPD:REF name="Model">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="syhxMXb3YE2k1uMifcmEVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLRealizationView" guid="WkxNO77jO0iqN3Zx3pTsXAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">526,412;521,264</XPD:ATTR>
+<XPD:REF name="Model">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+<XPD:REF name="Head">KeRNcoIQK0KSH6AGF9UzjAAA</XPD:REF>
+<XPD:REF name="Tail">3rR9ifA3E0iINKcyT2xupAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="hq+xPUiczUiXV1J9khEpCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="oxtgEPTKIkyuZW+/1ioAPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="C3LeagDb40ac4fqEDvNK5AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLRealizationView" guid="6joY7NxGn0ahIzUv8F22pwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">738,412;742,207</XPD:ATTR>
+<XPD:REF name="Model">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+<XPD:REF name="Head">2t2cUMI4f0SGZ3fMzCfV2QAA</XPD:REF>
+<XPD:REF name="Tail">4SjQyNgUikC1rO8p+sfTWgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dJOe2AeIeUurT8IIpz869QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="cxdf5fynWEG7/Wzlz9wAZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="COnrVcktJUCdGcPafp3OSAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="qO84lDa9Q0qJdFLxAzRcQQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">468,193;241,193</XPD:ATTR>
+<XPD:REF name="Model">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+<XPD:REF name="Head">EFzcsknNQ0O+rr8VseO9MAAA</XPD:REF>
+<XPD:REF name="Tail">KeRNcoIQK0KSH6AGF9UzjAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6v13bJAx1kq9YduccEEU9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZMzpEg3HoEqa10tH7B2G8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="o11tppkaYkmmUpyKj45BzAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ymxDIXyVUESDyLIcICrGWQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YdiI7jGOKUSsfpXfOQgATwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="6HcxdQob+UOT1wCYJ4QeHgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">28/H60miw0SOAfSjEXfz2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="I8zAzIUs30G8GAyGAkzPOAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YdiI7jGOKUSsfpXfOQgATwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="tMamOzqFxk6hZeNgqluobwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">28/H60miw0SOAfSjEXfz2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9JS131H/4US3bVVB0X+RIAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YdiI7jGOKUSsfpXfOQgATwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="MfI12JH1kkSbXGyVvMqqXQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">28/H60miw0SOAfSjEXfz2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="itBAlqtdlUK0IXNYnX3+mQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-992</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-884</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">YdiI7jGOKUSsfpXfOQgATwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="/ARNc/hPvUmBl4qb/XiPqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-992</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-884</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">28/H60miw0SOAfSjEXfz2wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLNoteView" guid="TDaVJ50TjUeD2ieOY0LepAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">264</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">178</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">53</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplContainer contains a number
+of implementation instances and
+generates output using them.
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLNoteLinkView" guid="XozSj+GfV0uutOU6chNAiAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">354,193;352,52</XPD:ATTR>
+<XPD:REF name="Head">TDaVJ50TjUeD2ieOY0LepAAA</XPD:REF>
+<XPD:REF name="Tail">qO84lDa9Q0qJdFLxAzRcQQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="iyKZKLbxiESYfeiNMEfWLgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">684,433;567,433</XPD:ATTR>
+<XPD:REF name="Model">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+<XPD:REF name="Head">3rR9ifA3E0iINKcyT2xupAAA</XPD:REF>
+<XPD:REF name="Tail">4SjQyNgUikC1rO8p+sfTWgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="XWmIOlAy8Eexc2A3fTOWPQAA">
+<XPD:ATTR name="Alpha" type="real">-1.48013734123357</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">11.0453610171873</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">creates</XPD:ATTR>
+<XPD:REF name="Model">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="eEvmFxzBgkKlJ6XZoJKLxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="SPWavA2MwUqTfTnCvOFgkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vMwGVXrxPkCKOvOAPR6ytQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XFmHn8b6Sk2ycMUt8wH3vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="hIeXX5pEhk+9J80xff/Z2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">eu5J5ZGSGUmZFfbh0cHFewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="b6bOArvlz0+mgsrQHIOI8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XFmHn8b6Sk2ycMUt8wH3vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="USMA9tEXpkGY+pAIVRjLHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">eu5J5ZGSGUmZFfbh0cHFewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="BAaRrPSiRkWfQQrnfeF5BQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">XFmHn8b6Sk2ycMUt8wH3vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Jn/ACJad8kOY5lGCpXLetQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">eu5J5ZGSGUmZFfbh0cHFewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="rACoLZEoXESlgVdLXl1ocQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-988</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-828</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">XFmHn8b6Sk2ycMUt8wH3vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WNomTSYdhk6j1wGMK0aBMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-988</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-828</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">eu5J5ZGSGUmZFfbh0cHFewAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[15]" type="UMLNoteLinkView" guid="e7EiOCYg7kG9y74/QKmn5QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">625,433;581,516</XPD:ATTR>
+<XPD:REF name="Head">rgxZZaZClU6wEpDN1SC00gAA</XPD:REF>
+<XPD:REF name="Tail">iyKZKLbxiESYfeiNMEfWLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[16]" type="UMLNoteView" guid="WEQcc/1ot022Zyx0YQRFvgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">56</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">384</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">202</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">83</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">When an ImplContainer is created
+on a Configuration,
+ImplFactory.get_impls_from_file()
+is used on all supported files to create
+the list of implementation instances.
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[17]" type="UMLNoteLinkView" guid="vf8S+rWH70aErPaeodr5mAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">207,384;271,332</XPD:ATTR>
+<XPD:REF name="Head">zI4lKX8LzEOx0+WhlofgbAAA</XPD:REF>
+<XPD:REF name="Tail">WEQcc/1ot022Zyx0YQRFvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[18]" type="UMLNoteLinkView" guid="AbL5/4VmAkmLQw1K1Y0GcgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">183,238;162,384</XPD:ATTR>
+<XPD:REF name="Head">WEQcc/1ot022Zyx0YQRFvgAA</XPD:REF>
+<XPD:REF name="Tail">EFzcsknNQ0O+rr8VseO9MAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[19]" type="UMLNoteView" guid="zA6aIDQK/EuSXUqQ3E5MsQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">200</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">496</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">192</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">68</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplContainer.get_impls_from_file()
+in turn uses all registered reader
+classes to create the actual
+implementations.
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[20]" type="UMLNoteLinkView" guid="/6Y9N7tPhUqezWFnMIlPBgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">310,332;298,496</XPD:ATTR>
+<XPD:REF name="Head">zA6aIDQK/EuSXUqQ3E5MsQAA</XPD:REF>
+<XPD:REF name="Tail">zI4lKX8LzEOx0+WhlofgbAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[21]" type="UMLNoteLinkView" guid="0z/q5TcXCUykKBGSJG0f6AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">488,449;375,496</XPD:ATTR>
+<XPD:REF name="Head">zA6aIDQK/EuSXUqQ3E5MsQAA</XPD:REF>
+<XPD:REF name="Tail">3rR9ifA3E0iINKcyT2xupAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[22]" type="UMLNoteLinkView" guid="PA7yhUctvESlDX8m2wkXawAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">684,445;391,508</XPD:ATTR>
+<XPD:REF name="Head">zA6aIDQK/EuSXUqQ3E5MsQAA</XPD:REF>
+<XPD:REF name="Tail">4SjQyNgUikC1rO8p+sfTWgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[23]" type="UMLNoteView" guid="D2lNkx9zqkGIrORCziB2MwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">568</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">16</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">190</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">38</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplBase and ReaderBase comprise
+the ConE plug-in interface
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[24]" type="UMLNoteLinkView" guid="rLbnX8lUnkuZIFnnqHyCMQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">569,139;645,53</XPD:ATTR>
+<XPD:REF name="Head">D2lNkx9zqkGIrORCziB2MwAA</XPD:REF>
+<XPD:REF name="Tail">KeRNcoIQK0KSH6AGF9UzjAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[25]" type="UMLNoteLinkView" guid="Va6jpciK90aWET6pzoYRiAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">727,152;672,53</XPD:ATTR>
+<XPD:REF name="Head">D2lNkx9zqkGIrORCziB2MwAA</XPD:REF>
+<XPD:REF name="Tail">2t2cUMI4f0SGZ3fMzCfV2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[26]" type="UMLNoteView" guid="v84tCD/ORU6aA+sNvC8HbgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">20</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">12</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">167</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">38</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ImplContainer is used when
+generating output using ConE.
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[27]" type="UMLNoteLinkView" guid="luo/E4PDBEWDV/JjLqFzkgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">166,148;113,49</XPD:ATTR>
+<XPD:REF name="Head">v84tCD/ORU6aA+sNvC8HbgAA</XPD:REF>
+<XPD:REF name="Tail">EFzcsknNQ0O+rr8VseO9MAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[28]" type="UMLAssociationView" guid="bXvOSs/6UES15aDKmn3tXwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">241,237;273,264</XPD:ATTR>
+<XPD:REF name="Model">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+<XPD:REF name="Head">zI4lKX8LzEOx0+WhlofgbAAA</XPD:REF>
+<XPD:REF name="Tail">EFzcsknNQ0O+rr8VseO9MAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="L9RK4KdHs0+ZCinhj9kSUQAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">uses</XPD:ATTR>
+<XPD:REF name="Model">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="A+D5vQx9bkm3AkTkaVYCZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="fupy5ZQhwkmHjREiTpmstwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Rn+WUty/KE6o3UWIZm/++wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DDj3t0783k6mjECBMHSRZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="YQ4SH0PbkU6D2Ed6kFWZ3gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">isxYyJJ+aEilbZtDDhOMqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="e/X32+GrOUiRRJMneGhhrwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DDj3t0783k6mjECBMHSRZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="uC7b5/Ag8E+lVXijU0puEAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">isxYyJJ+aEilbZtDDhOMqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="7gOWzEGpb0KSajbXDeX03QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DDj3t0783k6mjECBMHSRZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="au7s+O1a6EOhU92BZ9mTfAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">isxYyJJ+aEilbZtDDhOMqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="1RN9/oe60kCHXG3xE2fYmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">DDj3t0783k6mjECBMHSRZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="SutSAX/p70WlhiBCYP5mIQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">isxYyJJ+aEilbZtDDhOMqwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[29]" type="UMLAssociationView" guid="s/hl5J8Ex0WfRP8M9AKteQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">379,303;688,324;728,412</XPD:ATTR>
+<XPD:REF name="Model">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+<XPD:REF name="Head">4SjQyNgUikC1rO8p+sfTWgAA</XPD:REF>
+<XPD:REF name="Tail">zI4lKX8LzEOx0+WhlofgbAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="cHQJb0VhkEaKSG9FNZH8ywAA">
+<XPD:ATTR name="Alpha" type="real">-2.23603261405275</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">76.1577310586391</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">uses</XPD:ATTR>
+<XPD:REF name="Model">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="NIiBXFgih0OcuF+WiDNxzQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="f5/Uw2VFyEy4ygXzpaawvwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="65oSMAg0mkmODMiMbf+UjQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeNNCbWnPEKWIb774GWlfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Ao1mzGyZkUOXJ7iUZ+CxmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+uses</XPD:ATTR>
+<XPD:REF name="Model">3XKRVnprcUe5DKIkXzT8QQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="znikN5jxMkWgoTVeUx7U0wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeNNCbWnPEKWIb774GWlfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="60bFmV8mJ02N5+zPFmP+cAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3XKRVnprcUe5DKIkXzT8QQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="6vvMJYaqA0+EsdkZT8o6oAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">AeNNCbWnPEKWIb774GWlfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Mlo0JoqcnUWmKG46gdW/pgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3XKRVnprcUe5DKIkXzT8QQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="AnbfKLYaZ0qC8tWUwfnFkgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">AeNNCbWnPEKWIb774GWlfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hQN6K9SliEunBHaWLwTWywAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">3XKRVnprcUe5DKIkXzT8QQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[30]" type="UMLNoteView" guid="gHH7Ol36xE6LN+W/djXgswAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00DFFFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">700</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">540</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">163</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">53</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SomePlugin provides concrete
+implementations for ImplBase
+and ReaderBase.
+</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[31]" type="UMLNoteLinkView" guid="UUSTx1CjYkSB4zwe2eut8QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">697,496;750,540</XPD:ATTR>
+<XPD:REF name="Head">gHH7Ol36xE6LN+W/djXgswAA</XPD:REF>
+<XPD:REF name="Tail">xW95yby7XEChYzUI8UtliAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">17</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="q11CD3et4kixnDRLW4nPdgAA">
+<XPD:ATTR name="Name" type="string">ImplContainer</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">EFzcsknNQ0O+rr8VseO9MAAA</XPD:REF>
+<XPD:REF name="Views[1]">SdderwBH1U26ZhKsIrAmQwAA</XPD:REF>
+<XPD:REF name="Views[2]">53//Or3SzEObbCGytvM8TQAA</XPD:REF>
+<XPD:REF name="Views[3]">SQxim4OCp0+ZJfNVeMS4aAAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="Dze79j8k10STk0ca790m8AAA">
+<XPD:ATTR name="Name" type="string">list_output_files</XPD:ATTR>
+<XPD:REF name="Owner">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="gWPbYCsObkaLeUAMxcpkswAA">
+<XPD:ATTR name="Name" type="string">generate</XPD:ATTR>
+<XPD:REF name="Owner">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Tw0jz1gQwUauj0Kj0RY98AAA">
+<XPD:ATTR name="Name" type="string">post_generate</XPD:ATTR>
+<XPD:REF name="Owner">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">YdiI7jGOKUSsfpXfOQgATwAA</XPD:REF>
+<XPD:REF name="Associations[1]">isxYyJJ+aEilbZtDDhOMqwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="WHtheP8K+EOVIcif9grlKAAA">
+<XPD:ATTR name="Name" type="string">GenerationContext</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="0BIWI7z7dEuRC7OQHj3xXQAA">
+<XPD:ATTR name="Name" type="string">tags</XPD:ATTR>
+<XPD:REF name="Owner">WHtheP8K+EOVIcif9grlKAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="g0zWWZA9xEWvFh0sRnmMqgAA">
+<XPD:ATTR name="Name" type="string">ImplBase</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">KeRNcoIQK0KSH6AGF9UzjAAA</XPD:REF>
+<XPD:REF name="Views[1]">94btHH+JUU+ao60nWTUwWgAA</XPD:REF>
+<XPD:REF name="Views[2]">kRd6Ga/WzUSYRVtlWUo1fwAA</XPD:REF>
+<XPD:REF name="Views[3]">qDts8Y2Udkq6d1jGIg7T4wAA</XPD:REF>
+<XPD:ATTR name="#SupplierDependencies" type="integer">1</XPD:ATTR>
+<XPD:REF name="SupplierDependencies[0]">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">7</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="7/HzJypacUuWxsqBrG3r/AAA">
+<XPD:ATTR name="Name" type="string">generate</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="fu4m8lE/Ckics8HwZqHhvgAA">
+<XPD:ATTR name="Name" type="string">post_generate</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[2]" type="UMLOperation" guid="Ck/ookNaBkqEy6MCnwMMzgAA">
+<XPD:ATTR name="Name" type="string">list_output_files</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[3]" type="UMLOperation" guid="h7j0CQ0NRUGcAG628dV/KwAA">
+<XPD:ATTR name="Name" type="string">get_refs</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[4]" type="UMLOperation" guid="UEykgJeky0OZGrz7BkifyAAA">
+<XPD:ATTR name="Name" type="string">get_tags</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[5]" type="UMLOperation" guid="wG19QxN7lUOekZSOlLgagAAA">
+<XPD:ATTR name="Name" type="string">has_ref</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[6]" type="UMLOperation" guid="XyxpG7Yk+UCV/acdSC77mAAA">
+<XPD:ATTR name="Name" type="string">has_tag</XPD:ATTR>
+<XPD:REF name="Owner">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">28/H60miw0SOAfSjEXfz2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="lPra4OiszU2H/arMBBwTVgAA">
+<XPD:ATTR name="Name" type="string">ReaderBase</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2t2cUMI4f0SGZ3fMzCfV2QAA</XPD:REF>
+<XPD:REF name="Views[1]">/u6i3dXZNU2AP0PCNI7GSQAA</XPD:REF>
+<XPD:REF name="Views[2]">uNXhwkTmbEquIsikeV1LWAAA</XPD:REF>
+<XPD:REF name="Views[3]">88ZZOi003UKll1SgqtSxEQAA</XPD:REF>
+<XPD:ATTR name="#SupplierDependencies" type="integer">1</XPD:ATTR>
+<XPD:REF name="SupplierDependencies[0]">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="A0zkUtAbbEClGNzgeAs/qQAA">
+<XPD:ATTR name="Name" type="string">read_impl</XPD:ATTR>
+<XPD:ATTR name="IsAbstract" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Owner">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="JQvuxGbsdE2jFadShkxqKgAA">
+<XPD:ATTR name="Name" type="string">SomeImpl</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3rR9ifA3E0iINKcyT2xupAAA</XPD:REF>
+<XPD:REF name="Views[1]">H66ci42eykeVpww3gwtXTwAA</XPD:REF>
+<XPD:REF name="Views[2]">irrPzs4H9UeRXWlc31bdZQAA</XPD:REF>
+<XPD:REF name="Views[3]">syhxMXb3YE2k1uMifcmEVQAA</XPD:REF>
+<XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
+<XPD:REF name="ClientDependencies[0]">0MZJX1cCj0mQ/11HQ5cN7AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">XFmHn8b6Sk2ycMUt8wH3vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="3dlH2vm6sEayyvEaXZoCngAA">
+<XPD:ATTR name="Name" type="string">ImplFactory</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zI4lKX8LzEOx0+WhlofgbAAA</XPD:REF>
+<XPD:REF name="Views[1]">ddVvnRrsbk6JMbZwvUAIMwAA</XPD:REF>
+<XPD:REF name="Views[2]">SrKOQ+6xAEixnwjVm44qzwAA</XPD:REF>
+<XPD:REF name="Views[3]">i49PYXAsJEeL78AfaOuTSwAA</XPD:REF>
+<XPD:ATTR name="#Operations" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Operations[0]" type="UMLOperation" guid="WhbQqhnDoUuwU0aUr5VJ4AAA">
+<XPD:ATTR name="Name" type="string">is_supported_impl_file</XPD:ATTR>
+<XPD:REF name="Owner">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Operations[1]" type="UMLOperation" guid="ui2gTBnYskSVOWfH2l5/ZwAA">
+<XPD:ATTR name="Name" type="string">get_impls_from_file</XPD:ATTR>
+<XPD:REF name="Owner">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">DDj3t0783k6mjECBMHSRZgAA</XPD:REF>
+<XPD:REF name="Associations[1]">3XKRVnprcUe5DKIkXzT8QQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="9Gmq2XRQe0uhIOMxfWk+VAAA">
+<XPD:ATTR name="Name" type="string">Configuration</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="ZxYE1Q8ZZ0CKtQj/FNOQ7wAA">
+<XPD:ATTR name="Name" type="string">Jung, Yoontae</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLClass" guid="rDKOyCdZEkCOx+oFSF1RfgAA">
+<XPD:ATTR name="Name" type="string">SomeImplReader</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4SjQyNgUikC1rO8p+sfTWgAA</XPD:REF>
+<XPD:REF name="Views[1]">85Z9UACcZEOduM93pKK9dwAA</XPD:REF>
+<XPD:REF name="Views[2]">WpQE1QO6okWgjYYOPj427QAA</XPD:REF>
+<XPD:REF name="Views[3]">jA/eMkbe1UOQyseQvko2pAAA</XPD:REF>
+<XPD:ATTR name="#ClientDependencies" type="integer">1</XPD:ATTR>
+<XPD:REF name="ClientDependencies[0]">mo5tewceOUm0VDnSWRFvzgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">eu5J5ZGSGUmZFfbh0cHFewAA</XPD:REF>
+<XPD:REF name="Associations[1]">AeNNCbWnPEKWIb774GWlfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLRealization" guid="0MZJX1cCj0mQ/11HQ5cN7AAA">
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:REF name="Client">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+<XPD:REF name="Supplier">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">WkxNO77jO0iqN3Zx3pTsXAAA</XPD:REF>
+<XPD:REF name="Views[1]">hq+xPUiczUiXV1J9khEpCgAA</XPD:REF>
+<XPD:REF name="Views[2]">oxtgEPTKIkyuZW+/1ioAPAAA</XPD:REF>
+<XPD:REF name="Views[3]">C3LeagDb40ac4fqEDvNK5AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLRealization" guid="mo5tewceOUm0VDnSWRFvzgAA">
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:REF name="Client">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+<XPD:REF name="Supplier">lPra4OiszU2H/arMBBwTVgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">6joY7NxGn0ahIzUv8F22pwAA</XPD:REF>
+<XPD:REF name="Views[1]">dJOe2AeIeUurT8IIpz869QAA</XPD:REF>
+<XPD:REF name="Views[2]">cxdf5fynWEG7/Wzlz9wAZgAA</XPD:REF>
+<XPD:REF name="Views[3]">COnrVcktJUCdGcPafp3OSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="zHN3b0KW5kCvSqS/RtHanwAA">
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qO84lDa9Q0qJdFLxAzRcQQAA</XPD:REF>
+<XPD:REF name="Views[1]">6v13bJAx1kq9YduccEEU9gAA</XPD:REF>
+<XPD:REF name="Views[2]">ZMzpEg3HoEqa10tH7B2G8wAA</XPD:REF>
+<XPD:REF name="Views[3]">o11tppkaYkmmUpyKj45BzAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="28/H60miw0SOAfSjEXfz2wAA">
+<XPD:REF name="Association">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+<XPD:REF name="Participant">g0zWWZA9xEWvFh0sRnmMqgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">6HcxdQob+UOT1wCYJ4QeHgAA</XPD:REF>
+<XPD:REF name="Views[1]">MfI12JH1kkSbXGyVvMqqXQAA</XPD:REF>
+<XPD:REF name="Views[2]">tMamOzqFxk6hZeNgqluobwAA</XPD:REF>
+<XPD:REF name="Views[3]">/ARNc/hPvUmBl4qb/XiPqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="YdiI7jGOKUSsfpXfOQgATwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">zHN3b0KW5kCvSqS/RtHanwAA</XPD:REF>
+<XPD:REF name="Participant">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ymxDIXyVUESDyLIcICrGWQAA</XPD:REF>
+<XPD:REF name="Views[1]">9JS131H/4US3bVVB0X+RIAAA</XPD:REF>
+<XPD:REF name="Views[2]">I8zAzIUs30G8GAyGAkzPOAAA</XPD:REF>
+<XPD:REF name="Views[3]">itBAlqtdlUK0IXNYnX3+mQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="FJ1X3D9c80uG5EgY7ATqzQAA">
+<XPD:ATTR name="Name" type="string">creates</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">iyKZKLbxiESYfeiNMEfWLgAA</XPD:REF>
+<XPD:REF name="Views[1]">XWmIOlAy8Eexc2A3fTOWPQAA</XPD:REF>
+<XPD:REF name="Views[2]">eEvmFxzBgkKlJ6XZoJKLxQAA</XPD:REF>
+<XPD:REF name="Views[3]">SPWavA2MwUqTfTnCvOFgkAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="eu5J5ZGSGUmZFfbh0cHFewAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+<XPD:REF name="Participant">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hIeXX5pEhk+9J80xff/Z2QAA</XPD:REF>
+<XPD:REF name="Views[1]">Jn/ACJad8kOY5lGCpXLetQAA</XPD:REF>
+<XPD:REF name="Views[2]">USMA9tEXpkGY+pAIVRjLHAAA</XPD:REF>
+<XPD:REF name="Views[3]">WNomTSYdhk6j1wGMK0aBMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="XFmHn8b6Sk2ycMUt8wH3vAAA">
+<XPD:REF name="Association">FJ1X3D9c80uG5EgY7ATqzQAA</XPD:REF>
+<XPD:REF name="Participant">JQvuxGbsdE2jFadShkxqKgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vMwGVXrxPkCKOvOAPR6ytQAA</XPD:REF>
+<XPD:REF name="Views[1]">BAaRrPSiRkWfQQrnfeF5BQAA</XPD:REF>
+<XPD:REF name="Views[2]">b6bOArvlz0+mgsrQHIOI8wAA</XPD:REF>
+<XPD:REF name="Views[3]">rACoLZEoXESlgVdLXl1ocQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLPackage" guid="4cKvVc5Dtk6rtkH3X3B9egAA">
+<XPD:ATTR name="Name" type="string">SomePlugin</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">xW95yby7XEChYzUI8UtliAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLPackage" guid="Hwg8xLPVZkC6P9CDdGGF+AAA">
+<XPD:ATTR name="Name" type="string">ConE</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">1</XPD:ATTR>
+<XPD:REF name="Views[0]">Nppn0CUEP0Stsi3DAR1qEQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="C72p+KeoXkaRHqlZwhKDHgAA">
+<XPD:ATTR name="Name" type="string">uses</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">bXvOSs/6UES15aDKmn3tXwAA</XPD:REF>
+<XPD:REF name="Views[1]">L9RK4KdHs0+ZCinhj9kSUQAA</XPD:REF>
+<XPD:REF name="Views[2]">A+D5vQx9bkm3AkTkaVYCZwAA</XPD:REF>
+<XPD:REF name="Views[3]">fupy5ZQhwkmHjREiTpmstwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="isxYyJJ+aEilbZtDDhOMqwAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+<XPD:REF name="Participant">q11CD3et4kixnDRLW4nPdgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">YQ4SH0PbkU6D2Ed6kFWZ3gAA</XPD:REF>
+<XPD:REF name="Views[1]">au7s+O1a6EOhU92BZ9mTfAAA</XPD:REF>
+<XPD:REF name="Views[2]">uC7b5/Ag8E+lVXijU0puEAAA</XPD:REF>
+<XPD:REF name="Views[3]">SutSAX/p70WlhiBCYP5mIQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="DDj3t0783k6mjECBMHSRZgAA">
+<XPD:REF name="Association">C72p+KeoXkaRHqlZwhKDHgAA</XPD:REF>
+<XPD:REF name="Participant">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Rn+WUty/KE6o3UWIZm/++wAA</XPD:REF>
+<XPD:REF name="Views[1]">7gOWzEGpb0KSajbXDeX03QAA</XPD:REF>
+<XPD:REF name="Views[2]">e/X32+GrOUiRRJMneGhhrwAA</XPD:REF>
+<XPD:REF name="Views[3]">1RN9/oe60kCHXG3xE2fYmQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[16]" type="UMLAssociation" guid="zR4RT17TyUGNWLtHCk4EHQAA">
+<XPD:ATTR name="Name" type="string">uses</XPD:ATTR>
+<XPD:REF name="Namespace">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">s/hl5J8Ex0WfRP8M9AKteQAA</XPD:REF>
+<XPD:REF name="Views[1]">cHQJb0VhkEaKSG9FNZH8ywAA</XPD:REF>
+<XPD:REF name="Views[2]">NIiBXFgih0OcuF+WiDNxzQAA</XPD:REF>
+<XPD:REF name="Views[3]">f5/Uw2VFyEy4ygXzpaawvwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="3XKRVnprcUe5DKIkXzT8QQAA">
+<XPD:ATTR name="IsNavigable" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Association">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+<XPD:REF name="Participant">3dlH2vm6sEayyvEaXZoCngAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Ao1mzGyZkUOXJ7iUZ+CxmQAA</XPD:REF>
+<XPD:REF name="Views[1]">Mlo0JoqcnUWmKG46gdW/pgAA</XPD:REF>
+<XPD:REF name="Views[2]">60bFmV8mJ02N5+zPFmP+cAAA</XPD:REF>
+<XPD:REF name="Views[3]">hQN6K9SliEunBHaWLwTWywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="AeNNCbWnPEKWIb774GWlfQAA">
+<XPD:REF name="Association">zR4RT17TyUGNWLtHCk4EHQAA</XPD:REF>
+<XPD:REF name="Participant">rDKOyCdZEkCOx+oFSF1RfgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">65oSMAg0mkmODMiMbf+UjQAA</XPD:REF>
+<XPD:REF name="Views[1]">6vvMJYaqA0+EsdkZT8o6oAAA</XPD:REF>
+<XPD:REF name="Views[2]">znikN5jxMkWgoTVeUx7U0wAA</XPD:REF>
+<XPD:REF name="Views[3]">AnbfKLYaZ0qC8tWUwfnFkgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedCollaborationInstanceSets" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedCollaborationInstanceSets[0]" type="UMLCollaborationInstanceSet" guid="wE9rci0vbESzsZiTNus9aQAA">
+<XPD:ATTR name="Name" type="string">CollaborationInstanceSet1</XPD:ATTR>
+<XPD:REF name="RepresentedClassifier">NmvwO09X4Uu7xy6qNwdIDQAA</XPD:REF>
+<XPD:ATTR name="#InteractionInstanceSets" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="InteractionInstanceSets[0]" type="UMLInteractionInstanceSet" guid="g7HC4cn5j0ePStV0Z8NLZQAA">
+<XPD:ATTR name="Name" type="string">InteractionInstanceSet1</XPD:ATTR>
+<XPD:REF name="Context">wE9rci0vbESzsZiTNus9aQAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLSequenceDiagram" guid="MweH+mHn6EG06i4RV2qaAwAA">
+<XPD:ATTR name="Name" type="string">plugin_lifecycle</XPD:ATTR>
+<XPD:REF name="DiagramOwner">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLSequenceDiagramView" guid="7eExygPWckO0VN/1Qm2m0wAA">
+<XPD:REF name="Diagram">MweH+mHn6EG06i4RV2qaAwAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">14</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLSeqObjectView" guid="PoPtpN50LU6FA7qmOri9aAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">496</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">44</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">501</XPD:ATTR>
+<XPD:REF name="Model">hQik1kfcpkyjWa8YrxUXVwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zJisjSpbtkCBCP4uhV/tYQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="RUqGuK97O0SrboasVINyTQAA">
+<XPD:ATTR name="FontStyle" type="integer">4</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SomeImplReader</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="rOznrIU9202FsGnEIuiThwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="bMjNt1spNEa2H9mlkaCDxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="LifeLine" type="UMLLifeLineView" guid="iTZB2Agt80qwISCz0GsacAAA">
+<XPD:REF name="Model">hQik1kfcpkyjWa8YrxUXVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLSeqObjectView" guid="J22BJLGC2EurOQxtPclM2gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">264</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">44</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">70</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">492</XPD:ATTR>
+<XPD:REF name="Model">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WvNGCoWMKEeS6YQiCFdL5QAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Kzufip+sMUW9Y/5oBH06/wAA">
+<XPD:ATTR name="FontStyle" type="integer">4</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">SomeImpl</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="DKO5lvGyz0WAN7eEmlUbXQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="NQ4TFfG3Ykm4IokSv62UaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="LifeLine" type="UMLLifeLineView" guid="76HsHUrPOkK3WaYC5FDF9gAA">
+<XPD:REF name="Model">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLSeqObjectView" guid="tse6Or/GkEify2aNOl5gMAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">60</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">44</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">70</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">484</XPD:ATTR>
+<XPD:REF name="Model">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Jhjel0XTq0ObWUsgGO0vDAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="AV1cQSQS8E6JYrtHukEBQAAA">
+<XPD:ATTR name="FontStyle" type="integer">4</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">ConE</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="hzTg+M21dEejzS2kGNfBXgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="rlYMr+aITEKD4+ev9076dQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="LifeLine" type="UMLLifeLineView" guid="lgxda+WlMEubY4kveLQrHQAA">
+<XPD:REF name="Model">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLSeqStimulusView" guid="ZzClt2lwX0ur1JiJU0VhlgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,104;534,104</XPD:ATTR>
+<XPD:REF name="Model">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+<XPD:REF name="Head">iTZB2Agt80qwISCz0GsacAAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="fgeDv7FmBUeP3cp7diyX6gAA">
+<XPD:ATTR name="Alpha" type="real">0.154996718091723</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">64.7765389628066</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1 : read_impl()</XPD:ATTR>
+<XPD:REF name="Model">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+<XPD:REF name="HostEdge">ZzClt2lwX0ur1JiJU0VhlgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="RYBTEUdOrESltsSnvX+NqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+<XPD:REF name="HostEdge">ZzClt2lwX0ur1JiJU0VhlgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="TTG4jdnwm0GaKQH6SxMbswAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+<XPD:REF name="HostEdge">ZzClt2lwX0ur1JiJU0VhlgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="e7oBhzz/yEiExn1IAaJVLwAA">
+<XPD:ATTR name="Left" type="integer">534</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">104</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">53</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLSeqStimulusView" guid="iWpnJYmQZ06zp9jeI3zllwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">534,148;305,148</XPD:ATTR>
+<XPD:REF name="Model">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">iTZB2Agt80qwISCz0GsacAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="SHiSVWWFe0iFY9H6k3/NgAAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">2</XPD:ATTR>
+<XPD:REF name="Model">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:REF name="HostEdge">iWpnJYmQZ06zp9jeI3zllwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="e2rGfofWfkOI/nDlEH4OAwAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">&lt;&lt;create&gt;&gt;</XPD:ATTR>
+<XPD:REF name="Model">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:REF name="HostEdge">iWpnJYmQZ06zp9jeI3zllwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="OUCHbgoT/UigIAbkVywfLgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:REF name="HostEdge">iWpnJYmQZ06zp9jeI3zllwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="92Ry3KpM60Khx6SwXgKk5AAA">
+<XPD:ATTR name="Left" type="integer">292</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">148</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">373</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLSeqStimulusView" guid="+Ow+b/tIbUyKIrcZ30QMXwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,176;299,176</XPD:ATTR>
+<XPD:REF name="Model">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="Bx4xnq8PrEaR406zvi4+EwAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">3 : has_tag()</XPD:ATTR>
+<XPD:REF name="Model">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="HostEdge">+Ow+b/tIbUyKIrcZ30QMXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="nGuJvJRER0KwPOHLpJhcMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="HostEdge">+Ow+b/tIbUyKIrcZ30QMXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DQieJ421M0K20EZbYakf1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="HostEdge">+Ow+b/tIbUyKIrcZ30QMXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="+lrAmauSCUyVELHWqnrJsgAA">
+<XPD:ATTR name="Left" type="integer">299</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLSeqStimulusView" guid="99i+uHCR6E2zi1ljW6TfvwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">299,200;95,200</XPD:ATTR>
+<XPD:REF name="Model">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="Head">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:REF name="Tail">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="pHlZQddy+UG//3HPLRlQdQAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">4 : True</XPD:ATTR>
+<XPD:REF name="Model">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="HostEdge">99i+uHCR6E2zi1ljW6TfvwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="AZ6lFTJhzk2PSYFvZKecxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="HostEdge">99i+uHCR6E2zi1ljW6TfvwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ajQ6tnwcxUaHuThis4tXPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="HostEdge">99i+uHCR6E2zi1ljW6TfvwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="YCpwuIBrHkK+ebYRyZ+1KQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">95</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">200</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLSeqStimulusView" guid="749elK1zJ02MBLlaR2EcPgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,257;299,257</XPD:ATTR>
+<XPD:REF name="Model">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="z+twBvUeW0yPZPAijtHYtgAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">5 : has_ref()</XPD:ATTR>
+<XPD:REF name="Model">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="HostEdge">749elK1zJ02MBLlaR2EcPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ArEQ2HcAUEmKPLhuixIA2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="HostEdge">749elK1zJ02MBLlaR2EcPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="XGJYGt02q0aSCp/onBf0OQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="HostEdge">749elK1zJ02MBLlaR2EcPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="MxPhJno80kiP16Ht+bDsgQAA">
+<XPD:ATTR name="Left" type="integer">299</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">257</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">32</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLSeqStimulusView" guid="uaIw94jxekqP0W98wtudsQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">299,280;95,280</XPD:ATTR>
+<XPD:REF name="Model">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="Head">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:REF name="Tail">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="N54sAOjMjkmtsRpnPb0JbQAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">6 : True</XPD:ATTR>
+<XPD:REF name="Model">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="HostEdge">uaIw94jxekqP0W98wtudsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="D9r3Ws7M5ku1FnM+Nx1w8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="HostEdge">uaIw94jxekqP0W98wtudsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Q/rG0aY0qUSMCsO+ilBwBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="HostEdge">uaIw94jxekqP0W98wtudsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="v9TheZ2B/0CcL9e6OOiIKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">95</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLSeqStimulusView" guid="HitDDnXBMkeQgf4Xefc6nQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,326;299,326</XPD:ATTR>
+<XPD:REF name="Model">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ICT9zXXLAEyZa+aj37ySZAAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">7 : invocation_phase()</XPD:ATTR>
+<XPD:REF name="Model">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="HostEdge">HitDDnXBMkeQgf4Xefc6nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="khYwlPKhOEGqTf16sLmysgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="HostEdge">HitDDnXBMkeQgf4Xefc6nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="K39TzHEoekqbm38UKrrR+gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="HostEdge">HitDDnXBMkeQgf4Xefc6nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="N08ogELNVUGePNBKSaiPswAA">
+<XPD:ATTR name="Left" type="integer">299</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">326</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">31</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLSeqStimulusView" guid="i0ubsfTqFUuhFGuTgGUl5gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">299,353;95,353</XPD:ATTR>
+<XPD:REF name="Model">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+<XPD:REF name="Head">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:REF name="Tail">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="y1YMAKKX10aSMf8sWWG/OwAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">8 : &quot;normal&quot;</XPD:ATTR>
+<XPD:REF name="Model">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+<XPD:REF name="HostEdge">i0ubsfTqFUuhFGuTgGUl5gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="FFQFtf3eDkW/R9CpgMLFUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+<XPD:REF name="HostEdge">i0ubsfTqFUuhFGuTgGUl5gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="4xNdXZrVgUCeyyqbXVpdYQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+<XPD:REF name="HostEdge">i0ubsfTqFUuhFGuTgGUl5gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="siQb6tjGrEeI+epZyswWuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">95</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">353</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLSeqStimulusView" guid="a3V6pkBtlkaN5lCa6quFRAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,404;292,404</XPD:ATTR>
+<XPD:REF name="Model">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="RScoZcFAOkGMMFrCICgbewAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">9 : set generation_context</XPD:ATTR>
+<XPD:REF name="Model">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="HostEdge">a3V6pkBtlkaN5lCa6quFRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="M0Q6Xg6CRUGUwdR0rL6jAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="HostEdge">a3V6pkBtlkaN5lCa6quFRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="vBUjGOYNiEusPMmq7qgZvAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="HostEdge">a3V6pkBtlkaN5lCa6quFRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="5DomIsDCHUWd3cpup/+xfQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">292</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">404</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLSeqStimulusView" guid="2bYCKznAnk+rS9pJ3kfo4QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,440;299,440</XPD:ATTR>
+<XPD:REF name="Model">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2j/5XixvA0ieCFGpEhnSaAAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">10 : generate()</XPD:ATTR>
+<XPD:REF name="Model">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="HostEdge">2bYCKznAnk+rS9pJ3kfo4QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="pTrvJzdmnEWH7QSEQe4rOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="HostEdge">2bYCKznAnk+rS9pJ3kfo4QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ehp6Xzgo7EmHUdpvKRua/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="HostEdge">2bYCKznAnk+rS9pJ3kfo4QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="OuzjGmySoEuPO7NmZkaOEQAA">
+<XPD:ATTR name="Left" type="integer">299</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">440</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLSeqStimulusView" guid="ekbq9rF6QEeW0pNl4NQ76AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,480;299,480</XPD:ATTR>
+<XPD:REF name="Model">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+<XPD:REF name="Head">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:REF name="Tail">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="UegBZ8wW8keFY2Jjh+bxOAAA">
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">11 : post_generate()</XPD:ATTR>
+<XPD:REF name="Model">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+<XPD:REF name="HostEdge">ekbq9rF6QEeW0pNl4NQ76AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="JV7Ah/5/kkO1Q7WX0tPfaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:REF name="Model">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+<XPD:REF name="HostEdge">ekbq9rF6QEeW0pNl4NQ76AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DgX+SZarPkKJULR5l9fahgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">10</XPD:ATTR>
+<XPD:REF name="Model">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+<XPD:REF name="HostEdge">ekbq9rF6QEeW0pNl4NQ76AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Activation" type="UMLActivationView" guid="yL8jcdSf8kKiaYxuHsgYKAAA">
+<XPD:ATTR name="Left" type="integer">299</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">480</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">14</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">29</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#ParticipatingStimuli" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="ParticipatingStimuli[0]" type="UMLStimulus" guid="ETeRfxsNA0WrWaitgSd5aAAA">
+<XPD:ATTR name="Name" type="string">read_impl</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">hQik1kfcpkyjWa8YrxUXVwAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="lVsrL4rMPkuCyKtCTEFIaAAA">
+<XPD:REF name="Stimulus">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ZzClt2lwX0ur1JiJU0VhlgAA</XPD:REF>
+<XPD:REF name="Views[1]">fgeDv7FmBUeP3cp7diyX6gAA</XPD:REF>
+<XPD:REF name="Views[2]">RYBTEUdOrESltsSnvX+NqwAA</XPD:REF>
+<XPD:REF name="Views[3]">TTG4jdnwm0GaKQH6SxMbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[1]" type="UMLStimulus" guid="vXwKExFme0SCDlJgwAIMdwAA">
+<XPD:REF name="Sender">hQik1kfcpkyjWa8YrxUXVwAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCreateAction" guid="RAlmcMo/OEW5gxfBBuqR3wAA">
+<XPD:REF name="Stimulus">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">iWpnJYmQZ06zp9jeI3zllwAA</XPD:REF>
+<XPD:REF name="Views[1]">SHiSVWWFe0iFY9H6k3/NgAAA</XPD:REF>
+<XPD:REF name="Views[2]">e2rGfofWfkOI/nDlEH4OAwAA</XPD:REF>
+<XPD:REF name="Views[3]">OUCHbgoT/UigIAbkVywfLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[2]" type="UMLStimulus" guid="ScBrhUBtKEeVH+NRokpoRgAA">
+<XPD:ATTR name="Name" type="string">has_tag</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="M7DwtxbGY0mfyih5DOjpQgAA">
+<XPD:REF name="Stimulus">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+Ow+b/tIbUyKIrcZ30QMXwAA</XPD:REF>
+<XPD:REF name="Views[1]">Bx4xnq8PrEaR406zvi4+EwAA</XPD:REF>
+<XPD:REF name="Views[2]">nGuJvJRER0KwPOHLpJhcMAAA</XPD:REF>
+<XPD:REF name="Views[3]">DQieJ421M0K20EZbYakf1QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[3]" type="UMLStimulus" guid="hmREJ5ZnTEeAfrq77EpChAAA">
+<XPD:ATTR name="Name" type="string">True</XPD:ATTR>
+<XPD:REF name="Sender">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:REF name="Receiver">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLReturnAction" guid="N3S9UfwdxE+sxeG04DT3jwAA">
+<XPD:REF name="Stimulus">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">99i+uHCR6E2zi1ljW6TfvwAA</XPD:REF>
+<XPD:REF name="Views[1]">pHlZQddy+UG//3HPLRlQdQAA</XPD:REF>
+<XPD:REF name="Views[2]">AZ6lFTJhzk2PSYFvZKecxQAA</XPD:REF>
+<XPD:REF name="Views[3]">ajQ6tnwcxUaHuThis4tXPwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[4]" type="UMLStimulus" guid="HCFFRuQKg0CdJr76tbmjmwAA">
+<XPD:ATTR name="Name" type="string">has_ref</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="MzUIac54/EKCdXfiUI5abAAA">
+<XPD:REF name="Stimulus">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">749elK1zJ02MBLlaR2EcPgAA</XPD:REF>
+<XPD:REF name="Views[1]">z+twBvUeW0yPZPAijtHYtgAA</XPD:REF>
+<XPD:REF name="Views[2]">ArEQ2HcAUEmKPLhuixIA2gAA</XPD:REF>
+<XPD:REF name="Views[3]">XGJYGt02q0aSCp/onBf0OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[5]" type="UMLStimulus" guid="FL5rZMXYGEyb7KN5v8T0PgAA">
+<XPD:ATTR name="Name" type="string">True</XPD:ATTR>
+<XPD:REF name="Sender">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:REF name="Receiver">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLReturnAction" guid="zZ58QccY+USf9jGtt+9pngAA">
+<XPD:REF name="Stimulus">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">uaIw94jxekqP0W98wtudsQAA</XPD:REF>
+<XPD:REF name="Views[1]">N54sAOjMjkmtsRpnPb0JbQAA</XPD:REF>
+<XPD:REF name="Views[2]">D9r3Ws7M5ku1FnM+Nx1w8gAA</XPD:REF>
+<XPD:REF name="Views[3]">Q/rG0aY0qUSMCsO+ilBwBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[6]" type="UMLStimulus" guid="xZNxieQfVEi96d0Po7wuIgAA">
+<XPD:ATTR name="Name" type="string">invocation_phase</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="U1HpjXO2AUmmGEynycImywAA">
+<XPD:REF name="Stimulus">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">HitDDnXBMkeQgf4Xefc6nQAA</XPD:REF>
+<XPD:REF name="Views[1]">ICT9zXXLAEyZa+aj37ySZAAA</XPD:REF>
+<XPD:REF name="Views[2]">khYwlPKhOEGqTf16sLmysgAA</XPD:REF>
+<XPD:REF name="Views[3]">K39TzHEoekqbm38UKrrR+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[7]" type="UMLStimulus" guid="lz53uWB/xkyYZ3lvk/DtaAAA">
+<XPD:ATTR name="Name" type="string">&quot;normal&quot;</XPD:ATTR>
+<XPD:REF name="Sender">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:REF name="Receiver">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLReturnAction" guid="2NrnrzpuzUKFVCsa+XZd+gAA">
+<XPD:REF name="Stimulus">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">i0ubsfTqFUuhFGuTgGUl5gAA</XPD:REF>
+<XPD:REF name="Views[1]">y1YMAKKX10aSMf8sWWG/OwAA</XPD:REF>
+<XPD:REF name="Views[2]">FFQFtf3eDkW/R9CpgMLFUgAA</XPD:REF>
+<XPD:REF name="Views[3]">4xNdXZrVgUCeyyqbXVpdYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[8]" type="UMLStimulus" guid="2eiKgeafeEmhRL09/pvPdQAA">
+<XPD:ATTR name="Name" type="string">set generation_context</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLSendAction" guid="qhxHTJH5uEGskdq7DTC4DgAA">
+<XPD:REF name="Stimulus">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">a3V6pkBtlkaN5lCa6quFRAAA</XPD:REF>
+<XPD:REF name="Views[1]">RScoZcFAOkGMMFrCICgbewAA</XPD:REF>
+<XPD:REF name="Views[2]">M0Q6Xg6CRUGUwdR0rL6jAQAA</XPD:REF>
+<XPD:REF name="Views[3]">vBUjGOYNiEusPMmq7qgZvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[9]" type="UMLStimulus" guid="35X3nu8KkUSR9OsWOqVq3wAA">
+<XPD:ATTR name="Name" type="string">generate</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="dR99Isv4/0GTEZPBrgwV+AAA">
+<XPD:REF name="Stimulus">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2bYCKznAnk+rS9pJ3kfo4QAA</XPD:REF>
+<XPD:REF name="Views[1]">2j/5XixvA0ieCFGpEhnSaAAA</XPD:REF>
+<XPD:REF name="Views[2]">pTrvJzdmnEWH7QSEQe4rOwAA</XPD:REF>
+<XPD:REF name="Views[3]">ehp6Xzgo7EmHUdpvKRua/wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingStimuli[10]" type="UMLStimulus" guid="Aq0JDBAyG0OKfOPyRy4jKAAA">
+<XPD:ATTR name="Name" type="string">post_generate</XPD:ATTR>
+<XPD:REF name="Sender">lHd6qkmEfEG1mu2rVzLWvQAA</XPD:REF>
+<XPD:REF name="Receiver">jSHc3saXOkOAzxbvtSSvXgAA</XPD:REF>
+<XPD:OBJ name="Action" type="UMLCallAction" guid="SLhrO9f8DUS838lsBmstcQAA">
+<XPD:REF name="Stimulus">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:REF name="InteractionInstanceSet">g7HC4cn5j0ePStV0Z8NLZQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ekbq9rF6QEeW0pNl4NQ76AAA</XPD:REF>
+<XPD:REF name="Views[1]">UegBZ8wW8keFY2Jjh+bxOAAA</XPD:REF>
+<XPD:REF name="Views[2]">JV7Ah/5/kkO1Q7WX0tPfaAAA</XPD:REF>
+<XPD:REF name="Views[3]">DgX+SZarPkKJULR5l9fahgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#ParticipatingInstances" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="ParticipatingInstances[0]" type="UMLObject" guid="hQik1kfcpkyjWa8YrxUXVwAA">
+<XPD:ATTR name="Name" type="string">SomeImplReader</XPD:ATTR>
+<XPD:REF name="CollaborationInstanceSet">wE9rci0vbESzsZiTNus9aQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">2</XPD:ATTR>
+<XPD:REF name="Views[0]">PoPtpN50LU6FA7qmOri9aAAA</XPD:REF>
+<XPD:REF name="Views[1]">iTZB2Agt80qwISCz0GsacAAA</XPD:REF>
+<XPD:ATTR name="#SendingStimuli" type="integer">1</XPD:ATTR>
+<XPD:REF name="SendingStimuli[0]">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:ATTR name="#ReceivingStimuli" type="integer">1</XPD:ATTR>
+<XPD:REF name="ReceivingStimuli[0]">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingInstances[1]" type="UMLObject" guid="jSHc3saXOkOAzxbvtSSvXgAA">
+<XPD:ATTR name="Name" type="string">SomeImpl</XPD:ATTR>
+<XPD:REF name="CollaborationInstanceSet">wE9rci0vbESzsZiTNus9aQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">2</XPD:ATTR>
+<XPD:REF name="Views[0]">J22BJLGC2EurOQxtPclM2gAA</XPD:REF>
+<XPD:REF name="Views[1]">76HsHUrPOkK3WaYC5FDF9gAA</XPD:REF>
+<XPD:ATTR name="#SendingStimuli" type="integer">3</XPD:ATTR>
+<XPD:REF name="SendingStimuli[0]">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="SendingStimuli[1]">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="SendingStimuli[2]">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+<XPD:ATTR name="#ReceivingStimuli" type="integer">7</XPD:ATTR>
+<XPD:REF name="ReceivingStimuli[0]">vXwKExFme0SCDlJgwAIMdwAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[1]">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[2]">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[3]">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[4]">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[5]">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[6]">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="ParticipatingInstances[2]" type="UMLObject" guid="lHd6qkmEfEG1mu2rVzLWvQAA">
+<XPD:ATTR name="Name" type="string">ConE</XPD:ATTR>
+<XPD:REF name="CollaborationInstanceSet">wE9rci0vbESzsZiTNus9aQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">2</XPD:ATTR>
+<XPD:REF name="Views[0]">tse6Or/GkEify2aNOl5gMAAA</XPD:REF>
+<XPD:REF name="Views[1]">lgxda+WlMEubY4kveLQrHQAA</XPD:REF>
+<XPD:ATTR name="#SendingStimuli" type="integer">7</XPD:ATTR>
+<XPD:REF name="SendingStimuli[0]">ETeRfxsNA0WrWaitgSd5aAAA</XPD:REF>
+<XPD:REF name="SendingStimuli[1]">ScBrhUBtKEeVH+NRokpoRgAA</XPD:REF>
+<XPD:REF name="SendingStimuli[2]">HCFFRuQKg0CdJr76tbmjmwAA</XPD:REF>
+<XPD:REF name="SendingStimuli[3]">xZNxieQfVEi96d0Po7wuIgAA</XPD:REF>
+<XPD:REF name="SendingStimuli[4]">2eiKgeafeEmhRL09/pvPdQAA</XPD:REF>
+<XPD:REF name="SendingStimuli[5]">35X3nu8KkUSR9OsWOqVq3wAA</XPD:REF>
+<XPD:REF name="SendingStimuli[6]">Aq0JDBAyG0OKfOPyRy4jKAAA</XPD:REF>
+<XPD:ATTR name="#ReceivingStimuli" type="integer">3</XPD:ATTR>
+<XPD:REF name="ReceivingStimuli[0]">hmREJ5ZnTEeAfrq77EpChAAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[1]">FL5rZMXYGEyb7KN5v8T0PgAA</XPD:REF>
+<XPD:REF name="ReceivingStimuli[2]">lz53uWB/xkyYZ3lvk/DtaAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:BODY>
+</XPD:PROJECT>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/dev-plugin/example-plugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,284 @@
+.. _plugin-howto-example-plugin:
+
+Example plug-in
+===============
+
+The example plug-in implements a simple Implementation Markup Language that can write
+text files with possibly some content coming from ConfML setting values. The plug-in
+demonstrates some recommended practices for developing ConE plug-ins:
+
+- Plug-in structure:
+    - Reader class
+    - Implementation class
+    - Implementation model
+- Using ``cone.public.utils`` for ConfML setting reference handling
+- Unit tests:
+    - Testing the reader class, the implementation class and the model classes separately
+    - Output generation testing (plug-in scope integration test)
+
+The ExampleML language
+----------------------
+
+The Implementation Markup Language in the example plug-in is ExampleML. The language
+offers a simple mechanism to write text files to the output directory. For example:
+
+.. code-block :: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <exampleml xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="test1.txt" encoding="UTF-8">Test</output>
+        <output file="some/dir/test2.txt" encoding="UTF-16">Test</output>
+    </exampleml>
+
+To demonstrate the use of ConfML setting references, the language supports also
+those with the form ``${Feature.Setting}``. This is the usual way of using them
+in implementation languages, and it is recommended to use the same convention
+in all ImplMLs. For example:
+
+.. code-block :: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <exampleml xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="${SomeFeature.OutputDir}/test2.txt"
+                encoding="${SomeFeature.OutputEncoding}">
+            Value from ConfML: ${SomeFeature.OutputText}
+        </output>
+    </exampleml>
+
+.. _plugin-howto-example-plugin-dir-structure:
+
+Directory structure
+-------------------
+
+- ``plugins/`` - Root directory for all ConE plug-in sources
+    - ``example/`` - Example plug-in package directory
+        - ``ConeExamplePlugin/`` - Source for the example plug-in
+            - ``examplemlplugin/`` - Module directory containing all plug-in code
+                - ``tests/`` - Unit tests and test data for the plug-in
+                    - ``project/`` - Configuration project used in the tests
+                    - ``gen_expected/`` - Expected output for generation test case
+                    - ``__init__.py`` - Test module initialization file
+                    - ``runtests.py`` - Script for running all test cases
+                    - ``unittest_exampleml_impl.py`` - File containing test cases
+                    - ``unittest_exampleml_reader.py`` - File containing test cases
+                    - ``unittest_exampleml_generation.py`` - File containing test cases
+                - ``__init__.py`` - Plug-in module initialization file
+                - ``exampleml_impl.py`` - Plug-in source file
+                - ``exampleml_reader.py`` - Plug-in source file
+            - ``setup.py`` - Setup script for packaging the plug-in into an .egg file
+            - ``setup.cfg`` - Configuration file for ``setup.py``
+        - ``integration-test/`` - Integration tests for the example plug-in package
+            - ``testdata/`` - Test data for the integration tests
+            - ``__init__.py`` - Test module initialization file
+            - ``runtests.py`` - Script for running all test cases
+            - ``export_standalone.py`` - Script for exporting extra data for standalone test export
+            - ``unittest_generate.py`` - File containing test cases
+
+Logical structure
+-----------------
+
+Logically the plug-in is divided into three parts:
+
+- *Implementation model*, represents the logical model of the implementation specified in the XML data
+- *Implementation class*, works as the interface of the plug-in towards ConE and uses the model to do the actual work
+- *Implementation reader*, converts the XML data into the logical model and creates a new implementation class instance
+
+In this case the *model* consists just of the class Output, which corresponds to the ``<output>`` element.
+
+Plug-in code
+------------
+
+exampleml_model.py
+..................
+
+This file defines the ``Output`` class, which comprises the whole implementation model
+in this case. The class contains the same attributes as its XML element counterpart:
+file, encoding and text, as well as the methods for generating output from the
+``Output`` object.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_model.py
+   :linenos:
+
+Notice the use of ``cone.public.utils`` to handle the ConfML settings references. Usage of
+setting refs is common enough to warrant a set of functions related to their handling in ``utils``.
+It is strongly recommended to use these utility functions instead of creating your own.
+
+.. note::
+
+    The expanding of ConfML setting references is done here, in the ``Output`` object, instead of in the reader
+    when the implementation is parsed. If it was done in the parsing phase, ConfML setting values changed
+    in rules would not be expanded to their new values.
+
+Another noteworthy thing is that the ``Output`` class implements the methods ``__eq__()``,
+``__ne__()`` and ``__repr__()``. These have no real use in the actual implementation, but they
+make unit testing easier, as will be seen later on.
+
+The logic for creating the output is here encoded directly in the model, but in cases where
+the model is more complex, it may be necessary to create a separate writer class, particularly
+if there is more than one output format to be created based on the same model.
+
+exampleml_impl.py
+.................
+
+This file defines the implementation class. As can be seen, the class is quite simple, since
+it uses the model class to do the actual work and only works as an interface towards ConE.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_impl.py
+   :linenos:
+
+exampleml_reader.py
+...................
+
+This file defines the reader class. Note how the reading of a single element is given its
+own method. Again, this is to make unit testing easier.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_reader.py
+   :linenos:
+
+
+Unit tests
+----------
+
+Due to the dynamic nature of Python, an extensive set of unit tests is required for every plug-in.
+The unit tests for a ConE plug-in should be in a ``tests`` module (directory) under the plug-in's
+main module directory, and contain a set ``unittests_*.py`` files. The naming here is important,
+since the ``runtests.py`` file used to run all the unit tests at once collects test cases only
+from .py files starting with ``unittest_``.
+
+Unit tests can be executed by running each individual unit test file separately using "Run as" -> "Python unit-test" or
+all of the plug-in's unit tests at once by using "Run as" -> "Python run" on ``runtests.py``.
+
+.. image:: run_unittest.png
+
+*Running a single unit test file*
+
+It is recommended (well, actually required) to make sure that all unit tests pass before committing changes made to
+the code of any plug-in. Also, it should be checked that all of the plug-in's unit tests pass when run as part
+of all plug-in unit tests. It is possible that tests that pass when running ``runtests.py`` fail when running them
+as part of the whole plug-in test set, as in that case the working directory is not the same. The entire plug-in test
+set can be run from ``source/plugins/tests/runtests.py``.
+
+
+unittest_exampleml_reader.py
+............................
+
+This file tests that the reader class functions properly. See how there is a test case for reading
+a single ``<output>`` element that tests all the special cases there, and then another that
+tests the top-level reader method. Here it becomes obvious why it is worthwhile to implement the
+``__eq__()`` etc. methods in model classes, as in the tests we can just give the parser an XML
+string and specify exactly what kind of a Python object is expected to be parsed from it.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_reader.py
+   :linenos:
+
+unittest_exampleml_impl.py
+..........................
+
+This file tests that the implementation class works as expected. The methods to test are ``has_ref()``
+and ``list_output_files()``, since it is vital for the plug-in's correct operation that these methods
+do what they are supposed to. Note that ``generate()`` is not tested here, as it is tested in its own
+file.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_impl.py
+   :linenos:
+
+unittest_exampleml_generation.py
+................................
+
+This file tests that the plug-in works correctly throughout its lifecycle, so it works as an integration test.
+Note that plug-in instances are not created manually, but an implementation container is created from the project.
+This means that the test also makes sure that the plug-in interoperates correctly with ConE's plug-in machinery.
+
+Also note that the output is checked against an expected set of files using the method ``assert_dir_contents_equal()``,
+which comes from a unit test base class defined in a special ``testautomation`` module. This module contains also other
+helper methods for use in unit tests, so if you need something more sophisticated than the simple methods provided
+by the ``unittest`` module, you should check the ``testautomation`` module before writing the methods yourself.
+The module can be found under ``source/``.
+
+Notice also how the generation output directory is set to be in a ``temp/`` directory in the same directory
+as the test .py file is. It is recommended to keep all temporary test data in a single place like this, so that
+they don't litter e.g. the current working directory. When using a single ``temp/`` directory, it can also be
+ignored in version control to avoid unnecessarily listing the temporary data when checking for modification in
+the workding copy.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_generation.py
+   :linenos:
+
+Plug-in packaging
+-----------------
+
+The file ``setup.py`` handles the packaging of the plug-in into an egg file.
+
+The most important thing here is the plug-in's entry point info. The
+plug-in's reader classes must be specified as entry points, or they won't be
+loaded.
+
+.. literalinclude:: /../source/plugins/example/ConeExamplePlugin/setup.py
+   :linenos:
+
+
+.. _plugin-howto-example-plugin-integration-tests:
+
+Integration tests
+-----------------
+
+In addition to the unit tests inside the plug-in itself there is a separate integration test set.
+The purpose of these tests is to make sure that the plug-ins in the package work properly
+together with other implementations from the CLI level. E.g. a common case that is good to
+test is to check that ConfML settings changed in rules affect the implementations using
+references to those settings work properly.
+
+These tests are also exported as part of the standalone test set used to test a pre-built
+ConE distribution (see :ref:`installation-export-tests`). This affects the way some things
+are handled in the test cases, for example the way the command to run is determined.
+
+The integration test set is plug-in package specific, not plug-in specific, so the test
+project(s) used there should contain implementations of all the implementation languages
+provided by the plug-ins in the package. Of course, in this case there are only ExampleML
+implementations, since the example plug-in is the only plug-in in the example package.
+
+runtests.py
+...........
+
+This file simply acts as a shortcut to run all test cases easily.
+
+__init__.py
+...........
+
+This file performs all integration test specific initialization using the plug-in utility
+functions in the root ``plugins/`` directory. Note that when the integration test set is
+exported as standalone, the contents of this file are erased (the integration test
+initialization cannot be done there, since the full ConE source is not available). Because
+of this, you should not put anything that is always needed in this file.
+
+export_standalone.py
+....................
+
+This file contains a function for exporting any needed extra data into the standalone test
+set (e.g. something from under the plug-in sources). The file doesn't necessarily need to
+exist if there is no extra data in need of exporting, but in this example it exists to show
+what could be done in it.
+
+.. literalinclude:: /../source/plugins/example/integration-test/export_standalone.py
+   :linenos:
+
+unittest_generate.py
+....................
+
+This file contains tests for generating output using the example plug-in.
+Note the following things:
+
+- The use of the variable ``CONE_CMD`` in ``get_cmd()``. This variable is set to
+  contain the actual ConE command to run if the tests are being run from the
+  exported standalone test set. In practice this will be something like
+  ``C:/cone_test/cone/cone.cmd``.
+- The actual generation and testing is done in a separate function, ``run_test_generate()``,
+  and there are two actual test functions that call it. One runs the test directly on the
+  test project on the file system, and another first zips the test project and then runs
+  the test on that. It is a good idea to test that generation works the same in both cases,
+  since it can be easy to forget to take into account generation from a ZIP file when creating
+  a plug-in (e.g. using ``shutil`` functions to perform copy operations when the ConE API
+  should be used).
+
+.. literalinclude:: /../source/plugins/example/integration-test/unittest_generate.py
+   :linenos:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/dev-plugin/index.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+.. _plugin-howto:
+
+How to create a ConE plug-in
+============================
+
+This page contains a description of ConE's plug-in interface, a description of
+an example plug-in intended to be used as a template for creating new plug-ins,
+and step-by-step instructions for creating a new ConE plug-in based on the template.
+The impatient can simply skip to the step-by-step instructions, by it is recommended
+to read the also the plug-in interface and example plug-in descriptions.
+
+The instructions assume that the used development environment is Eclipse/PyDev.
+
+.. toctree::
+    :maxdepth: 3
+    
+    plugin-interface
+    example-plugin
+    steps
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/dev-plugin/plugin-interface.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,200 @@
+.. _plugin-howto-plugin-interface:
+
+Plug-in interface
+=================
+
+A ConE plug-in has two points for interfacing with ConE:
+
+#. Reader classes that derive from ``cone.public.plugin.ReaderBase`` . These classes
+   define supported Implementation Markup Languages (i.e. supported XML namespaces)
+   and other attributes related to them like file extensions. As the name suggests, they are
+   also responsible for reading implementation instances from XML data.
+#. Implementation classes that derive from ``cone.public.plugin.ImplBase``. These classes
+   supply the actual run-time functionality of the plug-ins.
+
+The following UML diagram shows the most important classes and their interdependencies:
+
+.. image:: plugin_classes.jpg
+
+ConE generation can be seen to consist of two phases, implementation parsing
+and output generation:
+
+Parsing phase:
+
+- Implementation file list is filtered based on a user-given file name pattern
+  and supported file extensions
+- All remaining files are parsed into ``ElementTree`` instances
+- The ``ElementTree`` instance is scanned for supported ImplML namespaces and
+  implementation instances are created using the correct reader classes
+  (the ``read_impl()`` method)
+- All implementations are collected into an ``ImplSet`` instance
+
+Generation phase:
+
+- Implementation instances are further filtered using tags and ConfML references
+  (the ``has_tag()`` and ``has_ref()`` methods)
+- Implementations instances are divided into separate sets based on their invocation
+  phases
+- Output is generated using each implementation set. For each implementation set:
+
+    - The ``generation_context`` variable of each implementation instance is set
+      (this context contains generation-scope information implementations instances may use)
+    - The ``generate()`` method of each instance is called
+    - The ``post_generate()`` method of each instance is called
+
+From a plug-in's point of view, the sequence of method calls goes as follows:
+
+.. image:: plugin_lifecycle.jpg
+
+Explanations of the steps in the diagram:
+
+====== ========================================================================
+Step   Explanation
+====== ========================================================================
+1      ``read_impl()`` is called to create an implementation instance based on
+       XML data.
+2      ``read_impl()`` creates the instance.
+3-6    Filtering based on ConfML references and implementation tags is done.
+       The implementation instance returns True in all cases, so it is included
+       in the actual generation.
+7-8    The instance is asked for its invocation phase (here it returns "normal")
+9      The implementation instance's ``generation_context`` variable is set, so
+       then it can be used in the actual generation.
+10-11  Output generation methods are called
+====== ========================================================================
+
+Plug-in interface class source
+------------------------------
+
+The following source listings show the most important parts of the ``ImplReader``
+and ``ImplBase`` classes from a plug-in's point of view:
+
+.. code-block:: python
+
+    class ReaderBase(object):
+        """
+        Base class for implementation readers.
+        
+        Each reader class supports one XML namespace, from which it reads an implementation
+        instance.
+        
+        The method for parsing an implementation (read_impl()) is given an ElementTree
+        XML element as the root from which to parse the implementation. The plug-in
+        machinery handles each XML file so that the correct reader class is used to read
+        the implementations from XML elements based on the namespaces.
+        """
+        
+        # The XML namespace supported by the implementation reader.
+        # Should be something like "http://www.xyz.org/xml/1".
+        # Can also be None, in which case the reader will not be used
+        # (this can be useful for defining base classes for e.g. readers
+        # for different versions of an implementation).
+        NAMESPACE = None
+        
+        # Any extra XML namespaces that should be ignored by the
+        # implementation parsing machinery. This is useful for specifying
+        # namespaces that are not actual ImplML namespaces, but are used
+        # inside an implementation (e.g. XInclude)
+        IGNORED_NAMESPACES = []
+        
+        # Supported implementation file extensions.
+        # Sub-classes can override this to add new supported file extensions
+        # if necessary. The file extensions simply control whether implementations
+        # are attempted to be read from a file or not.
+        # Note that the extensions are case-insensitive.
+        FILE_EXTENSIONS = ['implml']
+        
+        @classmethod
+        def read_impl(cls, resource_ref, configuration, doc_root):
+            """
+            Read an implementation instance from the given element tree.
+            
+            @param resource_ref: Reference to the resource in the configuration in
+                which the given document root resides.
+            @param configuration: The configuration used.
+            @param doc_root: The document root from which to parse the implementation.
+            @return: The read implementation instance, or None.
+            """
+            raise exceptions.NotSupportedException()
+
+.. code-block:: python
+
+    class GenerationContext(object):
+        """
+        Context object that can be used for passing generation-scope
+        data to implementation instances.
+        """
+        
+        def __init__(self, tags={}):
+            # The tags used in this generation context
+            # (i.e. the tags passed from command line)
+            self.tags = tags
+            
+            # A dictionary that implementation instances can use to
+            # pass any data between each other
+            self.impl_data_dict = {}
+
+.. code-block:: python
+
+    class ImplBase(object):
+        """
+        Base class for any confml implementation. 
+        """
+        
+        # Identifier for the implementation type, used e.g. in .cfg files.
+        # Should be a string like e.g. 'someml'.
+        IMPL_TYPE_ID = None
+        
+        # Defines the default invocation phase for the implementation.
+        # The default is used if the phase is not explicitly set in the
+        # ImplML file or manually overridden by calling set_invocation_phase()
+        DEFAULT_INVOCATION_PHASE = None
+        
+        def __init__(self,ref, configuration):
+            """
+            Create a ImplBase object
+            @param ref : the ref to the Implml file resource.
+            @param configuration : the Configuration instance for the
+            configuration data.
+            """
+            self._settings = None
+            self.ref = ref
+            self.index = None
+            self.configuration = configuration
+            self.output_root = self.settings.get('output_root','output')
+            self.output_subdir = self.settings.get('output_subdir','')
+            self.plugin_output = self.settings.get('plugin_output','')
+            
+            self.generation_context = None
+            self._tags = None
+            self._invocation_phase = None
+            self._tempvar_defs = []
+
+        def generate(self):
+            """
+            Generate the given implementation.
+            @return: 
+            """
+            raise exceptions.NotSupportedException()
+        
+        def post_generate(self):
+            """
+            Called when all normal generation has been done.
+            
+            @attention: This is a temporary method used for implementing cenrep_rfs.txt generation.
+            """
+            pass
+        
+        def list_output_files(self):
+            """
+            Return a list of output files as an array. 
+            """
+            raise exceptions.NotSupportedException()
+        
+        def get_refs(self):
+            """
+            Return a list of all ConfML setting references that affect this
+            implementation. May also return None if references are not relevant
+            for the implementation.
+            """
+            return None
Binary file configurationengine/doc/plugins/dev-plugin/plugin_classes.jpg has changed
Binary file configurationengine/doc/plugins/dev-plugin/plugin_lifecycle.jpg has changed
Binary file configurationengine/doc/plugins/dev-plugin/run_unittest.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/dev-plugin/steps.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,48 @@
+.. _plugin-howto-steps:
+
+Step-by-step instructions for creating a new plug-in based on the example
+=========================================================================
+
+This page provides step-by-step instructions for creating a new plug-in based on the example
+plug-in described in :ref:`plugin-howto-example-plugin`. The new plug-in will simply be exactly the same as the example plug-in, except that
+the name will be changed from ExampleML to NewML.
+
+These steps show how to create a new plug-in under the ``example`` plug-in package, but the instructions
+can be used for creating an entirely new plug-in package also. To do that, simply export
+``source/plugins/example`` into ``source/plugins/new`` instead of just ``source/plugins/example/ConeExamplePlugin``
+into ``source/plugins/example/ConeNewPlugin``.
+
+#. Export the example plug-in into the new plug-in path. With TortoiseSVN it can be done like this:
+    #. Open ``source/plugins/example`` in Windows Explorer
+    #. Drag'n'drop ``ConeExamplePlugin`` into the empty area using the right mouse button
+    #. Select "SVN export to here" from the pop-up menu
+    #. Select "Auto rename" from the dialog that pops up
+    #. After the export is done, rename "Export of ConeExamplePlugin" to "ConeNewPlugin"
+#. Refresh the ``plugins/`` directory in Eclipse
+#. Rename all files and folders containing "exampleml" to "newml" under ``ConeNewPlugin/``
+    - ``examplemlplugin/`` -> ``newmlplugin/``
+    - ``exampleml_impl.py`` -> ``newml_impl.py``
+    - ``tests/unittest_exampleml_generation.py`` -> ``tests/unittest_newml_generation.py``
+    - ``tests/project/Layer/implml/test.exampleml`` -> ``tests/project/Layer/implml/test.newml``
+    - etc.
+#. Change "exampleml" to "newml" inside all files
+    - Select "ConeNewPlugin" in the PyDev Package Explorer
+    - Press Ctrl+H to do a file search. Use the following options:
+         - Containing text: exampleml (case-insensitive)
+         - File name patterns: *
+         - Scope: Selected resources
+    - Change the string everywhere (use the same case convention, e.g. "exampleml_impl" -> "newml_impl" and "ExamplemlReader" -> "NewmlReader")
+#. Check that test cases are run correctly and they pass
+    #. Run ``source/plugins/example/ConeNewPlugin/newmlplugin/tests/runtests.py`` to check that all tests pass (all modules are found etc.)
+    #. Run ``source/plugins/example/runtests.py`` to check that all tests pass also from the plug-in package level
+#. Modify ``setup.py``
+#. Check that the new plug-in is present in a ConE installation created using the ``example`` plug-in package
+    #. Go to the working directory on the command line and run (remember to use forward slashes)::
+     
+        install.cmd C:/cone_temp_or_whatever_dir example
+    
+    #. Go to the temporary directory specified in the previous step and run::
+    
+        cone info --print-supported-impls
+    
+    #. Check that you can find the new namespace and file extension in the list of supported namespaces and file extensions
Binary file configurationengine/doc/plugins/genconfml-plugin/gcfml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfml_example1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<file xmlns=http://www.s60.com/xml/genconfml/1" version="1.0" name="CamcorderData.xml" target="\private\2000BEE5\">
+    <setting ref="CamcorderFeatures/Setting"></setting> 
+    <setting ref="SIPFeatures/Setting"></setting> 
+    <xsl:stylesheet version="1.0"
+        xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+        xmlns="http://www.w3.org/TR/xhtml1/strict">
+
+        <xsl:output
+            method="xml"
+            indent="yes"
+            encoding="iso-8859-1"
+        />
+
+        <xsl:template match="configuration/data">
+            <Proprietary>
+                <Something attr="{SIPFeatures/Setting*2}">
+                    <xsl:value-of select="CamcorderFeatures/Setting"/>
+                </Something>
+            </Proprietary>
+        </xsl:template>
+    </xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfml_example2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<configuration>
+    <data>
+        <CamcorderFeatures>
+            <Setting>foobar</Setting>
+        </CamcorderFeatures>
+        <SIPFeatures>
+            <Setting>123</Setting>
+        </SIPFeatures>
+    </data>
+</configuration>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfml_example3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="iso-8859-1"?>
+   
+<Proprietary>
+   <Something attr="246">foobar</Something>
+</Proprietary>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfml_example4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+Iby file:
+data = VARIANT\private\2000BEE5\CamcorderData.xml \private\2000BEE5\CamcorderData.xml
+
+File system:
+\output\my_variant\private\2000BEE5\CamcorderData.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfml_example5.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+<file xmlns=http://www.s60.com/xml/genconfml/1" version="1.0" name="\private\2000BEE5\CamcorderData.xml">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/genconfml-plugin/genconfmlplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,156 @@
+User guide for Generic Configuration File Markup Language (GenConfML) Plugin
+----------------------------------------------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use and configure Generic Configuration File Markup Language 
+(GenConfML) plugin fo ConE. GenConfML is one of the implementation mapping languages for
+Configuration Markup Language (ConfML). This plugin is used to generate arbitrary text file
+formats. Currently this language uses a `eXtensible Stylesheet Language Transformations 
+(XSLT) <http://www.w3.org/TR/xslt>`_ style sheet for generating a file for selected settings. 
+Support for other style sheet or transformation mechanisms than 
+`XSLT <http://www.w3.org/TR/xslt>`_ could be added later.
+
+GenConfML files are executed by default in **normal** :ref:`invocation phase <implml-common-invocation-phase>`.
+
+GenConfML
+'''''''''
+
+The GenConfML (Generic Configuration File ML) syntax is a extension of Configuration markup 
+language (confml). The term in confml for this extension is implementation method language 
+(implml), which in GenConfML case is a xml file. 
+
+  * Namespace: ``http://www.s60.com/xml/genconfml/1``
+  * File extension: ``gcfml``
+
+.. note::
+
+   More information about :ref:`file extensions <implml-file-extensions>`. 
+
+GenConfML Elements
+..................
+
+The GenConfML model is drawn out as a uml model in below picture.
+
+  .. image:: gcfml.jpg
+
+.. note::
+
+   GenConfML supports also common ImplML elements. More information about :ref:`ImplML elements <implml-common-elements>` . 
+
+<file> Element
+**************
+
+The ``file`` element is the root element of the configuration, and acts as a container to the rest of the elements. Each 
+generated file must be defined in its own Generic Configuration File XML file.  The input file for XSLT processor is 
+the Configuration ML file including only the data element containing values for all selected settings. Following XSLT 
+output types are supported: XML, HTML, and text.  
+
+Attributes
+++++++++++
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+name                  Yes                     Defines a name of the output file. Can contain path that is used to create 
+                                              subfolders under output directory.
+target                No                      Defines a Symbian specific attribute for additional path information. Final 
+                                              target path is a combination of target and name. The combined path is used in 
+                                              output directory and in IBY file. If target attribute is not supported full 
+                                              path can be defined also as a value of name attribute.
+====================  ======================  ===============================================================================
+
+
+Child Elements
+++++++++++++++
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+setting               0 .. *                  Defines a configuration setting reference that is used as an input in  XSLT
+                                              prosessing.
+xsl:stylesheet        1                       Defines stylesheet for XSLT processor. 
+====================  ======================  ===============================================================================
+
+Example
++++++++
+
+.. code-block:: xml
+
+    <file xmlns="http://www.s60.com/xml/genconfml/1" name="myname.txt" target="">
+     ...
+    </file>
+
+
+<setting> Element
+*****************
+
+Setting element is mandatory element containing the settings used in this transformation.
+
+
+Attributes
+++++++++++
+
+====================  ======================  ===============================================================================
+Attribute             Required                Description
+====================  ======================  ===============================================================================
+ref                   Yes                     Defines a Feature/setting reference pair. All settings inside one feature 
+                                              can be selected by using Feature/*.
+====================  ======================  ===============================================================================
+
+Example
++++++++
+
+.. code-block:: xml
+
+    <setting ref="MyFeature/Setting1"/> 
+    
+
+<xsl:stylesheet> Element
+************************
+
+Xsl:stylesheet element defines the XSLT [3] stylesheet used to transform input data from ConfML to output file.
+
+The style sheet can be defined inside file element or in external file identified using stylesheet attribute.
+If style sheet is completely omitted then input file is to be used as such as the configuration file without any transformation.
+The MIME type for XML files of Generic Configuration File ML is ``text/application+xml``. 
+
+
+Full example files
+''''''''''''''''''
+
+Example Generic Configuration File ML file:
+
+.. literalinclude:: genconfml_example1.txt
+   :language: xml
+
+Example file that is passed to the included XSLT processor contains only selected data elements:
+
+.. literalinclude:: genconfml_example2.txt
+   :language: xml
+   
+Example output file that is generated by XSLT processor:
+
+.. literalinclude:: genconfml_example3.txt
+   :language: xml
+
+The output file will be located under the output folder in a sub-folder determined based on the
+name and target attributes of the file element. E.g., in this case the output file's path is
+``output_dir/private/2000BEE5/CamcorderData.xml``.
+
+Notice that same result is obtained by having the following line in the GenConfML file:
+
+.. literalinclude:: genconfml_example5.txt
+   :language: xml
+
+XSD
+'''''''''
+
+Download: :download:`gcfml.xsd </xsd/gcfml.xsd>`
+
+
+FAQ
+'''''''''
+
+This will be updated based on the questions.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/general.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,640 @@
+ImplML and plug-ins
+===================
+
+The `configuration project` concept contains an interface/implementation split
+by using the Configuration Markup Language (ConfML) to specify the interface for
+configurable entities in a project, and an arbitrary number of Implementation
+Markup Languages (ImplML) to specify the output generated based on the interface.
+
+ConE plug-ins supply the actual code-level implementations for the different
+implementation languages. This page describes common ImplML concepts.
+
+
+ImplML basics
+-------------
+
+All implementation languages are based on XML, and each separate
+Implementation Mark-up Language (ImplML) resides within a single
+XML namespace. The namespace of the ImplML must be defined in
+the file, or the implementation won't be recognized. For example,
+the following file is an example of CRML (Central Repository
+Mark-up Language):
+
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="Feature1_1" uidValue="0x00000001" owner="0x12341000">
+        <access type="R" capabilities="AlwaysPass"/>
+        <access type="W" capabilities="AlwaysPass"/>
+        
+        <key ref="Feature1/IntSetting" name="Int setting" int="0x00000001" type="int" readOnly="false" backup="true">
+            <access type="R" capabilities="AlwaysPass"/>
+        </key>
+    </repository>
+
+Notice the use of the XML namespace ``xmlns="http://www.s60.com/xml/cenrep/1"``
+in the root element. This is what tells ConE that a CRML implementation should
+be read from this XML document's root element. Here there is only one implementation
+language used, and the extension of the file can reflect this (the extension is
+.crml in this case).
+
+However, the use of XML namespaces to differentiate implementation languages
+enables the mixing of multiple languages in a single implementation file.
+For example, the following file uses two implementation languages under common container,
+RuleML and ContentML:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        <ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+            <rule>
+                CustomSettings.StartupSoundFile.localPath configures StartupSettings.StartupSoundPath
+                    = Startup.StartupSoundPath filenamejoin CustomSettings.StartupSoundFile.localPath
+            </rule>
+        </ruleml>
+
+        <content xmlns="http://www.s60.com/xml/content/3">
+            <output file="${StartupSettings.StartupSoundPath}">
+                <input file="${CustomSettings.StartupSoundFile.localPath}"/>
+            </output>
+        </content>        
+    </container>
+
+The execution order of elements inside the container is the same as the order of definition.
+
+In this example, the RuleML section first sets the value of a ConfML setting,
+whose value is then used in the ContentML section to copy the file to the
+correct place. 
+Notice how the XML namespaces are defined. 
+
+ - The container is in http://www.symbianfoundation.org/xml/implml/1, the root element of implml namespace must always be container
+ - The ruleml is in http://www.s60.com/xml/ruleml/2
+ - The content is in xmlns="http://www.s60.com/xml/content/3"
+
+When reading the implementation file, ConE checks the document root and its namespace 
+to find out from namespace to start parsing. 
+
+.. _implml-file-extensions:
+
+File extensions
+^^^^^^^^^^^^^^^
+
+Implementations are read from files under layers' ``implml/`` directories
+inside the configuration project. The extensions of these files matter
+in whether implementations are attempted to be read from a file or
+not. The generic implementation file extension is ``implml``, but plug-ins
+may extend the list of supported file extensions. However, the extension
+does nothing more than specify whether the file is attempted to be parsed or
+not; no checking on the implementation types is done. This means that
+it is possible to create e.g. a CRML file with the extension ``templateml``,
+but of course this makes no sense and should be avoided. 
+
+The extension checking mechanism is there in order to differentiate
+implementation files and any other related files, e.g. Python scripts
+used by RuleML implementations. This way, if an implementation file
+contains invalid XML data an error will be shown to the user, but a
+Python script (the reading of which as XML would invariably fail and
+produce an error) will simply be ignored.
+
+If you want to see what file extensions are supported, run to following
+command::
+
+    cone info --print-supported-impls
+
+This will print something like the following::
+
+    Running action info
+    Supported ImplML namespaces:
+    http://www.symbianfoundation.org/xml/implml/1
+    http://www.s60.com/xml/cenrep/1
+    http://www.s60.com/xml/content/1
+    http://www.s60.com/xml/content/2
+    http://www.s60.com/xml/convertprojectml/1
+    http://www.s60.com/xml/genconfml/1
+    http://www.s60.com/xml/imageml/1
+    http://www.s60.com/xml/ruleml/1
+    http://www.s60.com/xml/ruleml/2
+    http://www.s60.com/xml/templateml/1
+    http://www.s60.com/xml/thememl/1
+    http://www.symbianfoundation.org/xml/hcrml/1
+
+    Supported ImplML file extensions:
+    implml
+    content
+    contentml
+    crml
+    gcfml
+    convertprojectml
+    ruleml
+    imageml
+    thememl
+    templateml
+    hcrml
+
+Another way is to check the log file created when running ``cone generate``.
+It should contain a line like the following::
+
+    Supported implementation file extensions: ['templateml', 'ruleml', 'thememl', 'imageml', 'crml', 'content', 'contentml', 'convertprojectml', 'hcrml', 'gcfml', 'implml']
+
+**Guidelines for implementation file naming**
+
+- Use the corresponding file extension if the file contains only a
+  single implementation instance (e.g. ``.crml`` for a CRML implementation)
+- Otherwise use the generic ``implml`` extension with containers
+
+Implementation container nesting
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+In example 1, implementations were defined under a single root container element. The container
+elements can be nested to form sub containers under the single implementation file. 
+
+For example:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        <container>
+            <phase name="pre">
+            <ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+                <rule>
+                    CustomSettings.StartupSoundFile.localPath configures 
+                    StartupSettings.StartupSoundPath = Startup.StartupSoundPath + "/" + CustomSettings.StartupSoundFile.localPath
+                </rule>
+            </ruleml>
+        </container>
+     
+        <container>
+            <phase name="normal">
+            <content xmlns="http://www.s60.com/xml/content/3">
+                <output file="${StartupSettings.StartupSoundPath}">
+                    <input file="${CustomSettings.StartupSoundFile.localPath}"/>
+                </output>
+            </content>
+            
+            <!-- Another ContentML section, copies the file to another directory -->
+            <content xmlns="http://www.s60.com/xml/content/3">
+                <output dir="some/dir">
+                    <input file="${CustomSettings.StartupSoundFile.localPath}"/>
+                </output>
+            </content>
+        </container>
+        
+    </container>
+
+Here the root level container has two sub-containers, where the first sub-container 
+is executed in "pre" phase (<phase name="pre"> definition) and the second in "normal" phase.
+
+.. _common-implml-namespace:
+
+Common ImplML namespace
+-----------------------
+
+Because there are common elements that are relevant for most, if not all, implementations,
+there is a common ImplML namespace (``http://www.symbianfoundation.org/xml/implml/1``)
+that contains these. The common elements can be defined by default in the container elements.
+The support for the plugin implementation support for common elements depends on the implementation 
+of the plugin. So refer to the plugin specific documentation to what each plugins supports.
+
+.. _implml-common-elements:
+
+Elements 
+^^^^^^^^
+
+The common ImplML elements are illustrated with the following UML class diagram:
+
+  .. image:: implml.jpg
+
+
+====================  ======================  ===============================================================================
+Element               Cardinality             Description
+====================  ======================  ===============================================================================
+container             1 .. *                  Defines a container for sub elements. For details see 
+                                              :ref:`implml-common-container` .
+tempVariableSequence  0 .. *                  Defines a temporary sequence variable. For details see 
+                                              :ref:`implml-common-temporary-variables`.
+tempVariable          0 .. *                  Defines a temporary variable. For details see 
+                                              :ref:`implml-common-temporary-variables`.
+tag                   0 .. *                  Defines an implementation tag. For details see 
+                                              :ref:`implml-common-implementation-tags`.
+phase                 0 .. 1                  Defines a execution phase. For details see 
+                                              :ref:`implml-common-invocation-phase` .
+====================  ======================  ===============================================================================
+
+.. _implml-common-container:
+
+Container element
+^^^^^^^^^^^^^^^^^
+
+The container element in the common namespace is like its name says a implementation 
+that can contain other implementations. So in other words containers can contain 
+other containers or actual implementations, like templateml, content, ruleml, etc.
+
+The key purpose of the containers is to offer a mechanism where one configuration 
+implementation solution can be nicely wrapped to a single file. The whole solution might 
+require generation of one or more output files, rules, content copying, executing system 
+commands, etc. To resolve simple and more complex problems the containers offer a execution 
+flow control, with phases, tags and conditions.
+
+Example with conditional container execution:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+               condition="${Feature1.Setting1}"
+               value="true">
+        <!-- Affects to the root container and to the below implementation sections -->
+        
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="content" flatten="true">
+                <input file="test/file1.txt"/>
+            </output>
+        </content>        
+    </container>
+
+In the above example the generation phase will check if the condition is evaluated as true before entering the container.
+The condition="${Feature1.Setting1}" refers to a Feature value inside the configuration, and value="true" requires
+that the value of that feature is True. So content copying of test/file1.txt to content/file1.txt is executed only when Setting1 
+is set to True. 
+
+.. _implml-common-invocation-phase:
+
+Invocation phase
+^^^^^^^^^^^^^^^^
+
+Containers and implementations may define the phase in which they are executed, which can be 'pre',
+'normal' or 'post'. The default phase is determined by the code-level implementation
+(usually the default phase is 'normal'), but this can be overridden for an
+implementation by using the ``phase`` element. The element contains a single mandatory
+attribute, ``name``, which defines the execution phase.
+
+When using containers in common implml files the ``phase`` of the implementation is always ignored. 
+This enables overriding of the default ``phase`` of the implementations with the containers. 
+
+Example with two implementation in post phase:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container  xmlns="http://www.symbianfoundation.org/xml/implml/1">        
+        <!-- Affects to the root container and to the below implementation sections -->
+        <phase name='post'/>
+        
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="content">
+                <input>
+                    <include files="test/file1.txt"/>
+                </input>
+            </output>
+        </content>
+        
+        <ruleml xmlns="http://www.s60.com/xml/ruleml/1" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">                    
+            <rule>X.Y configures X.Z = X.Y</rule>
+        </ruleml>
+    </container>
+
+
+Example with two containers in different phases:
+
+To run implementation in different phases you must define two separate containers
+that have a separate phase in them. In the below example the root level container 
+is entered and executed in pre,post phase but the first sub-container only in 
+pre phase and the second container in post phase.
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">        
+        <container>
+            <phase name='pre'/>
+            <ruleml xmlns="http://www.s60.com/xml/ruleml/1" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">                    
+                <rule>X.Y configures X.Z = X.Y</rule>
+            </ruleml>
+        </container>
+    
+        <container>
+            <phase name='post'/>
+            
+            <content xmlns="http://www.s60.com/xml/content/2">
+                <output dir="content">
+                    <input>
+                        <include files="test/file1.txt"/>
+                    </input>
+                </output>
+            </content>
+        </container>
+            
+    </container>
+    
+.. _implml-common-implementation-tags:
+
+Implementation tags
+^^^^^^^^^^^^^^^^^^^
+
+A concept common to all implementations are implementation tags. These are simple
+name-value pairs that can be used as one way of filtering the implementations
+when generating. For example the tag ``target : core``, could be used to tag
+the particular implementation and, when generating, the same tag could be used to
+generate only implementations for the target *core*.
+
+Tags can be defined in implementations that support them or in containers that 
+hold implementations. The overall tags of a container is a sum of all tags defined 
+in its children (including sub-container and implementations)
+
+To generate only the implementations for the *core* target the following generation command could be used::
+
+    cone generate --impl-tag=target:core
+
+**Tag elements**
+
+Tag elements are simple XML elements defining name-value pairs.
+There can be multiple tags with the same name, in which case the resulting value
+for that tag will be a list of all the specified values. Examples:
+
+.. code-block:: xml
+
+    <tag name="target" value="core">
+    <tag name="target" value="rofs2">
+    <tag name="target" value="uda">
+    <tag name="content" value="music">
+
+Tags can also get their values from ConfML settings, which can be referenced in the usual way:
+
+.. code-block:: xml
+
+    <tag name="${Feature.TagName}" value="somevalue"/>
+    <tag name="target" value="${Feature.TargetValue}"/>
+
+When tags are defined to the container it will basically affect on all its sub implementations.
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        <tag name='target' value='core'/>
+        <tag name='target' value='rofs2'/>
+        
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="content">
+                <input>
+                    <include files="test/file1.txt"/>
+                </input>
+            </output>
+        </content>
+        
+        <ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+            <rule>X.Y configures X.Z = X.Y</rule>
+        </ruleml>
+    </container>
+
+In this case both the ContentML and RuleML sections would have the same tags.
+
+The tag elements can be defined also in some implementation namespaces directly under the root element. E.g. the content in the following
+content file would be copied to the output only for targets *core* and *rofs2*:
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <content xmlns="http://www.s60.com/xml/content/2" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+
+        <tag name='target' value='core'/>
+        <tag name='target' value='rofs2'/>
+      
+        <output dir="content">
+            <input>
+                <include files="test/file1.txt"/>
+            </input>
+        </output>
+    </content>
+    
+
+Filtering Based on Implementation Tags
+''''''''''''''''''''''''''''''''''''''
+
+This chapter explains how to create implementation tag specific implementation files. 
+`cone_defaults.cfg` defines the default tags for plugins. If nothing is defined 
+for a certain plugin type then plugin_tags variable is empty. Basically empty 
+tag means that corresponding plugin participates only those generation where 
+generation is not filtered by any implementation tag. If generation defines 
+implementation tag filter then generation is done only for those plugins that 
+match with the filter. If filter is not given filtering is not done and all 
+plugins are participating in generation. In case of customization layer this 
+would mean that uda content could end up to rofs3 section. Filtering is done 
+only for normal and post phases, which means that you don't need to define 
+any tag for ruleml files since they are ran in pre phase. Default value 
+can be overridden in implementation file of the plugin like the following example 
+shows. 
+
+**Example 1:**
+
+Content plugin default value in cone_defaults.cfg is target:rofs3, which means 
+that by default it participates in generations that doesn't define 
+implementation tags or defines rofs3. However we want create content files that 
+copies stuff to uda. It can be done by overriding tag in .content file by  
+adding the following line there:
+
+::
+
+    <tag name='target' value='uda'/>
+
+**Example 2:**
+
+commsdat.content doesn't contain any tag information and cccccc00.cre should 
+go to rofs3 image. No actions needed because default value for content is rofs3.
+
+Current default values for plugins:
+
+::
+
+    CRML    = 'core','rofs2','rofs3'
+    GCFML   = 'core','rofs2','rofs3'
+    CONTENT = 'rofs3'
+    MAKEML  = 'makefile'
+    RULEML  = ''
+    IMAGEML = 'rofs3'
+    THEMEML = 'rofs3'
+
+Workflow for creating new implementation file:
+
+  .. image:: tag-fil.jpg
+
+
+
+.. _implml-common-temporary-variables:
+
+Temporary variables (generation-scope temporary ConfML features)
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The common ImplML namespace also makes it possible to define temporary variables
+for e.g. passing information between implementations or specifying a constant in only
+one place. Unlike implementation tags, the temporary variables are not
+implementation-specific, but they are visible to all implementations, because they are
+normal ConfML settings. However, overwriting existing features in the
+configuration is prevented by raising an error when defining a feature that already exists.
+Therefore the names of used temporary variables should be chosen with care.
+
+Temporary variables can be defined as follows:
+
+.. code-block:: xml
+
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        <tempVariable ref="TempFeature.IntSetting" type="int" value="123"/>
+        
+        <!-- Default type is 'string' -->
+        <tempVariable ref="TempFeature.StringSetting" value="test"/>
+        
+        <!-- Initial value from an existing ConfML setting -->
+        <tempVariable ref="TempFeature.StringSetting2" type="int" value="${ExistingFeature.Setting}"/>
+        
+        <!-- TempFeature.IntSetting has already been defined, so this will always raise an error -->
+        <tempVariable ref="TempFeature.IntSetting" type="int" value="555"/>
+        
+        <!-- Simple sequences can also be defined. -->
+        <tempVariableSequence ref="TempFeature.SequenceSetting">
+            <tempVariable ref="StringSubSetting" type="string"/>
+            <tempVariable ref="IntSubSetting" type="int"/>
+        </tempVariableSequence>
+    </container>
+
+Temporary variables only support the simplest ConfML setting types:
+
+- string
+- int
+- real
+- boolean
+
+**Usage example**
+
+In this example, we have the need to copy files from a number of different
+locations to the output directory based on arbitrary logic. To do this, we create
+a temporary sequence, populate it in a rule, and finally copy the files to
+the output. This way there is no need to define a custom ConfML setting in
+a separate file and include it in the project, so all implementation-specific
+concerns are on the implementation side and do not leak to the interface (ConfML).
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        
+        <!-- Temporary sequence setting for storing a generation-time created list of files to copy -->
+        <tempVariableSequence ref="FileCopyTemp.Files">
+            <tempVariable ref="Path" type="string"/>
+        </tempVariableSequence>
+        
+        <!-- Rule for populating the temporary sequence -->
+        <ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+            <rule>True configures FileCopyTemp.Files = {% get_file_list() %}</rule>
+            
+            <!-- Python script containing the get_file_list() -->
+            <!-- function used above. It does whatever tricks -->
+            <!-- are necessary to obtain the list of files to -->
+            <!-- copy.                                        -->
+            <eval_globals file="scripts/file_copy.py"/>
+        </ruleml>
+        
+        <!-- ContentML implementation for copying the created file list to output -->
+        <content xmlns="http://www.s60.com/xml/content/3">
+            <output dir="some_dir/">
+                <input files="${FileCopyTemp.Files.Path}"/>
+            </output>
+        </content>
+        
+    </container>
+
+
+.. _implml-common-setting-refs-override:
+
+Overriding setting references
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+During generation, implementation instance may be filtered based on the setting references
+they use. Normally the set of references should be correctly determined by the implementation
+instance itself, but if for some reason the references need to be overridden in the
+ImplML file, it is possible by using the common ``settingRefsOverride`` element.
+The element can be used in two ways:
+
+- It may contain a set of ``settingRef`` sub-elements defining the setting
+  references
+- It may contain a ``refsIrrelevant`` attribute that, if set to ``true``,
+  specifies that setting references are irrelevant for the implementation. In
+  this case the implementation will never be filtered out based on setting
+  references during generation.
+
+**Examples**
+
+.. code-block:: xml
+    
+    <settingRefsOverride refsIrrelevant="true"/>
+
+.. code-block:: xml
+    
+    <settingRefsOverride>
+        <settingRef value="SomeFeature.SomeSetting"/>
+        <settingRef value="SomeFeature.SomeOtherSetting"/>
+    </settingRefsOverride>
+
+
+.. _implml-common-setting-output-dir-override:
+
+Overriding output directory parts
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The final output directory for implementation output is consists of three parts:
+
+- *Output root*, speficied from the command in the ``generate`` action
+- *Output sub-dir*, specified in a setting file (e.g. ``content/`` for CRML in
+  iMaker variant content output settings file)
+- *Plug-in output*, specified in a setting file (e.g. ``private/10202BE9`` for CRML)
+- *Output file name*, specified in the implementation file in some way, may also
+  contain some intermediary directories before the actual file name
+  (e.g. ``12345678.txt`` for a CRML file with repository UID 0x12345678)
+
+Of these, the two first may be overridden in the implementation file using
+the common ImplML elements ``outputRootDir`` and ``outputSubDir``. These elements
+may contain a single ``value`` attribute containing the directory name.
+
+**Examples**
+
+.. code-block:: xml
+    
+    <outputRootDir value="\epoc32\data"/>
+    <outputSubDir value="widgets"/>
+
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+        
+        <!-- Temporary sequence setting for storing a generation-time created list of files to copy -->
+        <outputRootDir value="\epoc32\data"/>
+        <outputSubDir value="widgets"/>
+
+        <!-- ContentML implementation for copying the created file list to output -->
+        <content xmlns="http://www.s60.com/xml/content/3">
+            <output dir="some_dir/">
+                <input file="test.wgz"/>
+            </output>
+        </content>
+        
+    </container>
+
+In the above example the content is copied to \epoc32\data\widgets\some_dir\text.wgz.
+
+
+.. rubric:: Footnotes
+
+.. [#multi-content-note] In this case the run-time behavior would still be same; ContentML
+   allows multiple ``output`` elements. However, this might not be the case for all
+   implementation languages.
+
+.. [#legacy-implml-root-name-note] The specifications for the legacy implementation
+   languages CRML and GenConfML do give the root element names, and say that each
+   implementation must be in its own crml/gcfml file.
+   It is recommended to stick to this convention for these two implementation languages
+   also in the future. Indeed, using them in a multi-implementation file has not been
+   tested and may not even work correctly.
Binary file configurationengine/doc/plugins/hcrml-plugin/hcr_dat.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/hcrml-plugin/hcr_diagram.uml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1039 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
+<XPD:HEADER>
+<XPD:SUBUNITS>
+</XPD:SUBUNITS>
+<XPD:PROFILES>
+</XPD:PROFILES>
+</XPD:HEADER>
+<XPD:BODY>
+<XPD:OBJ name="DocumentElement" type="UMLProject" guid="KP8MW2AJ4EaQPbS2U99tdgAA">
+<XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
+<XPD:ATTR name="#OwnedElements" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="PGTjH/H2T0Cw+snKUpOfhAAA">
+<XPD:ATTR name="Name" type="string">Model1</XPD:ATTR>
+<XPD:REF name="Namespace">KP8MW2AJ4EaQPbS2U99tdgAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="es0kksaNwU6dH75+6sWUBgAA">
+<XPD:ATTR name="Name" type="string">hcrml_elements</XPD:ATTR>
+<XPD:REF name="DiagramOwner">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="D48HkI961UCbWSvf/i/2kQAA">
+<XPD:REF name="Diagram">es0kksaNwU6dH75+6sWUBgAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">12</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="USbBAMvkdU+zaV4XNH48xwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">56</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">67</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">36</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Ha1bYprhcU6R0LLsb56YBgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="ZAW6ns/wm0C9AdlawZGYLAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="gWUJbvSy/E2oH5JKJeq+IQAA">
+<XPD:ATTR name="Text" type="string">&lt;&lt;hcrml&gt;&gt;</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="tFkJAEzoDE6+iMN97KfgGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6EX7k5+unEGGf705CHb3BwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="s6/9I0lCiEqddgKhuVDbuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qhebg4kZ1kW9T/F4Ol2erwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="90+0XkM4FEWSvc0hDcS8hQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">99</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">148</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">62</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">85</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="RkfasvrOC0KhV0GSwS2vpAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="B4x+D5RlfkiQnn75WQk3YgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">output</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="DHhOCHBlcEap8oEHCwLQZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="X6Dim+yIqEe9iLZQIPTqSgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="GP/d7xdnJk29AbjUbCDFzgAA">
+<XPD:REF name="Model">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="4jfn5jjHsE6tzHK1czetGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="NUBzdiG7Jk2e94HxWeOYOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="/8ebn4fbc0GwVvHGdHUs7wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">278</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">167</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">61</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="c9kVl3YvbkacY1hcP8ZSxAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="mtiQL9MLI06OZCYMxKlJ2gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">category</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Ul4b3QYZqE+VHPJOHVov3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="UQzXpigg+kOwaCMElsUu8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="2ffSCszEikagMBCQm0qYPAAA">
+<XPD:REF name="Model">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="AeGaTz/9JUy2DFPWy9yj6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="d4+BmgEiIkqS0gDU+hg7UgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="EmtFrUjEtUCaTo178nzlXwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">278</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">252</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">61</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">98</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="0+iOLUNQMU2JdAo0M9bm9wAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="2X4vo/lPD0KX/V5thETqigAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">setting</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="xTBPpvZX6U2mtHh8zXiAnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Ro8WWPp5H0mcz2zWkiDrOQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="2P9sUmT3gEOuT3mIAeznywAA">
+<XPD:REF name="Model">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="TGENQxZ86k+pAN3oz8w/rAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="buuTrQKu/UOYDYXIN4X2jwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLClassView" guid="kJLxcue6x0u84gD7oW/MwAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">272</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">400</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">73</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="NdMpVzeLF0O9Mt1K3E3ibQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="3K8/ZHEgAUC6QambnLOQXgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">flags</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="D41t0v9O306JUSPythjkXgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="qTn3Mbemn0GAYRS38wapXQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="uSlR5AWRnEOhZNkhY8dafgAA">
+<XPD:REF name="Model">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="P+88A43vq0OF3w/jVw50nAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="yjdf5r67aE+HDjD/99Og4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="h7HTNndSGker+jhbQvalSgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">105</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">292</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="AutoResize" type="boolean">True</XPD:ATTR>
+<XPD:REF name="Model">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="R/knH1BVe02NgV8EUg9IRwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="oTIgSgBCUU6E6oEqyKuuXAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">include</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="fKIFBC/zJkm0b8lk9gGBuAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="kk4SDkEgckah0v/E8kb65gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="EV0WFYrJEEOSmHY0hlSIpQAA">
+<XPD:REF name="Model">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="sd84VZqmaEOhviGYnjq8AAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="mwZwjK21y0u7OHSaF+c+qQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="6KT2d7NjBE6cL8ksI7FBIAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">160,151;207,91</XPD:ATTR>
+<XPD:REF name="Model">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+<XPD:REF name="Head">USbBAMvkdU+zaV4XNH48xwAA</XPD:REF>
+<XPD:REF name="Tail">90+0XkM4FEWSvc0hDcS8hQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="q47/cW8GHU6sL3QObV02ygAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="o2IR0kGtGEeYALto8VPdSwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Xy2KZjE3P0eZJ9ZkCcvpnAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Op0NtPyglkGxvO8nW3Ck2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">nOgz2ElH10298hw2CJeauwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="A8WJJ9PbGEuWaqp9RZ3vlQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">5yRfwhL4YUCn3dlCCSdDoAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="C05lqqmfeEGXKE0tKUoEKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">nOgz2ElH10298hw2CJeauwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="4ziEVm2OBUamCPHrTWtb0gAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">5yRfwhL4YUCn3dlCCSdDoAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="oDRtl3JnPUyJFZvqmcVLdQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">nOgz2ElH10298hw2CJeauwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="K2npH6yJiEG8732+l/siCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">5yRfwhL4YUCn3dlCCSdDoAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="6eztFek9L0yZHw9SL/eMBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">nOgz2ElH10298hw2CJeauwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="nu7xBpS2YkCpS8Ho0JJhqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">5yRfwhL4YUCn3dlCCSdDoAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="4/wEq0iJ00W3+a92k6yk6QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">292,167;235,91</XPD:ATTR>
+<XPD:REF name="Model">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+<XPD:REF name="Head">USbBAMvkdU+zaV4XNH48xwAA</XPD:REF>
+<XPD:REF name="Tail">/8ebn4fbc0GwVvHGdHUs7wAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="U2d8ZEjYI0mtWpl/kDdHjgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="m+nJcaYDKUKQGdsfXu0KuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="PE2J8IpmaUuKjdRfpaLoawAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="1tft9JkEy0+mAJZ7hqUohwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Q4xX5lDyPkS2RIO7Hfe35gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="N+hayhtST0qI8uEhO6XFGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">E42e6HOOBUWXlVVzGtxSDQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="reF5ps+9rU2KZI8cuoGIVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Q4xX5lDyPkS2RIO7Hfe35gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="f8buhcQv/U+kGT9yVSZBagAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">E42e6HOOBUWXlVVzGtxSDQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="R32nuYG0mkyW9syy+rHL/gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Q4xX5lDyPkS2RIO7Hfe35gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="S4XDPyYtaEG4QZ+ZoihgKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">E42e6HOOBUWXlVVzGtxSDQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jeC/QuvS0ky7Dr2MVtpGjQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Q4xX5lDyPkS2RIO7Hfe35gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="SIE3N2FHsUWwVw/MdrR6aAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">E42e6HOOBUWXlVVzGtxSDQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="4ph9TrZl1UOUAMwM2w+PQgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">129,292;129,232</XPD:ATTR>
+<XPD:REF name="Model">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+<XPD:REF name="Head">90+0XkM4FEWSvc0hDcS8hQAA</XPD:REF>
+<XPD:REF name="Tail">h7HTNndSGker+jhbQvalSgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="/+CXrfYl00GP4xQhlXDQugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="SFQ2ztszTk6xmp20h/C0XAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="9/DF3KExE0Cvi6K92bbugAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="pzgec13dM0aManQpyaPbYAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bK2IMyA5QUiAj7nAMWOHrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VHoxIzNu1kiZKQv8M5rM8AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">qpqQ4elhKUmjonZgVOvpOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ptbfXT/JNEqotOlgcK3g+gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bK2IMyA5QUiAj7nAMWOHrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Bpm+slTtNUWuPmD4CzZrZwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">qpqQ4elhKUmjonZgVOvpOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Ygz8uaSzNES0KNwJEUoLNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bK2IMyA5QUiAj7nAMWOHrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Jmq3h0Qv2ESaSglLIn1ZzAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">qpqQ4elhKUmjonZgVOvpOAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="DAYp+Nrbi0iQhsaKtsRmPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">bK2IMyA5QUiAj7nAMWOHrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="TUY65taZe0C7H6h5wY7JTgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">qpqQ4elhKUmjonZgVOvpOAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="xF2J+LXJxUCn2T/vd6gnygAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">308,252;308,212</XPD:ATTR>
+<XPD:REF name="Model">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+<XPD:REF name="Head">/8ebn4fbc0GwVvHGdHUs7wAA</XPD:REF>
+<XPD:REF name="Tail">EmtFrUjEtUCaTo178nzlXwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4s4niPVs0kymeaRU0Z4f3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="d8tiCB7gD0+6euJHHzdF8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0+IcA7WboUSsBfNeT/hgrgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vJ8TmV4RzUS6lPNccLoLwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iimfnoFJmEK0X5e0JaQTPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="crH275uvpkKQvB69KBfwQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">te1qdkzq8EaWy8tgF/Vv2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="3SK0qlHt7UCa31x5EFGX4wAA">
+<XPD:ATTR name="Alpha" type="real">0.679413788174143</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">33.4215499341368</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">iimfnoFJmEK0X5e0JaQTPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cz/yFSW91EarUx7DFJJhXwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">te1qdkzq8EaWy8tgF/Vv2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Hz5+T85OEUSkzudjIKXl9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">iimfnoFJmEK0X5e0JaQTPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="7rcE9sJNZkCHL7t2vW5LugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">te1qdkzq8EaWy8tgF/Vv2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ylC2fZK2pkW8U+HL8oa1kAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">iimfnoFJmEK0X5e0JaQTPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Z6FjsUP0Tkm6+0ucrbS00AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">te1qdkzq8EaWy8tgF/Vv2AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="a4h7IShwykSGqhFNQUaeiAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">308,400;308,349</XPD:ATTR>
+<XPD:REF name="Model">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+<XPD:REF name="Head">EmtFrUjEtUCaTo178nzlXwAA</XPD:REF>
+<XPD:REF name="Tail">kJLxcue6x0u84gD7oW/MwAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="MgNgVnAnBUeyOuvRRiTRBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="+r03o1h/akCjV7eC+sRXGAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="NPVXYtyKuUueWkWtqHahxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="lUvGN2bPtku5fTy4mWI/MgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">CFpTL7Di+0aVEPq/ybpqUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="w1ihFhlJvkSygZ+AVGmD8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">EE6T7JCajU2jejPWIkBaXQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="XvPW20TgIEeb7uERIeM/hwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">CFpTL7Di+0aVEPq/ybpqUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="RwVm5wKIJ0Gyp/gCO/owZwAA">
+<XPD:ATTR name="Alpha" type="real">-0.881872031161297</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">22.0227155455452</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">EE6T7JCajU2jejPWIkBaXQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="qyoYegWpvk+nKh5q+Rdw0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">CFpTL7Di+0aVEPq/ybpqUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="PposSZlJv0KmPtS2V/ZAZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">EE6T7JCajU2jejPWIkBaXQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ByMgAv0IokS9cpUnyY8n/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">CFpTL7Di+0aVEPq/ybpqUwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="qVMA85GvhUanfQJOUbqSzwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">EE6T7JCajU2jejPWIkBaXQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="D+872E2dEUuYXZNx4hB+RQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">278,190;160,190</XPD:ATTR>
+<XPD:REF name="Model">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+<XPD:REF name="Head">90+0XkM4FEWSvc0hDcS8hQAA</XPD:REF>
+<XPD:REF name="Tail">/8ebn4fbc0GwVvHGdHUs7wAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="A+B2S73g4EyTWLXAwSc1IAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/NN27mUSEkiUo9RRoAPJWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="C1zGLW2Xy0uDdHWNRPE4tQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="KMvckZhjgECMR9D7d9l9wwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">+65Z0BKNqkOuFO68bobBKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="3+FXNI5eo0GZM264rgzKSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">OAWY5ng5Ckemq84Y7VjRLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ITokhtYjWE+aUg0r3N+TmgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">+65Z0BKNqkOuFO68bobBKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="YW2CkNerFU2X9f8CGvTR0AAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">OAWY5ng5Ckemq84Y7VjRLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="26ySfJL8u0+rybTkSbzRiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">+65Z0BKNqkOuFO68bobBKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="mySvGw0ty06UERO75RdF6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">OAWY5ng5Ckemq84Y7VjRLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="W5Oa53rFmUO8Hsi4pVbfuAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">+65Z0BKNqkOuFO68bobBKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="at49h/9gn02OWRaVDd+O2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">OAWY5ng5Ckemq84Y7VjRLgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">12</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="1J3CkvMFlEyFBEHrsOJGtAAA">
+<XPD:ATTR name="StereotypeName" type="string">hcrml</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">USbBAMvkdU+zaV4XNH48xwAA</XPD:REF>
+<XPD:REF name="Views[1]">6EX7k5+unEGGf705CHb3BwAA</XPD:REF>
+<XPD:REF name="Views[2]">s6/9I0lCiEqddgKhuVDbuwAA</XPD:REF>
+<XPD:REF name="Views[3]">qhebg4kZ1kW9T/F4Ol2erwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">nOgz2ElH10298hw2CJeauwAA</XPD:REF>
+<XPD:REF name="Associations[1]">Q4xX5lDyPkS2RIO7Hfe35gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="/Dzo/UB98UO2HlqvzEUOtQAA">
+<XPD:ATTR name="Name" type="string">output</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">90+0XkM4FEWSvc0hDcS8hQAA</XPD:REF>
+<XPD:REF name="Views[1]">GP/d7xdnJk29AbjUbCDFzgAA</XPD:REF>
+<XPD:REF name="Views[2]">4jfn5jjHsE6tzHK1czetGgAA</XPD:REF>
+<XPD:REF name="Views[3]">NUBzdiG7Jk2e94HxWeOYOwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">5yRfwhL4YUCn3dlCCSdDoAAA</XPD:REF>
+<XPD:REF name="Associations[1]">bK2IMyA5QUiAj7nAMWOHrgAA</XPD:REF>
+<XPD:REF name="Associations[2]">+65Z0BKNqkOuFO68bobBKAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">4</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="TcMpUb+Zy0eZ5ynm9Uy03AAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Owner">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Sj6o8+R6KkOU5BtBrFbsZwAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="CGZRgzcy4EqsRj2sg5bInAAA">
+<XPD:ATTR name="Name" type="string">version</XPD:ATTR>
+<XPD:REF name="Owner">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="u2dKYpdxr0u7rLMRMJBQoQAA">
+<XPD:ATTR name="Name" type="string">readOnly</XPD:ATTR>
+<XPD:REF name="Owner">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="ZSLRiuLfmkWNzAHtjG7MxAAA">
+<XPD:ATTR name="Name" type="string">category</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/8ebn4fbc0GwVvHGdHUs7wAA</XPD:REF>
+<XPD:REF name="Views[1]">2ffSCszEikagMBCQm0qYPAAA</XPD:REF>
+<XPD:REF name="Views[2]">AeGaTz/9JUy2DFPWy9yj6AAA</XPD:REF>
+<XPD:REF name="Views[3]">d4+BmgEiIkqS0gDU+hg7UgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">E42e6HOOBUWXlVVzGtxSDQAA</XPD:REF>
+<XPD:REF name="Associations[1]">iimfnoFJmEK0X5e0JaQTPgAA</XPD:REF>
+<XPD:REF name="Associations[2]">OAWY5ng5Ckemq84Y7VjRLgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="37jJRRRPLkePaC3WdAP73QAA">
+<XPD:ATTR name="Name" type="string">uid</XPD:ATTR>
+<XPD:REF name="Owner">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="eRTiGhfJ90ONKB7vYPd9OwAA">
+<XPD:ATTR name="Name" type="string">setting</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">EmtFrUjEtUCaTo178nzlXwAA</XPD:REF>
+<XPD:REF name="Views[1]">2P9sUmT3gEOuT3mIAeznywAA</XPD:REF>
+<XPD:REF name="Views[2]">TGENQxZ86k+pAN3oz8w/rAAA</XPD:REF>
+<XPD:REF name="Views[3]">buuTrQKu/UOYDYXIN4X2jwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">te1qdkzq8EaWy8tgF/Vv2AAA</XPD:REF>
+<XPD:REF name="Associations[1]">CFpTL7Di+0aVEPq/ybpqUwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="+oYZl29YYEKsV2XuuUVYoAAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:REF name="Owner">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Ihz1G3s5DESIs0bAvulM2wAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="ztBGKNn810qK/H32CiNgKAAA">
+<XPD:ATTR name="Name" type="string">id</XPD:ATTR>
+<XPD:REF name="Owner">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="WjFCdIaudEeXb/pvqINyJgAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="BxT6aij+yEmiF1RKkMexawAA">
+<XPD:ATTR name="Name" type="string">comment</XPD:ATTR>
+<XPD:REF name="Owner">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="g5HW/StTxEO8a2R31wFJGAAA">
+<XPD:ATTR name="Name" type="string">flags</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kJLxcue6x0u84gD7oW/MwAAA</XPD:REF>
+<XPD:REF name="Views[1]">uSlR5AWRnEOhZNkhY8dafgAA</XPD:REF>
+<XPD:REF name="Views[2]">P+88A43vq0OF3w/jVw50nAAA</XPD:REF>
+<XPD:REF name="Views[3]">yjdf5r67aE+HDjD/99Og4AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">EE6T7JCajU2jejPWIkBaXQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="uvJmIX2pcUKkTRlJ9HODkgAA">
+<XPD:ATTR name="Name" type="string">uninitialized</XPD:ATTR>
+<XPD:REF name="Owner">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="ZaBCdmaK2UWj0VfEgevjzQAA">
+<XPD:ATTR name="Name" type="string">modifiable</XPD:ATTR>
+<XPD:REF name="Owner">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="rbmNaK8HVkWVR8iMhsi6vwAA">
+<XPD:ATTR name="Name" type="string">persistent</XPD:ATTR>
+<XPD:REF name="Owner">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="T5a2qChBf0emwtAyXmuJdwAA">
+<XPD:ATTR name="Name" type="string">include</XPD:ATTR>
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">h7HTNndSGker+jhbQvalSgAA</XPD:REF>
+<XPD:REF name="Views[1]">EV0WFYrJEEOSmHY0hlSIpQAA</XPD:REF>
+<XPD:REF name="Views[2]">sd84VZqmaEOhviGYnjq8AAAA</XPD:REF>
+<XPD:REF name="Views[3]">mwZwjK21y0u7OHSaF+c+qQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">qpqQ4elhKUmjonZgVOvpOAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="XHpYNgmPW0WhO4nIsThULQAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:REF name="Owner">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="SXBvv/yrwESZkBHGi7wOYQAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">6KT2d7NjBE6cL8ksI7FBIAAA</XPD:REF>
+<XPD:REF name="Views[1]">q47/cW8GHU6sL3QObV02ygAA</XPD:REF>
+<XPD:REF name="Views[2]">o2IR0kGtGEeYALto8VPdSwAA</XPD:REF>
+<XPD:REF name="Views[3]">Xy2KZjE3P0eZJ9ZkCcvpnAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="5yRfwhL4YUCn3dlCCSdDoAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+<XPD:REF name="Participant">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">A8WJJ9PbGEuWaqp9RZ3vlQAA</XPD:REF>
+<XPD:REF name="Views[1]">K2npH6yJiEG8732+l/siCgAA</XPD:REF>
+<XPD:REF name="Views[2]">4ziEVm2OBUamCPHrTWtb0gAA</XPD:REF>
+<XPD:REF name="Views[3]">nu7xBpS2YkCpS8Ho0JJhqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="nOgz2ElH10298hw2CJeauwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:REF name="Association">SXBvv/yrwESZkBHGi7wOYQAA</XPD:REF>
+<XPD:REF name="Participant">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Op0NtPyglkGxvO8nW3Ck2QAA</XPD:REF>
+<XPD:REF name="Views[1]">oDRtl3JnPUyJFZvqmcVLdQAA</XPD:REF>
+<XPD:REF name="Views[2]">C05lqqmfeEGXKE0tKUoEKgAA</XPD:REF>
+<XPD:REF name="Views[3]">6eztFek9L0yZHw9SL/eMBgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="w6C/walGe0evZIkpW1v9cQAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4/wEq0iJ00W3+a92k6yk6QAA</XPD:REF>
+<XPD:REF name="Views[1]">U2d8ZEjYI0mtWpl/kDdHjgAA</XPD:REF>
+<XPD:REF name="Views[2]">m+nJcaYDKUKQGdsfXu0KuwAA</XPD:REF>
+<XPD:REF name="Views[3]">PE2J8IpmaUuKjdRfpaLoawAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="E42e6HOOBUWXlVVzGtxSDQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+<XPD:REF name="Participant">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">N+hayhtST0qI8uEhO6XFGgAA</XPD:REF>
+<XPD:REF name="Views[1]">S4XDPyYtaEG4QZ+ZoihgKgAA</XPD:REF>
+<XPD:REF name="Views[2]">f8buhcQv/U+kGT9yVSZBagAA</XPD:REF>
+<XPD:REF name="Views[3]">SIE3N2FHsUWwVw/MdrR6aAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Q4xX5lDyPkS2RIO7Hfe35gAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:REF name="Association">w6C/walGe0evZIkpW1v9cQAA</XPD:REF>
+<XPD:REF name="Participant">1J3CkvMFlEyFBEHrsOJGtAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1tft9JkEy0+mAJZ7hqUohwAA</XPD:REF>
+<XPD:REF name="Views[1]">R32nuYG0mkyW9syy+rHL/gAA</XPD:REF>
+<XPD:REF name="Views[2]">reF5ps+9rU2KZI8cuoGIVwAA</XPD:REF>
+<XPD:REF name="Views[3]">jeC/QuvS0ky7Dr2MVtpGjQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="p1QIDju8c06lOzVWjm5bfgAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4ph9TrZl1UOUAMwM2w+PQgAA</XPD:REF>
+<XPD:REF name="Views[1]">/+CXrfYl00GP4xQhlXDQugAA</XPD:REF>
+<XPD:REF name="Views[2]">SFQ2ztszTk6xmp20h/C0XAAA</XPD:REF>
+<XPD:REF name="Views[3]">9/DF3KExE0Cvi6K92bbugAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="qpqQ4elhKUmjonZgVOvpOAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+<XPD:REF name="Participant">T5a2qChBf0emwtAyXmuJdwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VHoxIzNu1kiZKQv8M5rM8AAA</XPD:REF>
+<XPD:REF name="Views[1]">Jmq3h0Qv2ESaSglLIn1ZzAAA</XPD:REF>
+<XPD:REF name="Views[2]">Bpm+slTtNUWuPmD4CzZrZwAA</XPD:REF>
+<XPD:REF name="Views[3]">TUY65taZe0C7H6h5wY7JTgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="bK2IMyA5QUiAj7nAMWOHrgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:REF name="Association">p1QIDju8c06lOzVWjm5bfgAA</XPD:REF>
+<XPD:REF name="Participant">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">pzgec13dM0aManQpyaPbYAAA</XPD:REF>
+<XPD:REF name="Views[1]">Ygz8uaSzNES0KNwJEUoLNQAA</XPD:REF>
+<XPD:REF name="Views[2]">ptbfXT/JNEqotOlgcK3g+gAA</XPD:REF>
+<XPD:REF name="Views[3]">DAYp+Nrbi0iQhsaKtsRmPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="sKOn/cx030SedAQVnUh6ZQAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xF2J+LXJxUCn2T/vd6gnygAA</XPD:REF>
+<XPD:REF name="Views[1]">4s4niPVs0kymeaRU0Z4f3AAA</XPD:REF>
+<XPD:REF name="Views[2]">d8tiCB7gD0+6euJHHzdF8gAA</XPD:REF>
+<XPD:REF name="Views[3]">0+IcA7WboUSsBfNeT/hgrgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="te1qdkzq8EaWy8tgF/Vv2AAA">
+<XPD:REF name="Association">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+<XPD:REF name="Participant">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">crH275uvpkKQvB69KBfwQwAA</XPD:REF>
+<XPD:REF name="Views[1]">7rcE9sJNZkCHL7t2vW5LugAA</XPD:REF>
+<XPD:REF name="Views[2]">cz/yFSW91EarUx7DFJJhXwAA</XPD:REF>
+<XPD:REF name="Views[3]">Z6FjsUP0Tkm6+0ucrbS00AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="iimfnoFJmEK0X5e0JaQTPgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">sKOn/cx030SedAQVnUh6ZQAA</XPD:REF>
+<XPD:REF name="Participant">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vJ8TmV4RzUS6lPNccLoLwAAA</XPD:REF>
+<XPD:REF name="Views[1]">Hz5+T85OEUSkzudjIKXl9QAA</XPD:REF>
+<XPD:REF name="Views[2]">3SK0qlHt7UCa31x5EFGX4wAA</XPD:REF>
+<XPD:REF name="Views[3]">ylC2fZK2pkW8U+HL8oa1kAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="H9608kb890mvhOSgz8UP+AAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">a4h7IShwykSGqhFNQUaeiAAA</XPD:REF>
+<XPD:REF name="Views[1]">MgNgVnAnBUeyOuvRRiTRBAAA</XPD:REF>
+<XPD:REF name="Views[2]">+r03o1h/akCjV7eC+sRXGAAA</XPD:REF>
+<XPD:REF name="Views[3]">NPVXYtyKuUueWkWtqHahxwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="EE6T7JCajU2jejPWIkBaXQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+<XPD:REF name="Participant">g5HW/StTxEO8a2R31wFJGAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">w1ihFhlJvkSygZ+AVGmD8wAA</XPD:REF>
+<XPD:REF name="Views[1]">PposSZlJv0KmPtS2V/ZAZAAA</XPD:REF>
+<XPD:REF name="Views[2]">RwVm5wKIJ0Gyp/gCO/owZwAA</XPD:REF>
+<XPD:REF name="Views[3]">qVMA85GvhUanfQJOUbqSzwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="CFpTL7Di+0aVEPq/ybpqUwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:REF name="Association">H9608kb890mvhOSgz8UP+AAA</XPD:REF>
+<XPD:REF name="Participant">eRTiGhfJ90ONKB7vYPd9OwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lUvGN2bPtku5fTy4mWI/MgAA</XPD:REF>
+<XPD:REF name="Views[1]">qyoYegWpvk+nKh5q+Rdw0gAA</XPD:REF>
+<XPD:REF name="Views[2]">XvPW20TgIEeb7uERIeM/hwAA</XPD:REF>
+<XPD:REF name="Views[3]">ByMgAv0IokS9cpUnyY8n/wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="etnO7NCQUkemhFwPoVn7cwAA">
+<XPD:REF name="Namespace">PGTjH/H2T0Cw+snKUpOfhAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">D+872E2dEUuYXZNx4hB+RQAA</XPD:REF>
+<XPD:REF name="Views[1]">A+B2S73g4EyTWLXAwSc1IAAA</XPD:REF>
+<XPD:REF name="Views[2]">/NN27mUSEkiUo9RRoAPJWgAA</XPD:REF>
+<XPD:REF name="Views[3]">C1zGLW2Xy0uDdHWNRPE4tQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="OAWY5ng5Ckemq84Y7VjRLgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+<XPD:REF name="Participant">ZSLRiuLfmkWNzAHtjG7MxAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3+FXNI5eo0GZM264rgzKSQAA</XPD:REF>
+<XPD:REF name="Views[1]">mySvGw0ty06UERO75RdF6gAA</XPD:REF>
+<XPD:REF name="Views[2]">YW2CkNerFU2X9f8CGvTR0AAA</XPD:REF>
+<XPD:REF name="Views[3]">at49h/9gn02OWRaVDd+O2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="+65Z0BKNqkOuFO68bobBKAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akComposite</XPD:ATTR>
+<XPD:REF name="Association">etnO7NCQUkemhFwPoVn7cwAA</XPD:REF>
+<XPD:REF name="Participant">/Dzo/UB98UO2HlqvzEUOtQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">KMvckZhjgECMR9D7d9l9wwAA</XPD:REF>
+<XPD:REF name="Views[1]">26ySfJL8u0+rybTkSbzRiwAA</XPD:REF>
+<XPD:REF name="Views[2]">ITokhtYjWE+aUg0r3N+TmgAA</XPD:REF>
+<XPD:REF name="Views[3]">W5Oa53rFmUO8Hsi4pVbfuAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:BODY>
+</XPD:PROJECT>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/hcrml-plugin/hcrml-plugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,351 @@
+User guide for HCR Plugin usage in ConE
+=======================================
+
+Introduction
+------------
+This page describes how to use ConE HCR plug-in (for Hardware configuration repository).
+The plug-in defines the HCRML Implementation Markup Language, whose purpose is to provide
+the means for creating bindings between ConfML settings and Hardware Configuration Repository
+keys, and generating hcr.dat and C++ header files based on these bindings.
+
+XML namespace and file extension
+--------------------------------
+
+- Namespace: ``http://www.symbianfoundation.org/xml/hcrml/1``
+- File extension: ``hcrml``
+
+HCRML elements
+--------------
+
+The HCRML model is drawn out as a UML model in below picture.
+
+  .. image:: hcrml_elements.jpg
+
+category
+^^^^^^^^
+
+The category represents the same concept as a category in the HCR specification, which must have a name and UID. 
+The category element can exist directly under the HCRML root element or an output element.
+
+**Attributes**
+
+  * *name* - C++ variable name for the category UID in the generated header file
+  * *uid* - UID of the category, must be unique in the repository
+
+**Example**
+
+.. code-block:: xml
+
+  <category name="KCatGPIO" uid="0x10001234">
+
+
+setting
+^^^^^^^
+
+The setting is a sub element of category, it can only exist inside a category. The setting can have the following 
+attributes:
+
+**Attributes**
+
+  * *name* - C++ variable name for the setting UID in the generated header file
+  * *id* - UID of the setting, must be unique under a certain category
+  * *type* - Type of the setting (can be one of setting value types, see next section)
+  * *comment* - Single-line comment for the setting (visible in the generated header file)
+
+
+**Setting value type definitions**
+
+The HCRML value type definitions are derived from repository definitions. So the value type is the 
+same in HCRML, where the prefix EType has been removed and the entry is in lower case.
+
+
+        ==============  ==============
+        HCRML type      HCR type 
+        ==============  ==============
+        int32           ETypeInt32
+        int16           ETypeInt16
+        int8            ETypeInt8
+        bool            ETypeBool
+        uint32          ETypeUInt32
+        uint16          ETypeUInt16
+        uint8           ETypeUInt8
+        linaddr         ETypeLinAddr
+        bindata         ETypeBinData
+        text8           ETypeText8
+        arrayint32      ETypeArrayInt32   
+        arrayuint32     ETypeArrayUInt32
+        int64           ETypeInt64
+        uint64          ETypeUInt64  
+        ==============  ==============
+
+Note:
+Data for the type ``text8`` is encoded in UTF-8. This means that pure ASCII text will work
+correctly without any further processing, and if any characters outside the ASCII range
+are expected to be in the text, the C++ implementation will need to take the encoding into
+account.
+
+**Supported ConfML setting types for HCRML types**
+
++------------------+------------------------------------------------------------------+
+| HCRML type       | ConfML setting type                                              |
++==================+==================================================================+
+| int8, int16,     | int                                                              |
+| int32, int64,    |                                                                  |
+| uint8, uint16,   |                                                                  |
+| uint32, uint64,  |                                                                  |
+| linaddr          |                                                                  |
++------------------+------------------------------------------------------------------+
+| bool             | boolean, int                                                     |
++------------------+------------------------------------------------------------------+
+| arrayint32,      | Sequence with an int sub-setting                                 |
+| arrayuint32      |                                                                  |
++------------------+------------------------------------------------------------------+
+| text8            | string                                                           |
++------------------+------------------------------------------------------------------+
+| bindata          | string with a hexadecimal value, whitespace ignored              |
+|                  | (e.g. ``ABCDEF 1234 5678``)                                      |
++------------------+------------------------------------------------------------------+
+
+**Examples**
+
+.. code-block:: xml
+
+  <setting ref="hcrexample.DebounceInterval" name="KElmGPIO_DebounceInterval" type="int32" id="0"/>
+  <setting ref="hcrexample.GPIO_1" name="KElmGPIO_1" type="int32" id="1" comment="Pin1"/>
+  <setting ref="hcrexample.GPIO_2" name="KElmGPIO_2" type="int32" id="2" comment="Pin2"/>
+
+flags
+^^^^^
+
+Flags element is a subelement of setting that can be used to define bit flags to a setting. 
+
+**Attributes**
+
+Each flag attribute can have values 0,1, default value is 0.
+
+  * *uninitialised*
+  * *modifiable*
+  * *persistent*
+  
+
+**Examples**
+
+.. code-block:: xml
+
+  <flags uninitialized="0"/>
+  <flags modifiable="1" persistent="1"/>
+
+output
+^^^^^^
+
+Output element is a subelement of the root HCRML element used define output file generation. The output element 
+should include a set of category and setting definitions that are included in the output file. The output section can 
+also include other HCRML files to include category/setting definitions to it. 
+
+If the included HCRML files contain output sections of their own, the generation is supposed the generate 
+only the topmost output element. So any included output element is simply ignored.
+
+**Attributes**
+
+  * *file* - The output filename to be generated)
+  * *type* - The output file type, which can be one of [header|hcr]
+  * *version* - For hcr.dat, the HCR version number
+  * *readonly* - For hcr.dat, the read-only bit
+  
+
+**Examples**
+
+.. code-block:: xml
+
+  <output file="test.h" type="header">
+  </output>
+  <output file="HCR.DAT" type="hcr" version="1">
+  </output>
+
+include
+^^^^^^^
+Include element can be used to include content of other HCRML files. The purpose is mainly to allow
+inclusion of categories and settings inside the output section. It allows wildcards to enable inclusion of
+multiple HCRML files with single line, or the inclusion of all existing HCRML files.
+
+**Attributes**
+
+  * *ref* - The pattern for including files
+
+**Examples**
+
+.. code-block:: xml
+  
+  <include ref="foo.hcrml">
+  <include ref="bar.hcrml">
+  <include ref="my*.hcrml">
+
+Creating an HCRML configuration file
+------------------------------------
+
+The HCRML format is designed for two purposes. To allow definition of components specific binding 
+between confml settings and Hardware configuration repository keys  and to create/generate a C++ type 
+header file from HCR key definition file. Secondly to allow creation/generation of Hardware 
+configuration repository output file from multiple developer/component specific HCRML files.
+
+The normal lifecycle of these implementation files is described in below.
+ 
+  1. Create/define the components configuration interface with confml
+  2. Create/define the needed hcr keys and the binding between confml features.
+  3. Generate the C++ header for the component from the configuration project
+    
+    * e.g. ``cone generate`` (in the conf folder)
+    
+  4. Export/merge the component configuration as part of global configuration 
+    
+    * e.g.  ``cone merge -r . -p /epoc32/rom/config_project/hcr`` (in the conf folder)
+ 
+  .. image:: hcrml_developer_project.png
+
+  5. Define hcrml for hcr.dat generation. (Should be eventually in the same hcr layer inside the configuration project)
+  6. Generate the HCR.DAT
+    
+    * e.g.  ``cone generate -p /epoc32/rom/config_project/hcr``
+
+  .. image:: hcrml_global_project.png
+
+Examples
+--------
+
+**HCRML file example**
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+    <output file="example.h" type="header">
+      <category name="KCatGPIO" uid="0x10001234">
+        <setting ref="hcrexample.DebounceInterval" name="KElmGPIO_DebounceInterval" type="int32" id="0"/>
+        <setting ref="hcrexample.GPIO_1" name="KElmGPIO_1" type="int32" id="1" comment="Pin1"/>
+        <setting ref="hcrexample.GPIO_2" name="KElmGPIO_2" type="int32" id="2" comment="Pin2"/>
+      </category>
+    </output>
+    </hcr>
+
+**Explanation**
+
+The above HCRML file defines three settings's under category KCatGPIO, which has the UID 0x10001234. Each 
+setting must have a unique ID inside the category. And each setting must define ref that points to a confml 
+setting. The data value of that particular key is fetched from that confml reference. The name element
+in the category and settings can be used to generate the C header file from the HCRML.
+
+A output element encapsulates the setting definitions in this file. It is not necessary, but it enables
+that example.h header file can be generated from this component specific HCRML file. 
+
+**HCR repository file example**
+
+.. code-block:: xml
+
+    <?xml version="1.0" encoding="UTF-8"?>
+    <hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+      <output file="HCR.DAT" type="hcr" version="1" readOnly="1">
+        <include ref="*.hcrml">
+      </output>
+    </hcr>
+
+**Explanation**
+
+The above HCRML entry would define a HCR binary output file HCR.DAT with version 1 and readonly bit true. 
+The file generation will try to include all .hcrml ending files from the configuration project. 
+The include statement will just look for any matching file and include its content inside this file. If the 
+included hcrml files include an output section, they are simple ingored and only the topmost output 
+file will be generated.
+
+The output file section will in the end contain all categories and keys of all HCRML files. 
+These files would normally be the files which are exported to the configuration project from several 
+component configurations.
+
+Downloadable example
+--------------------
+
+Download: :download:`hcrml_example.zip`
+
+This example contains a mock developer project like shown earlier. It has
+a ``conf/`` directory containing the ConfML and HCRML files, and (empty) ``inc/``,
+``src/`` and ``group/`` directories. The important part is the ``conf/`` directory, which
+contains the following files:
+
+- ``confml/hcr_component1.confml`` - ConfML interface for the HCR settings
+- ``implml/component1.hcrml`` - HCRML file defining the binding between the ConfML settings and the HCR settings
+- ``implml/hcr_dat.hcrml`` - HCRML file for generating ``hcr.dat``
+- ``implml/hcr_keys.hcrml`` - HCRML file for generating ``hcr_keys.h``
+- ``root.confml`` - Needed for generation to work; contains a link to ``confml/hcr_component1.confml``
+
+To generate, cd to ``component1/conf/`` and run::
+
+  cone generate
+
+This will generate an ``output/`` directory with the files ``hcr.dat`` and ``hcr_keys.h``.
+
+Linking between ConfML/HCRML/output
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+Here the linking between ConfML/HCRML/output is shown using the binary data
+setting. Irrelevant parts of the files are omitted for clarity.
+
+**ConfML:**
+
+.. code-block:: xml
+
+    <feature ref="HcrComponent1" name="HCR test component 1">
+        ...
+        <setting ref="BinDataSetting" name="Binary data setting" type="string"/>
+        ...
+    </feature>
+    ...
+    <data>
+        <HcrComponent1>
+            ...
+            <BinDataSetting>00112233 DEADBEEF CAFE 50</BinDataSetting>
+            ...
+        </HcrComponent1>
+    </data>
+
+**HCRML:**
+
+.. code-block:: xml
+
+    <category name="KHcrComponent1" uid="0x00000001">
+        ...
+        <setting ref="HcrComponent1.BinDataSetting" name="KBinDataSetting" type="bindata" id="5" comment="Binary data setting"/>
+        ...
+    </category>
+
+**Output - hcr.dat:**
+
+.. image:: hcr_dat.png
+
+
+**Output - hcr_keys.h:**
+
+.. code-block:: c++
+
+    #ifndef HCR_KEYS_H
+    #define HCR_KEYS_H
+
+    #include <hcr.h>
+
+    const HCR::TCategoryUid KHcrComponent1 = 0x00000001;
+
+    ...
+    
+    // Binary data setting
+    const HCR::TElementId KBinDataSetting    = 0x00000005;
+
+    #endif
+
+XSD
+---
+
+Download: :download:`hcrml.xsd </xsd/hcrml.xsd>`
+
+FAQ
+---
+
+This will be updated based on the questions.
+
Binary file configurationengine/doc/plugins/hcrml-plugin/hcrml_developer_project.png has changed
Binary file configurationengine/doc/plugins/hcrml-plugin/hcrml_elements.jpg has changed
Binary file configurationengine/doc/plugins/hcrml-plugin/hcrml_example.zip has changed
Binary file configurationengine/doc/plugins/hcrml-plugin/hcrml_global_project.png has changed
Binary file configurationengine/doc/plugins/implml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/index.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,44 @@
+ConE plug-ins
+=============
+
+General
+-------
+
+.. toctree::
+    :maxdepth: 3
+    
+    general
+    plugin-dir-structure
+
+Existing ConE plug-ins
+----------------------
+
+**Common plugins:**
+
+.. toctree::
+    :maxdepth: 1
+
+    contentml-plugin/content
+    commandml-plugin/commandml
+    ruleml-plugin/ruleplugin
+    templateml-plugin/templatemlplugin
+
+
+**Symbian specific plug-ins:**
+
+.. toctree::
+    :maxdepth: 1
+
+    crml-plugin/crmlplugin
+    genconfml-plugin/genconfmlplugin
+    hcrml-plugin/hcrml-plugin
+    convertprojectplugin
+    thememl-plugin/themelplugin
+
+ConE plug-in development
+------------------------
+
+.. toctree::
+    :maxdepth: 2
+    
+    dev-plugin/index
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/plugin-dir-structure.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,66 @@
+Plug-in directory structure
+===========================
+
+ConE plug-ins are divided into plug-in "packages", which enables a ConE
+distribution to be built with a specific set of installed plug-ins. There is a ``common``
+package that contains the default plug-ins that are always present in a ConE installation,
+and any other plug-in package provides extra plug-ins in addition to these.
+
+For example, one might build a 'vanilla' ConE distribution which contains only the
+core ConE components and common plug-ins, or a 'symbian' distribution which contains
+those as well as all Symbian-specific plug-ins.
+
+The plug-in packages are simply sub-directories of ``source/plugins``. For example, the
+following shows the current plug-in packages:
+
+  .. image:: plugins-dir.png
+
+As can be seen, there are three plug-in packages (``common``, ``example`` and ``symbian``)
+and several utility Python files.
+
+Package directory structure
+---------------------------
+
+Each plug-in package contains the sources of all plug-ins, an optional integration test set,
+and a Python script to run all test cases related to the plug-in package. For example, the
+following shows the contents of the ``common`` plug-in package:
+
+  .. image:: plugins-common-dir.png
+
+The naming of the sub-directories is important:
+
+- Directories with a name of the form ``Cone*Plugin`` are considered to be plug-in sources
+- If a directory with the name ``integration-test`` exists, it is expected to contain a
+  ``runtests.py`` file that runs the integration tests
+
+Plug-in source directory structure
+----------------------------------
+
+A plug-in source directory is expected to contain two things:
+
+- A single Python module that contains the plug-in sources
+- ``setup.py`` for packaging the plug-in into an egg (``setup.cfg`` and ``makefile`` are related to this)
+
+The following shows the contents of the command plug-in directory in the common package:
+
+  .. image:: plugins-common-commandplugin-dir.png
+
+For an example with more complete descriptions see
+:ref:`here <plugin-howto-example-plugin-dir-structure>`.
+
+Integration test directory structure
+------------------------------------
+
+In addition to a collection of plug-in sources a plug-in package directory may contain an
+``integration-test`` directory. This directory is supposed to contain integration tests
+for the plug-ins by running actions (e.g. generate) using the ConE CLI to test that the plug-ins
+work correctly from the topmost level.
+
+File naming matters here too:
+
+- Files of the form ``unittest_*.py`` are expected to contain the test cases
+- If a file named ``export_standalone.py`` exists, it is expected to contain a function that
+  exports any needed extra data when exporting the integration tests into a standalone test set.
+
+For an example with more complete descriptions see
+:ref:`here <plugin-howto-example-plugin-integration-tests`.
\ No newline at end of file
Binary file configurationengine/doc/plugins/plugin_generate.gif has changed
Binary file configurationengine/doc/plugins/plugins-common-commandplugin-dir.png has changed
Binary file configurationengine/doc/plugins/plugins-common-dir.png has changed
Binary file configurationengine/doc/plugins/plugins-dir.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/plugins.uml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9013 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<XPD:PROJECT xmlns:XPD="http://www.staruml.com" version="1">
+<XPD:HEADER>
+<XPD:SUBUNITS>
+</XPD:SUBUNITS>
+<XPD:PROFILES>
+<XPD:PROFILE>UMLStandard</XPD:PROFILE>
+</XPD:PROFILES>
+</XPD:HEADER>
+<XPD:BODY>
+<XPD:OBJ name="DocumentElement" type="UMLProject" guid="7KBTiD3bXUedYhpH6MqM/gAA">
+<XPD:ATTR name="Title" type="string">Untitled</XPD:ATTR>
+<XPD:ATTR name="#OwnedElements" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLModel" guid="WkThTKLQekywYrWHRVBmjgAA">
+<XPD:ATTR name="Name" type="string">Use Case Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">useCaseModel</XPD:ATTR>
+<XPD:REF name="Namespace">7KBTiD3bXUedYhpH6MqM/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLUseCaseDiagram" guid="shed/+eO2EaotQS3PS0jUgAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:REF name="DiagramOwner">WkThTKLQekywYrWHRVBmjgAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLUseCaseDiagramView" guid="Hv12tsqdrEGO3crXPIIi6wAA">
+<XPD:REF name="Diagram">shed/+eO2EaotQS3PS0jUgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLModel" guid="sJP9kFOv5Ua3TZXoe2x73AAA">
+<XPD:ATTR name="Name" type="string">Analysis Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">analysisModel</XPD:ATTR>
+<XPD:REF name="Namespace">7KBTiD3bXUedYhpH6MqM/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="TnUGBj9QCEm+WrEkTnMNfgAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
+<XPD:ATTR name="DiagramType" type="string">RobustnessDiagram</XPD:ATTR>
+<XPD:REF name="DiagramOwner">sJP9kFOv5Ua3TZXoe2x73AAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="CAHZRgXjf0ur3ZFEuQfqLAAA">
+<XPD:REF name="Diagram">TnUGBj9QCEm+WrEkTnMNfgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLModel" guid="8/PDgZYaSkyhn9djg2OS7wAA">
+<XPD:ATTR name="Name" type="string">Design Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">designModel</XPD:ATTR>
+<XPD:REF name="Namespace">7KBTiD3bXUedYhpH6MqM/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="KeZ6ndZ6HEapeG6MtHJMZgAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:ATTR name="DefaultDiagram" type="boolean">True</XPD:ATTR>
+<XPD:REF name="DiagramOwner">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="Bh8InIKxt0yBi5AY1dv4nwAA">
+<XPD:REF name="Diagram">KeZ6ndZ6HEapeG6MtHJMZgAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLInterfaceView" guid="4mngVqbP4Ea7+EC/9bKjCgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">416</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkIcon</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="L3xAp2wMWEql1jbmFscy9gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Bkk2MOH7o0uxUKD4G5M71wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">implbase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="na/YMBoRl0O3Gt6+WdTn6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="9ndIFAO2G0aBnV9fKCfw2wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="VWp/rJMg2kOLFXwFg0J96gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="jKpvSZoHtkq5hgIRvjK8eAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">38</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLAssociation" guid="VBvmUm8cYUO9N+N5odPPwgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xZ3+dsZIfEiC43OHIp6HbwAA</XPD:REF>
+<XPD:REF name="Views[1]">OwFBa/th9Uy8Lm8eq4Aj4QAA</XPD:REF>
+<XPD:REF name="Views[2]">c27YkTyoM0aKzvAZCm2iIgAA</XPD:REF>
+<XPD:REF name="Views[3]">FQhWGDczYUyEyHgdkNc//gAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="atPDiS9SkUuVO8zUd1za/gAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+<XPD:REF name="Participant">1UxBGcFK3EKPBFhSfrqD/gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">0fKpEItNIEyLVHn22yCbcgAA</XPD:REF>
+<XPD:REF name="Views[1]">I/O9qvaRCkm2U9iU87kcegAA</XPD:REF>
+<XPD:REF name="Views[2]">Kr274H6cB0uV7Jh3zEPCDwAA</XPD:REF>
+<XPD:REF name="Views[3]">w8cW1VW7NEGh84PNhZoIKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="3BfCAZv/iUS90Qjw30LrDwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+<XPD:REF name="Participant">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Tl6bZUBecES9Wf3QPI+W5gAA</XPD:REF>
+<XPD:REF name="Views[1]">yZdaFpAs4U2WLaLyYzu4BAAA</XPD:REF>
+<XPD:REF name="Views[2]">oveJexj1FUaO2/ZC0Yr20QAA</XPD:REF>
+<XPD:REF name="Views[3]">ITJeMH8P+UGCKmh0E0oV+AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLAssociation" guid="Xyq6xieNl0Cn5MPsr7wH4gAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">FJnWa3Qkd0Oa/L/Bnos5PwAA</XPD:REF>
+<XPD:REF name="Views[1]">dtfpOxLsxEi76MixqvFxeAAA</XPD:REF>
+<XPD:REF name="Views[2]">FNV9oBeYnEq1AKz4TK157QAA</XPD:REF>
+<XPD:REF name="Views[3]">kskyU4LPAkeYLLAIBSQDqwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="b2WodVCgbkarRKGvRfujywAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+<XPD:REF name="Participant">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">2E5HCfk9rUGK4qKkKTmuCAAA</XPD:REF>
+<XPD:REF name="Views[1]">LMSNfK4lCEuMmi3UVWkLUQAA</XPD:REF>
+<XPD:REF name="Views[2]">Xhy7Xm7Jy0eG8KMLyL+ItAAA</XPD:REF>
+<XPD:REF name="Views[3]">DMDmkcKWpE64qvIf5u0vsAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="17kbByDKYUyZ+m2wpPWaxgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+<XPD:REF name="Participant">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">PwBGm+gLokmVo1vE9urRjgAA</XPD:REF>
+<XPD:REF name="Views[1]">nhGgwZkUGUijmCSxNabUfwAA</XPD:REF>
+<XPD:REF name="Views[2]">D3w6jbaif0yLYBhIM21JzQAA</XPD:REF>
+<XPD:REF name="Views[3]">h8N5Cnk8mU+N53/yc4WifgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="bgc8Y2rnekGMLllh30J1OQAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">33uAhI5hLUWb7Axy/eyXZgAA</XPD:REF>
+<XPD:REF name="Views[1]">tUMOJDDxLUqqomPTayLrUQAA</XPD:REF>
+<XPD:REF name="Views[2]">mm+t0pMG20KB7AwHTHzjWAAA</XPD:REF>
+<XPD:REF name="Views[3]">/vtG/tvzPk2y2gPniiYPgQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Q4SS4jSQ20i54ioZw+85jQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+<XPD:REF name="Participant">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">q5R3azzdLEq9J9i5gPI0DAAA</XPD:REF>
+<XPD:REF name="Views[1]">LS3AvKHSa02HeWvrF4I0owAA</XPD:REF>
+<XPD:REF name="Views[2]">2yewimL/dk6m6bpFnRan+gAA</XPD:REF>
+<XPD:REF name="Views[3]">hxIjQHEETUihPyBoroARPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="aULbbut4DECnPwmgTtTx2gAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3o8m9AMXSEyj9NuoG48g6AAA</XPD:REF>
+<XPD:REF name="Views[1]">cqEDZ6uFDU+d99Mg4pdsRQAA</XPD:REF>
+<XPD:REF name="Views[2]">4U3CJtdrSE6v0RtK8cfbmQAA</XPD:REF>
+<XPD:REF name="Views[3]">DiasEUayJkiGpAbs8CCj1wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLAssociation" guid="xX7RE0ASlkOrRf9dOxH/zgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">uIDgNBc5UU+LdBtKBxIR8gAA</XPD:REF>
+<XPD:REF name="Views[1]">5tUhqIYIyU27VWbzjNQiKQAA</XPD:REF>
+<XPD:REF name="Views[2]">5ppftDIPjUa6ZqVDeohPAAAA</XPD:REF>
+<XPD:REF name="Views[3]">ihvFb0GsjkS5/O+Kun9vxwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="mWEP+8jbjE24hKhlVCG8uQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+<XPD:REF name="Participant">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xpUbJo+EfEeDXJwxUI0rCAAA</XPD:REF>
+<XPD:REF name="Views[1]">biEwgK/6UUeESLm1DAHiPwAA</XPD:REF>
+<XPD:REF name="Views[2]">pJdulqbefkGnbq1iXskheQAA</XPD:REF>
+<XPD:REF name="Views[3]">4e3r4Vq+7Uu1V8jh7OyJKgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="eXkeLjSvuU6MRxUlhWndcAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3lI3E9NaG0ecYhVlRZfMOgAA</XPD:REF>
+<XPD:REF name="Views[1]">rMu4spxAdUKJKBpc2tyrNgAA</XPD:REF>
+<XPD:REF name="Views[2]">Lkjawm3/i0GjCA4UEjTVWAAA</XPD:REF>
+<XPD:REF name="Views[3]">08M182NXqUCM9djSdJom9wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="IbSrQHThPkm7336xQuEr9QAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="/8Anp5uSOUG7NmHhFk/nrAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">IbSrQHThPkm7336xQuEr9QAA</XPD:REF>
+<XPD:REF name="Participant">dQcGnfO8tUKc0D+z/TWjpgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="SGqBWylq6kqsO+xgQtMRGQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">IbSrQHThPkm7336xQuEr9QAA</XPD:REF>
+<XPD:REF name="Participant">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="YMOEI4D3GUKNGWbGDKOzZAAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="YjWzlZsOqEqUJsdVQD/XAgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">YMOEI4D3GUKNGWbGDKOzZAAA</XPD:REF>
+<XPD:REF name="Participant">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="2S195WIy+0Syn1xEV2jn8AAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">YMOEI4D3GUKNGWbGDKOzZAAA</XPD:REF>
+<XPD:REF name="Participant">dQcGnfO8tUKc0D+z/TWjpgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="jYjMEcDtz0aFEBPfn7j7/QAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">XcB/Q/sATESweCaW2t4wnQAA</XPD:REF>
+<XPD:REF name="Views[1]">zKxSi5pvBEyo9pokzGV0nQAA</XPD:REF>
+<XPD:REF name="Views[2]">a092OvmkWkKcH0d8lorXkwAA</XPD:REF>
+<XPD:REF name="Views[3]">UBRCnMpUxUapUxmOYMTPhQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Oz+BmuTcoUOLIBa7KS6DCQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+<XPD:REF name="Participant">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vwbK1pbOv02FS5I6Zmus5wAA</XPD:REF>
+<XPD:REF name="Views[1]">2QeJVqdXo06b+P8rEGtegwAA</XPD:REF>
+<XPD:REF name="Views[2]">k90lw606mEK4db48UMuY/wAA</XPD:REF>
+<XPD:REF name="Views[3]">+yXh9uY7k0iik/y2BVB3FwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="rXN+Z0guxUy+Rz7TPELWrwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+<XPD:REF name="Participant">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">suPFDNWV3UOb/+M8fH7y7wAA</XPD:REF>
+<XPD:REF name="Views[1]">A66naIO5mkenjssIQuWtVAAA</XPD:REF>
+<XPD:REF name="Views[2]">12LM0klzFkWFjNfvokdKGAAA</XPD:REF>
+<XPD:REF name="Views[3]">r9b1icqUYUC8D2R1+xz7cgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="FMFT2mNP8kuBwaPLNS+zWQAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">WGg3rakepkWtBAqoWP44ywAA</XPD:REF>
+<XPD:REF name="Views[1]">mQmYEEnXuUmEJj4piUmHowAA</XPD:REF>
+<XPD:REF name="Views[2]">0G5mlrJr+Eiv4dfimQXojQAA</XPD:REF>
+<XPD:REF name="Views[3]">YdgBHEDo8UG0pehkXHibOQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="nckaYJRIc0C6lCvSiTPB3gAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+<XPD:REF name="Participant">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tIFm2Q+KGkizuJZ9/6nexQAA</XPD:REF>
+<XPD:REF name="Views[1]">x2Fh6dvb0kCt53+FJQOT0wAA</XPD:REF>
+<XPD:REF name="Views[2]">TChX1hF8602JC7MGrLA/IgAA</XPD:REF>
+<XPD:REF name="Views[3]">XoROrupIIkugkyX8kIWoQQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="lKnU1zst3E2NB7kzxoZgugAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+<XPD:REF name="Participant">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oRXm+3xyXUquxxvMBCrX6AAA</XPD:REF>
+<XPD:REF name="Views[1]">JIbveD8ApUyCkEPBOuSwDAAA</XPD:REF>
+<XPD:REF name="Views[2]">ydX7TsoJQUilkCbPAMy/jQAA</XPD:REF>
+<XPD:REF name="Views[3]">z+rUEoZdm0KObqQEeWkbsgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="NNofZFXapkSUSlwtLNERUAAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="1b5HAClRfUyRCPe52Vr/SgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">NNofZFXapkSUSlwtLNERUAAA</XPD:REF>
+<XPD:REF name="Participant">uLUfupUhTEy2wLImcq6rhwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="icqPwTtyj0mQrj/C6I39GgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">NNofZFXapkSUSlwtLNERUAAA</XPD:REF>
+<XPD:REF name="Participant">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLAssociation" guid="WyvGK0t/hESPxIXfgMmsXwAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">0hyPJ79WpEGOk+EFfFMj8AAA</XPD:REF>
+<XPD:REF name="Views[1]">5LQZ7vYPHUGto5ewngofEwAA</XPD:REF>
+<XPD:REF name="Views[2]">qbCamC1EF0uQywm8EGy8bgAA</XPD:REF>
+<XPD:REF name="Views[3]">biqXKjM3Ek2ivOQJQZO+FAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="3UfPK4/xyES+AyWGHmWJsQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+<XPD:REF name="Participant">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">eOlKymCtCkOGx1KgXpsgwwAA</XPD:REF>
+<XPD:REF name="Views[1]">5tHt4ItsCkGUkVfd4UdrPAAA</XPD:REF>
+<XPD:REF name="Views[2]">Q8U3oLdrLE2F5AtQ/C0DhwAA</XPD:REF>
+<XPD:REF name="Views[3]">P/plYL/fbUCLyPvAe8Xb5gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="UXpHqpXWWkWaXmnhdMf/GwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+<XPD:REF name="Participant">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ClejYgSmD0ecLH4SuH7/IQAA</XPD:REF>
+<XPD:REF name="Views[1]">AAcCsmN/PUOAeQ94dDuc2wAA</XPD:REF>
+<XPD:REF name="Views[2]">vUgzL99dqU62JX+eWE/+swAA</XPD:REF>
+<XPD:REF name="Views[3]">G72vhO67tU+FvKsr+wbwvQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="TBMgXpKOvkqNYUoAAwF/kwAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">IFsLjjiZFUWiemuBScOPdwAA</XPD:REF>
+<XPD:REF name="Views[1]">SfPmx9VC40y36maowqYE9gAA</XPD:REF>
+<XPD:REF name="Views[2]">dCfwLT1Mi0uQiki30jg58wAA</XPD:REF>
+<XPD:REF name="Views[3]">+mZMtPs3FE+Yp7qmfXT6kgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Lezmq5MfFEew6znmWvrvMAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+<XPD:REF name="Participant">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VN6jbvdN0Eq5Z75i5FutKwAA</XPD:REF>
+<XPD:REF name="Views[1]">p7x2bZh4P0+r2gl85iTL9QAA</XPD:REF>
+<XPD:REF name="Views[2]">UOl1s6w3qkeExTCMQmUejQAA</XPD:REF>
+<XPD:REF name="Views[3]">WhbvRyIYoEaZg82e7bNmQgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KX2YnwUuo0G17Q+mXzzS2wAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+<XPD:REF name="Participant">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Hrwon9AU20KBrLenzKCCJAAA</XPD:REF>
+<XPD:REF name="Views[1]">NCx8+BohkkG8/3vayHPzUAAA</XPD:REF>
+<XPD:REF name="Views[2]">Q15G0gVK50GhgDMyeL+n1AAA</XPD:REF>
+<XPD:REF name="Views[3]">0TMEEeywLE24hl+z2wKOtgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="DrVKQ3pWaUi+uJD9jDo4mgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cAti98LcSkS2mT0tBmFgXgAA</XPD:REF>
+<XPD:REF name="Views[1]">DOUQLueVh06YyWL/PD21nwAA</XPD:REF>
+<XPD:REF name="Views[2]">Cd7piLNWA0mAgjvLVavXTQAA</XPD:REF>
+<XPD:REF name="Views[3]">0JpGkmClT0Gn2KUgtQJ5wwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="HJqngn7i40G7I2drQ2M13AAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+<XPD:REF name="Participant">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">GrW/KPjagUOkA4kik0jnwwAA</XPD:REF>
+<XPD:REF name="Views[1]">qxpRLqGUHUmujCT8CFiwTwAA</XPD:REF>
+<XPD:REF name="Views[2]">iDS4D4p3wkGquvQu6b4BvQAA</XPD:REF>
+<XPD:REF name="Views[3]">4VhMNvKIzESZo+RC2OQ22wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="8TqXpAmOBEiEDJ5OcyQ/XQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+<XPD:REF name="Participant">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">U6af9iwY4Euj7+Pv6jQMxwAA</XPD:REF>
+<XPD:REF name="Views[1]">FMoH3AVUskuTFAsg+/zS/gAA</XPD:REF>
+<XPD:REF name="Views[2]">ymveNro9J0SmVCAIbKxYnAAA</XPD:REF>
+<XPD:REF name="Views[3]">Tpaf2aSuWUmwb+CW46meEQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="+L/IOS7xU0CZQGaUuRo79wAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">8EckyC2TmUuarEhp8FAySAAA</XPD:REF>
+<XPD:REF name="Views[1]">2FPQ4Xkcy0azGg7GBNt9rwAA</XPD:REF>
+<XPD:REF name="Views[2]">tsmfINAYAUq57iBKodP1fAAA</XPD:REF>
+<XPD:REF name="Views[3]">XkyBeCmDf0S5CQ6ztHMNzgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="zJtttkdoP0Sbxkekv0oDkgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+<XPD:REF name="Participant">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">pBqxLpNTIUu8G++vWA2aJQAA</XPD:REF>
+<XPD:REF name="Views[1]">oDEdcF7BgEWVG/UO54xulQAA</XPD:REF>
+<XPD:REF name="Views[2]">2jWAWOd/pUKdHuoh2Uwv5wAA</XPD:REF>
+<XPD:REF name="Views[3]">VkFvWYP1FE+NB1AVf3BRZwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Bb0khctAz0uZw09KLQlAkgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+<XPD:REF name="Participant">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JLwEQ+OnK0K81MYE0IwDxAAA</XPD:REF>
+<XPD:REF name="Views[1]">nn2UiGiRDE2R4H3exI7h6gAA</XPD:REF>
+<XPD:REF name="Views[2]">ZwdNiLLuVkW5ypkoJbamnwAA</XPD:REF>
+<XPD:REF name="Views[3]">0IN6dhUTmkO5BJJ0HuunmQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLAssociation" guid="o4nt6mUd0E+mlHL56Zp/egAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">keuqwZ/b70O9JGtNWC1HOwAA</XPD:REF>
+<XPD:REF name="Views[1]">TXT7PT01rUK8hWWcouQrqwAA</XPD:REF>
+<XPD:REF name="Views[2]">p/xzX/wsJE2iH2iQKBfV6gAA</XPD:REF>
+<XPD:REF name="Views[3]">bvte2UT4Hk2L6XiA6IW1oQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="KGcKEMkgh0aSl/cfRzrdIAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+<XPD:REF name="Participant">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lXiXD4C2AU6b5a6EbgVIpQAA</XPD:REF>
+<XPD:REF name="Views[1]">lDGnXZzhbk67kSR0WhJW2QAA</XPD:REF>
+<XPD:REF name="Views[2]">hsqzdQmMWEKu8ifaCZqRSAAA</XPD:REF>
+<XPD:REF name="Views[3]">x2L2vrEHJU6bLG6YvmN+BgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="i4KhAL0Fx02s74Y8MHfVngAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+<XPD:REF name="Participant">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">OaKExY1aI02AMjQkxCLysQAA</XPD:REF>
+<XPD:REF name="Views[1]">SB9KA5RQakKw8yg9PurfsgAA</XPD:REF>
+<XPD:REF name="Views[2]">3FruEk6P60eJZ2yGPgdfqAAA</XPD:REF>
+<XPD:REF name="Views[3]">imNjlVqaKke7tf3SjnP19AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="T6dZEmqJBk+JCBjNk+rKTgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Oyz3g+Eb+0aLBMMP2OdnywAA</XPD:REF>
+<XPD:REF name="Views[1]">nALUx2T9Ek2OwwszSpQDZQAA</XPD:REF>
+<XPD:REF name="Views[2]">1AfqmcpjFUqxPQk69aW+XgAA</XPD:REF>
+<XPD:REF name="Views[3]">2gKd+sQZT0yFRQh0A9mb5AAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="iLAuQHEQv06jzD7kiYoXuAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+<XPD:REF name="Participant">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QufHXsbWl0WSow4YCLlr3QAA</XPD:REF>
+<XPD:REF name="Views[1]">0jizQRMG7kGF2Ihk78xtLQAA</XPD:REF>
+<XPD:REF name="Views[2]">8o0CenYCKkm2TwPtqznYVgAA</XPD:REF>
+<XPD:REF name="Views[3]">26SPYXaf9kyQmuPCOLhxZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="IlupvcREqU63XTFypXGQ7gAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+<XPD:REF name="Participant">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">p08f/TURiUuXtccGxGI10gAA</XPD:REF>
+<XPD:REF name="Views[1]">U8VyjCE1+ESpHThR6j5jeQAA</XPD:REF>
+<XPD:REF name="Views[2]">EcM/X/O720i4uubgSZgh8gAA</XPD:REF>
+<XPD:REF name="Views[3]">XOW7tTTEHUy8X5gRLyzGzQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="bp+wZYcgB06p/FXxYnPeTwAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">NbRVlVzojEy/Lq+DBHs5wAAA</XPD:REF>
+<XPD:REF name="Views[1]">osmqNSG9XUmyM4IO4+pP+AAA</XPD:REF>
+<XPD:REF name="Views[2]">TlF7nqwiKk6+wLo7NlpH9gAA</XPD:REF>
+<XPD:REF name="Views[3]">Q+cxwoveCkeigaspgfX7JgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="HhbIwX8GCEqzk5wgVXMRVwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+<XPD:REF name="Participant">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">W9D4rtyWhUu4LVWN0R18+QAA</XPD:REF>
+<XPD:REF name="Views[1]">tQkf5tlxJEC1xXIkDHKV8QAA</XPD:REF>
+<XPD:REF name="Views[2]">iMaiGEU8WUq24TcEgWNe1gAA</XPD:REF>
+<XPD:REF name="Views[3]">69sDpwOjyUm2y2rmEdZ31gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="GHXyLRfe2keijGBsIZEejAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+<XPD:REF name="Participant">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">M8HJcPL9qk+XCdB9mxXCGwAA</XPD:REF>
+<XPD:REF name="Views[1]">Srn6vi9WtE+f+sBRNq53WgAA</XPD:REF>
+<XPD:REF name="Views[2]">vIvkfgU6eEqHe14QMZtKwAAA</XPD:REF>
+<XPD:REF name="Views[3]">a2Mk9EYtl0CIEogV7Q8rYwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[16]" type="UMLAssociation" guid="kRhs7Db07UCnVGvTeUn8qgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">dLWcwxVERkGRdXFNtBJxSgAA</XPD:REF>
+<XPD:REF name="Views[1]">fi7JFxBqykSKlYSmEXn0YgAA</XPD:REF>
+<XPD:REF name="Views[2]">7rvLfWINwECFyjNqf5+1ugAA</XPD:REF>
+<XPD:REF name="Views[3]">javyJkUdeUGEYWXn5RsElAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="bgAX+775K0+IdCitgl+l0gAA">
+<XPD:ATTR name="Multiplicity" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Association">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+<XPD:REF name="Participant">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zuVp2v+ehEOqKJcMTlKiQAAA</XPD:REF>
+<XPD:REF name="Views[1]">Ubfg9u6qUE2EwVbLux9JcgAA</XPD:REF>
+<XPD:REF name="Views[2]">cPdSWjZ5NEuBpfrIAx3rYAAA</XPD:REF>
+<XPD:REF name="Views[3]">9grqcoX0n0WN2qPf2TC/iwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="pX9DIVuaOEuVu+1aJ6TVBwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+<XPD:REF name="Participant">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">mLfeBa3PtkOo6uvLbzwmWQAA</XPD:REF>
+<XPD:REF name="Views[1]">7w3JfnHZSEiz51HcCeTD0gAA</XPD:REF>
+<XPD:REF name="Views[2]">wEaj9RGukkK91gRZ9BNeowAA</XPD:REF>
+<XPD:REF name="Views[3]">D8eh27iipUigD3DOeweTgwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[17]" type="UMLAssociation" guid="eb3ayVr/ukqo6hvbKDz/swAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">YnexAQXCSEmdRB4mzG2eDAAA</XPD:REF>
+<XPD:REF name="Views[1]">6R2FOEPEREub7zclEMKu7QAA</XPD:REF>
+<XPD:REF name="Views[2]">hvvGcnL/aUG2lUskmWcyVgAA</XPD:REF>
+<XPD:REF name="Views[3]">GahVFnML8U+n3sq4jSuybwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="YPoJAT5z60mJJ/4nlVKgQwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+<XPD:REF name="Participant">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tEA8cl7lHEO8LOt56RhoCQAA</XPD:REF>
+<XPD:REF name="Views[1]">xj10XT1n1UCWgHaZncTTGgAA</XPD:REF>
+<XPD:REF name="Views[2]">5c/P9C3GDU6RvQUbTcNiLgAA</XPD:REF>
+<XPD:REF name="Views[3]">BFna1MLap0Cde8OsO8HmlgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="7c4AqBkyEUiX8qdLBY9+IQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+<XPD:REF name="Participant">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">UuiygYFsvEqjuBpVAK+QYgAA</XPD:REF>
+<XPD:REF name="Views[1]">JZfOJJlwCkSzGpsVbu5l5QAA</XPD:REF>
+<XPD:REF name="Views[2]">3nvXpaiPaEWwGDRUCky1DAAA</XPD:REF>
+<XPD:REF name="Views[3]">vgPoo8+OM02s/JymWoSSHQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[18]" type="UMLAssociation" guid="uqzj6Tgi3UqwZ2fIPCUxxgAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+ajNiZhtfkqr4Ip+H9i7ygAA</XPD:REF>
+<XPD:REF name="Views[1]">xEmIj3vizUyc8IeHzZzehgAA</XPD:REF>
+<XPD:REF name="Views[2]">jm13hIyI3k2LrpIL5e0jNQAA</XPD:REF>
+<XPD:REF name="Views[3]">DMeHYWv+s0agt3t1wzwM1QAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="cma9bSbXZku+M+oWkso1HAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Association">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+<XPD:REF name="Participant">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fKYHJ5cc1k+APkFy8CvvxwAA</XPD:REF>
+<XPD:REF name="Views[1]">FTmXdCOLlk2ky3vVlEbyJgAA</XPD:REF>
+<XPD:REF name="Views[2]">0pZdlegq40ak5db1s7bKkAAA</XPD:REF>
+<XPD:REF name="Views[3]">ZMLXleFVeEmCF/KGwnv8yAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="YCmqDh6mYEC2sMTiRqfJhgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+<XPD:REF name="Participant">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">9ay94DWRiUaWXzZBc+zNCAAA</XPD:REF>
+<XPD:REF name="Views[1]">hBhmpDWP6kyFVSNGduiusAAA</XPD:REF>
+<XPD:REF name="Views[2]">pyk4GBNMuESdYmyhGJB5GAAA</XPD:REF>
+<XPD:REF name="Views[3]">9bNtG1JQOEWudwR9deV29AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[19]" type="UMLAssociation" guid="kXQY/Vx23UC1DCh8F9IRdQAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hwJMwHLkvUG+IsAaCaziqwAA</XPD:REF>
+<XPD:REF name="Views[1]">KYhSQdxF2ESNumBL6XCXSAAA</XPD:REF>
+<XPD:REF name="Views[2]">Avl0Bwz1g0mTxAt22ofQygAA</XPD:REF>
+<XPD:REF name="Views[3]">Cbymk6DX80ezDS9Hc235CwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="eJrRdjRApEijUlwTFcnU6QAA">
+<XPD:ATTR name="Multiplicity" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Association">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+<XPD:REF name="Participant">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">T/ua+KCigE20Gfl/dJ4XrQAA</XPD:REF>
+<XPD:REF name="Views[1]">KrSmFvVFOUK62Gbf5HAMPQAA</XPD:REF>
+<XPD:REF name="Views[2]">qQYS/rwfTke5k4gCNB2yXQAA</XPD:REF>
+<XPD:REF name="Views[3]">/ENNOk7hbESKFw4vl2LbqQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="vvpTBHVSakeBGaqd5bC6mwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+<XPD:REF name="Participant">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/X35LDb+DEiJXnNfVU2rdAAA</XPD:REF>
+<XPD:REF name="Views[1]">vSkSRdqBp0WIvH69UZgUNgAA</XPD:REF>
+<XPD:REF name="Views[2]">U8Asfcm4x0m9eo1mJ54HqwAA</XPD:REF>
+<XPD:REF name="Views[3]">90A2D258u0CKJ56gBl6brgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[20]" type="UMLAssociation" guid="i+idGeRyH0O6Trx2aQWMcwAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+KAZSHjliE20MOigCSjtswAA</XPD:REF>
+<XPD:REF name="Views[1]">sBuc1XPgEEqF7cNlI6g8fAAA</XPD:REF>
+<XPD:REF name="Views[2]">ZdaGtQlOBEyWh+XqTEYoaQAA</XPD:REF>
+<XPD:REF name="Views[3]">3ogUEW08UU6YGhRDKod94gAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="c/1XK8730064TYgqeMtY+wAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+<XPD:REF name="Participant">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cIX+mr93JEG2b8kI8CaJ4QAA</XPD:REF>
+<XPD:REF name="Views[1]">l6EeEQrG0UG3x4QS2FtNnAAA</XPD:REF>
+<XPD:REF name="Views[2]">gc5YwU7ap0uUsjn1ia0pMAAA</XPD:REF>
+<XPD:REF name="Views[3]">HhbrxzkVrUq6n0+QjfKfSAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="RfAdcCNofE+evhlZyty3cgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+<XPD:REF name="Participant">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1H6EHKqhr06EQGdQOXQK7gAA</XPD:REF>
+<XPD:REF name="Views[1]">I9NVsfIvLU+QtoEeKdFiaQAA</XPD:REF>
+<XPD:REF name="Views[2]">61URF7/rmkGbZG9o4j3/8AAA</XPD:REF>
+<XPD:REF name="Views[3]">H3+QpAFFCEqLMC2AZU5STwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[21]" type="UMLAssociation" guid="POwBB4/GAUeNaKKEcJpIlQAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">iN8vizAkO0SdgDkxW75xWQAA</XPD:REF>
+<XPD:REF name="Views[1]">9isiJhLnKEqUzJ0bbm2prgAA</XPD:REF>
+<XPD:REF name="Views[2]">yxDY2j0ycUKvrfzBqyMY+AAA</XPD:REF>
+<XPD:REF name="Views[3]">y2AXYAqQe0iKD6O8s23/HQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="/F1D5wzLBE2wKfdscOPvswAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+<XPD:REF name="Participant">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">gLKU7VT0fkaL49FlQlsFwAAA</XPD:REF>
+<XPD:REF name="Views[1]">N7cRTUq3k0qbJpPo2FrXUQAA</XPD:REF>
+<XPD:REF name="Views[2]">vcTkKyxY4Uy0P3Dn4XpEbAAA</XPD:REF>
+<XPD:REF name="Views[3]">4WLr8c1VmEapx+ZiSHSFVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="ZEDi//IT4ESS+61ttQt0ZQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+<XPD:REF name="Participant">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">sypIgjQeU02cHtbTtCyfDwAA</XPD:REF>
+<XPD:REF name="Views[1]">3lDt7gvTSECW3UteHCcrSQAA</XPD:REF>
+<XPD:REF name="Views[2]">fTGcxOEsP0GMN9kamSHNUgAA</XPD:REF>
+<XPD:REF name="Views[3]">HiOYXtGhm0GbNpW1wzW3EQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[22]" type="UMLAssociation" guid="XTynUTFt8Uum/xg/s19W6wAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QPqO0H5L8k2iFBlLAttNygAA</XPD:REF>
+<XPD:REF name="Views[1]">sTOShnMgm0OduL1pZBjh4gAA</XPD:REF>
+<XPD:REF name="Views[2]">TSykHjiLO0a7eeu56HCWPwAA</XPD:REF>
+<XPD:REF name="Views[3]">6pis0rkULE2W7zVj1mHZ3wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Bbt4Y4RR0E2BTPphWVhB8wAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+<XPD:REF name="Participant">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vHO4Vhf2ZEqlogODaJ10zQAA</XPD:REF>
+<XPD:REF name="Views[1]">lnMqxzb1n0W3K8eG1ArDGAAA</XPD:REF>
+<XPD:REF name="Views[2]">8vT/yzrUvEyljses/cgtrwAA</XPD:REF>
+<XPD:REF name="Views[3]">8OzzVjYwGUC0SFgk3vBufQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="qa409uRzmEiwyt0p27OyagAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+<XPD:REF name="Participant">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">0OMZR1LsXUa8x9hhs4WErQAA</XPD:REF>
+<XPD:REF name="Views[1]">YQyzCDdjXE2DxROvAIO/yQAA</XPD:REF>
+<XPD:REF name="Views[2]">+Fo45RZAe0+nNxFRsmflUwAA</XPD:REF>
+<XPD:REF name="Views[3]">Jq2BMndNmkGdi2gpj8/qxAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[23]" type="UMLAssociation" guid="utDCx5aE6ky22jhkB2Oi7AAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kZ03rRdVdUqEFU4k1XVjqwAA</XPD:REF>
+<XPD:REF name="Views[1]">d8e/my45lEWzg+JM7UUGfgAA</XPD:REF>
+<XPD:REF name="Views[2]">kVXJnrU6U0mpt7I8dWwEbAAA</XPD:REF>
+<XPD:REF name="Views[3]">NRxuhOrTdU+rCPNNNcvayQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="p/U6E0BcgEOzHgIvJgE+vAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+<XPD:REF name="Participant">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xg3N1O01k06cQuUeoPYyFAAA</XPD:REF>
+<XPD:REF name="Views[1]">Rirsu7gAwkOVobuUxPBoBQAA</XPD:REF>
+<XPD:REF name="Views[2]">SFlaKylCX0K2dXnYaZ9F6QAA</XPD:REF>
+<XPD:REF name="Views[3]">HS7Exc2EZUWzFQft84i/CgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="SMaE6mVo9UaeI5aptbrc+gAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+<XPD:REF name="Participant">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">CCY8TbsGgEipJdFhEKtzKwAA</XPD:REF>
+<XPD:REF name="Views[1]">B3jktLZVrECOZAyEBBw+VwAA</XPD:REF>
+<XPD:REF name="Views[2]">4UNUI+77VUyvjrzdLLP2awAA</XPD:REF>
+<XPD:REF name="Views[3]">SebPLgGPaUO+AlHoO+xDeAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[24]" type="UMLAssociation" guid="u0qI6rv6oUOx4Rjd0HaoZQAA">
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">DQB2/Uad90yVchVQBxQShwAA</XPD:REF>
+<XPD:REF name="Views[1]">DREKim22IEGrf/G0tKQIqQAA</XPD:REF>
+<XPD:REF name="Views[2]">N53C04fLC0aGrU+rDwWcMQAA</XPD:REF>
+<XPD:REF name="Views[3]">HF1V+Dt9CkCwImf2IEeIYAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="RPEMUfaL1Umf648f3atFIAAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+<XPD:REF name="Participant">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5EbFltXbuUCDoif+I3WsMgAA</XPD:REF>
+<XPD:REF name="Views[1]">aCxw81qbYECFkyLUWcf7PgAA</XPD:REF>
+<XPD:REF name="Views[2]">s4dnTipnd0SaJY8KGHopsAAA</XPD:REF>
+<XPD:REF name="Views[3]">kHRrm2Bs50OvsCxBiYlR6wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Wbh515voZUSZ+lPync1/wwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+<XPD:REF name="Participant">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+kptnbelkU+0NbAjgOPs7wAA</XPD:REF>
+<XPD:REF name="Views[1]">9n3HLEgujEiyw9t/aAXfRgAA</XPD:REF>
+<XPD:REF name="Views[2]">U5Q0zwneZEacDWw0mTwFMQAA</XPD:REF>
+<XPD:REF name="Views[3]">qVv7yx70k0qkmlT3pxZ1OgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[25]" type="UMLSubsystem" guid="YKLbxJmpOECbtM/emMmnLwAA">
+<XPD:ATTR name="Name" type="string">commandml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="kErI+FlvY0+kAST0Q9l4fQAA">
+<XPD:ATTR name="Name" type="string">commandml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="H86mY08QkkKzP+zqj188YwAA">
+<XPD:REF name="Diagram">kErI+FlvY0+kAST0Q9l4fQAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">12</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="1GuMUA7uD0iOm5T5ALuDEgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">180</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">60</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">116</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="ta7KX7w0wkWadBG10pmevAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="x6GICRRqjEKdtYQsR+4r7QAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">&lt;&lt;commandml&gt;&gt;</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="V55nLnsZzUOahjQJ3oV4WwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eIXQIpyz0kG7y9szdK0LAwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="IZe1/VFei0yx34tqNHrtAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="v4pvulgn+02Tu0tznRmisQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="RPCpiqsOEE28et4OHJfCfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="tlXrSjr3LESaFOwUzCjBrgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">196</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">156</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">98</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="0FuNaJzgPkWzu3XesYcRwQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="wka2oPoA/0+fgxCSYD5PvgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">command</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="bOR6YVxvZUKzDq/lCdHwzAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="EhQNQrH0m06+He5HTw8jtgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="WkqEcfJ0pUm7mEMU2P3boQAA">
+<XPD:REF name="Model">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8YweCFP2lke8H6Qfw5MCggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="y6gW5chxUU6VDNiVkEwsigAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="QPqO0H5L8k2iFBlLAttNygAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">237,156;237,102</XPD:ATTR>
+<XPD:REF name="Model">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+<XPD:REF name="Head">1GuMUA7uD0iOm5T5ALuDEgAA</XPD:REF>
+<XPD:REF name="Tail">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="sTOShnMgm0OduL1pZBjh4gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="TSykHjiLO0a7eeu56HCWPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="6pis0rkULE2W7zVj1mHZ3wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">XTynUTFt8Uum/xg/s19W6wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="0OMZR1LsXUa8x9hhs4WErQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qa409uRzmEiwyt0p27OyagAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="vHO4Vhf2ZEqlogODaJ10zQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Bbt4Y4RR0E2BTPphWVhB8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="+Fo45RZAe0+nNxFRsmflUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qa409uRzmEiwyt0p27OyagAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="8vT/yzrUvEyljses/cgtrwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">Bbt4Y4RR0E2BTPphWVhB8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="YQyzCDdjXE2DxROvAIO/yQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qa409uRzmEiwyt0p27OyagAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="lnMqxzb1n0W3K8eG1ArDGAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Bbt4Y4RR0E2BTPphWVhB8wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Jq2BMndNmkGdi2gpj8/qxAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">qa409uRzmEiwyt0p27OyagAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="8OzzVjYwGUC0SFgk3vBufQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Bbt4Y4RR0E2BTPphWVhB8wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="uNpredncAUiIIb0omn0rSwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">252</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">324</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="68u/vnWx6UKT3Ip20McekQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="GpJD0542aUqzLCSDxwB6CAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">argument</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="BQro+3bTkkKhmY5oFinicAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="wv8zg8qudU+/IhHN97YcEAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="wy5SdbnypUSWFa49XbyErAAA">
+<XPD:REF name="Model">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="c1q8cRvfMEGGd4nOpjRdhQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="nWnK2waRSk2H4fxDwHXxDAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="kZ03rRdVdUqEFU4k1XVjqwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">285,324;255,253</XPD:ATTR>
+<XPD:REF name="Model">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+<XPD:REF name="Head">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:REF name="Tail">uNpredncAUiIIb0omn0rSwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="d8e/my45lEWzg+JM7UUGfgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="kVXJnrU6U0mpt7I8dWwEbAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="NRxuhOrTdU+rCPNNNcvayQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">utDCx5aE6ky22jhkB2Oi7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="CCY8TbsGgEipJdFhEKtzKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SMaE6mVo9UaeI5aptbrc+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="xg3N1O01k06cQuUeoPYyFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">p/U6E0BcgEOzHgIvJgE+vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="4UNUI+77VUyvjrzdLLP2awAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SMaE6mVo9UaeI5aptbrc+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="SFlaKylCX0K2dXnYaZ9F6QAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">p/U6E0BcgEOzHgIvJgE+vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="B3jktLZVrECOZAyEBBw+VwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">SMaE6mVo9UaeI5aptbrc+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Rirsu7gAwkOVobuUxPBoBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">p/U6E0BcgEOzHgIvJgE+vAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="SebPLgGPaUO+AlHoO+xDeAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">SMaE6mVo9UaeI5aptbrc+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HS7Exc2EZUWzFQft84i/CgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">p/U6E0BcgEOzHgIvJgE+vAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="hBnfhqGe60WZZN0uD1pavwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">320</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="7FonuqL8iU+OkA8PtNYZZAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Wd+P7is7F021IkQk5+g2cAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">pipe</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="dVrDXJ3qiEi8cuv2U0yvDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="//FfcNg3/0C9VV+AVGP3+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6kjsjt214kCJQgwfrTIdQgAA">
+<XPD:REF name="Model">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="+4adbxUm/UGfWDLn2PlaRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="JWUUEw/yVE+tLN18ZioF7AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="DQB2/Uad90yVchVQBxQShwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">182,320;213,253</XPD:ATTR>
+<XPD:REF name="Model">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+<XPD:REF name="Head">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:REF name="Tail">hBnfhqGe60WZZN0uD1pavwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="DREKim22IEGrf/G0tKQIqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="N53C04fLC0aGrU+rDwWcMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="HF1V+Dt9CkCwImf2IEeIYAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">u0qI6rv6oUOx4Rjd0HaoZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="+kptnbelkU+0NbAjgOPs7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wbh515voZUSZ+lPync1/wwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="5EbFltXbuUCDoif+I3WsMgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">RPEMUfaL1Umf648f3atFIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="U5Q0zwneZEacDWw0mTwFMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wbh515voZUSZ+lPync1/wwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="s4dnTipnd0SaJY8KGHopsAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">RPEMUfaL1Umf648f3atFIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9n3HLEgujEiyw9t/aAXfRgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wbh515voZUSZ+lPync1/wwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="aCxw81qbYECFkyLUWcf7PgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">RPEMUfaL1Umf648f3atFIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="qVv7yx70k0qkmlT3pxZ1OgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Wbh515voZUSZ+lPync1/wwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="kHRrm2Bs50OvsCxBiYlR6wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">RPEMUfaL1Umf648f3atFIAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="IP1NUwGChEG75rlr5pHxkgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">372</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">180</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">90</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="93Dd37pTZkS8YpkxsLM61gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Fsjorlis4USQCt6eS/PrMAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">condition</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="9u1yaEIZS0+VjisAYpAyrwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="1C4NKJd9fUS9hoqUAOo7SQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="t+jFABKzvEavur/RthEwDQAA">
+<XPD:REF name="Model">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="tlCrqRJl1Eu7/0HHvi6WngAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="9At+9vEGu0mzAlcYiMffQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="uyyviBKGHkqSRS6aa7BK4wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">383,180;268,102</XPD:ATTR>
+<XPD:REF name="Model">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+<XPD:REF name="Head">1GuMUA7uD0iOm5T5ALuDEgAA</XPD:REF>
+<XPD:REF name="Tail">IP1NUwGChEG75rlr5pHxkgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="UbT3thSm+k67bRr7M2hgTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="8vMrS6pgn0+uer1v+x3zzAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ycjaVEk3CUyjMQWq32597AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="P+bdXLOT10KFtrcSuRRgigAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Zov7rrxjQEqiPfV+IkZbBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="294OFrDWR0ixb9mrh5dNHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">m6Z//ASd5UC3bvGU2ZQhpwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="oZ4And/flEua017k7tYAVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Zov7rrxjQEqiPfV+IkZbBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Vc9zKqt0J0KqduwuCwrImAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">m6Z//ASd5UC3bvGU2ZQhpwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="fUhONjwplkOPTcEcyC9xTAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Zov7rrxjQEqiPfV+IkZbBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="4u+ipLslHUqvbj8DnwqrewAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">m6Z//ASd5UC3bvGU2ZQhpwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="XZZIZcptDUG1Ysc3gTOgpgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Zov7rrxjQEqiPfV+IkZbBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="eCKa6YUesU+k6SZcTpOrAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">m6Z//ASd5UC3bvGU2ZQhpwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="fUh8ZlulHkOKNSSfoC/u9QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">275,204;372,204</XPD:ATTR>
+<XPD:REF name="Model">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+<XPD:REF name="Head">IP1NUwGChEG75rlr5pHxkgAA</XPD:REF>
+<XPD:REF name="Tail">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4LTqgr6VQEunDbH5TlBIpQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="V8CWN25/GUiTYlxNYxb86gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ZBirdZVEkE2lnHy6XxtxMgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="KtEaT15WUk6kc85q0D6coAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">r1eec5hmmUOQVpiNC3y6jAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="9AEZMrD4ZEi+Jnx5OTbJ0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zthvNu6Bb0G05kGsMvowkwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="IaP40maAVkiimv02l3ek2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">r1eec5hmmUOQVpiNC3y6jAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="/kWBwEow5k6vEjTEeU9jdAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">zthvNu6Bb0G05kGsMvowkwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="6rO3/106lUO5thZTl5QszQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">r1eec5hmmUOQVpiNC3y6jAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="8V15J2uX306aCe/vidRgggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zthvNu6Bb0G05kGsMvowkwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="0rFgnP20zUmUyDNPt71WjQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">r1eec5hmmUOQVpiNC3y6jAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="D5uB6bDIdk+DH117313X5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zthvNu6Bb0G05kGsMvowkwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="PwZTXFb9vEyu4nNghuE8cgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">384</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">280</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">95</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DeJQVBW8/U+k3h9pHWmMAgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="QDyik0LhGkCTYJ/Nv2YMnQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">filter</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="/XBpbLcp4EeawAj7v9w/rwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="HV5e0B9g2UKgDX3O2j0pqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="cu+t+stSIUSVBOW4WqvaeAAA">
+<XPD:REF name="Model">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ykUMFIlTgUy1VZ6WxQgWewAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="bCVaFurGhU6+GxKC+tOY2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="o3P7d2oa3Emys+undX+SZQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">384,300;275,230</XPD:ATTR>
+<XPD:REF name="Model">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+<XPD:REF name="Head">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:REF name="Tail">PwZTXFb9vEyu4nNghuE8cgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5VTWbxJdP0qBqvVMzfxh4AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/LwAzUP230C36V6pywg4LgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="z6TH02YmpE+CgGH0cTRoEAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ClkdjiDFs0uvnN3NpsfSkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">yi3TdlMWv0yNevDHzJ5umQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="3DCe2Gy2bkuUHfw1Fh4rfAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">it8oL7K2G0OWf9i5jlTy/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="0AhjLJdiQkqVhvsOWkamowAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">yi3TdlMWv0yNevDHzJ5umQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="uD707gJKXUq8+WABGZtABQAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">it8oL7K2G0OWf9i5jlTy/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="n6xMoVQfYE2urz66Qn6oYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">yi3TdlMWv0yNevDHzJ5umQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="gdNR3N6OEUK0UjZdbvGfxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">it8oL7K2G0OWf9i5jlTy/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="BPOh5jgDIE6xIRVZkBLXkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">yi3TdlMWv0yNevDHzJ5umQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="MXQShAklZEWswk8BFwdzmgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">it8oL7K2G0OWf9i5jlTy/AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">9</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="xCbPvrEvREGZaSAQo1zNTQAA">
+<XPD:ATTR name="Name" type="string">&lt;&lt;commandml&gt;&gt;</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1GuMUA7uD0iOm5T5ALuDEgAA</XPD:REF>
+<XPD:REF name="Views[1]">IZe1/VFei0yx34tqNHrtAgAA</XPD:REF>
+<XPD:REF name="Views[2]">v4pvulgn+02Tu0tznRmisQAA</XPD:REF>
+<XPD:REF name="Views[3]">RPCpiqsOEE28et4OHJfCfwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">qa409uRzmEiwyt0p27OyagAA</XPD:REF>
+<XPD:REF name="Associations[1]">Zov7rrxjQEqiPfV+IkZbBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="ThAFaRsy80+bQYf7JAabBwAA">
+<XPD:ATTR name="Name" type="string">command</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tlXrSjr3LESaFOwUzCjBrgAA</XPD:REF>
+<XPD:REF name="Views[1]">WkqEcfJ0pUm7mEMU2P3boQAA</XPD:REF>
+<XPD:REF name="Views[2]">8YweCFP2lke8H6Qfw5MCggAA</XPD:REF>
+<XPD:REF name="Views[3]">y6gW5chxUU6VDNiVkEwsigAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
+<XPD:REF name="Associations[0]">Bbt4Y4RR0E2BTPphWVhB8wAA</XPD:REF>
+<XPD:REF name="Associations[1]">SMaE6mVo9UaeI5aptbrc+gAA</XPD:REF>
+<XPD:REF name="Associations[2]">Wbh515voZUSZ+lPync1/wwAA</XPD:REF>
+<XPD:REF name="Associations[3]">zthvNu6Bb0G05kGsMvowkwAA</XPD:REF>
+<XPD:REF name="Associations[4]">yi3TdlMWv0yNevDHzJ5umQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="5MlfJnQEhEuETT2pGCOoowAA">
+<XPD:ATTR name="Name" type="string">executable</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="HRWIYnltX0ijdiXQffTwGgAA">
+<XPD:ATTR name="Name" type="string">shell</XPD:ATTR>
+<XPD:REF name="Owner">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="5cbJ5dmL8keqZu56O7UTOwAA">
+<XPD:ATTR name="Name" type="string">bufsize</XPD:ATTR>
+<XPD:REF name="Owner">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="L5JntbPgb0eSg8iS3z34qAAA">
+<XPD:ATTR name="Name" type="string">cwd</XPD:ATTR>
+<XPD:REF name="Owner">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="FMUTjbADSkO3SCxmIwKvnAAA">
+<XPD:ATTR name="Name" type="string">env</XPD:ATTR>
+<XPD:REF name="Owner">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="YNCQ6GQz3Ee39yEg7TDrrAAA">
+<XPD:ATTR name="Name" type="string">pipe</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hBnfhqGe60WZZN0uD1pavwAA</XPD:REF>
+<XPD:REF name="Views[1]">6kjsjt214kCJQgwfrTIdQgAA</XPD:REF>
+<XPD:REF name="Views[2]">+4adbxUm/UGfWDLn2PlaRAAA</XPD:REF>
+<XPD:REF name="Views[3]">JWUUEw/yVE+tLN18ZioF7AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">RPEMUfaL1Umf648f3atFIAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="s4uYXAy6Mk2VGNbg6s7bDAAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Eno+gLGPiUS43w1umuR2BgAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">YNCQ6GQz3Ee39yEg7TDrrAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="murMcFQfV0C/t/mMWAPhwAAA">
+<XPD:ATTR name="Name" type="string">argument</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">uNpredncAUiIIb0omn0rSwAA</XPD:REF>
+<XPD:REF name="Views[1]">wy5SdbnypUSWFa49XbyErAAA</XPD:REF>
+<XPD:REF name="Views[2]">c1q8cRvfMEGGd4nOpjRdhQAA</XPD:REF>
+<XPD:REF name="Views[3]">nWnK2waRSk2H4fxDwHXxDAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">p/U6E0BcgEOzHgIvJgE+vAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="NfegHyWXMU+kv8R49MW1PQAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">murMcFQfV0C/t/mMWAPhwAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="4iLeTKCC5U6MSHKinrEQxwAA">
+<XPD:ATTR name="Name" type="string">condition</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">IP1NUwGChEG75rlr5pHxkgAA</XPD:REF>
+<XPD:REF name="Views[1]">t+jFABKzvEavur/RthEwDQAA</XPD:REF>
+<XPD:REF name="Views[2]">tlCrqRJl1Eu7/0HHvi6WngAA</XPD:REF>
+<XPD:REF name="Views[3]">9At+9vEGu0mzAlcYiMffQgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">m6Z//ASd5UC3bvGU2ZQhpwAA</XPD:REF>
+<XPD:REF name="Associations[1]">r1eec5hmmUOQVpiNC3y6jAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="1Aeo7Me6dkyKuqgKYVt56gAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Owner">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="TfyrXyJmbU61xKYCsJzibAAA">
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">uyyviBKGHkqSRS6aa7BK4wAA</XPD:REF>
+<XPD:REF name="Views[1]">UbT3thSm+k67bRr7M2hgTwAA</XPD:REF>
+<XPD:REF name="Views[2]">8vMrS6pgn0+uer1v+x3zzAAA</XPD:REF>
+<XPD:REF name="Views[3]">ycjaVEk3CUyjMQWq32597AAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="m6Z//ASd5UC3bvGU2ZQhpwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+<XPD:REF name="Participant">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">294OFrDWR0ixb9mrh5dNHQAA</XPD:REF>
+<XPD:REF name="Views[1]">Vc9zKqt0J0KqduwuCwrImAAA</XPD:REF>
+<XPD:REF name="Views[2]">4u+ipLslHUqvbj8DnwqrewAA</XPD:REF>
+<XPD:REF name="Views[3]">eCKa6YUesU+k6SZcTpOrAgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Zov7rrxjQEqiPfV+IkZbBgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">TfyrXyJmbU61xKYCsJzibAAA</XPD:REF>
+<XPD:REF name="Participant">xCbPvrEvREGZaSAQo1zNTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">P+bdXLOT10KFtrcSuRRgigAA</XPD:REF>
+<XPD:REF name="Views[1]">oZ4And/flEua017k7tYAVAAA</XPD:REF>
+<XPD:REF name="Views[2]">fUhONjwplkOPTcEcyC9xTAAA</XPD:REF>
+<XPD:REF name="Views[3]">XZZIZcptDUG1Ysc3gTOgpgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="Fo00uYOQDEKWjo+4JES7rAAA">
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fUh8ZlulHkOKNSSfoC/u9QAA</XPD:REF>
+<XPD:REF name="Views[1]">4LTqgr6VQEunDbH5TlBIpQAA</XPD:REF>
+<XPD:REF name="Views[2]">V8CWN25/GUiTYlxNYxb86gAA</XPD:REF>
+<XPD:REF name="Views[3]">ZBirdZVEkE2lnHy6XxtxMgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="zthvNu6Bb0G05kGsMvowkwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+<XPD:REF name="Participant">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">9AEZMrD4ZEi+Jnx5OTbJ0gAA</XPD:REF>
+<XPD:REF name="Views[1]">/kWBwEow5k6vEjTEeU9jdAAA</XPD:REF>
+<XPD:REF name="Views[2]">8V15J2uX306aCe/vidRgggAA</XPD:REF>
+<XPD:REF name="Views[3]">D5uB6bDIdk+DH117313X5QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="r1eec5hmmUOQVpiNC3y6jAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">Fo00uYOQDEKWjo+4JES7rAAA</XPD:REF>
+<XPD:REF name="Participant">4iLeTKCC5U6MSHKinrEQxwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">KtEaT15WUk6kc85q0D6coAAA</XPD:REF>
+<XPD:REF name="Views[1]">IaP40maAVkiimv02l3ek2gAA</XPD:REF>
+<XPD:REF name="Views[2]">6rO3/106lUO5thZTl5QszQAA</XPD:REF>
+<XPD:REF name="Views[3]">0rFgnP20zUmUyDNPt71WjQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="4yP+KZkgKUeDDlNYajqefgAA">
+<XPD:ATTR name="Name" type="string">filter</XPD:ATTR>
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">PwZTXFb9vEyu4nNghuE8cgAA</XPD:REF>
+<XPD:REF name="Views[1]">cu+t+stSIUSVBOW4WqvaeAAA</XPD:REF>
+<XPD:REF name="Views[2]">ykUMFIlTgUy1VZ6WxQgWewAA</XPD:REF>
+<XPD:REF name="Views[3]">bCVaFurGhU6+GxKC+tOY2QAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">it8oL7K2G0OWf9i5jlTy/AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">4</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="u6EVYssSvk6UksR1boxGzQAA">
+<XPD:ATTR name="Name" type="string">severity</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Q2lu7DiveES1NFvt1JDDMQAA">
+<XPD:ATTR name="Name" type="string">condition</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="0Q/CF4deIkO85EQMpDU/awAA">
+<XPD:ATTR name="Name" type="string">input</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="+ZYhHjNqVU6K1pPQJjVwWwAA">
+<XPD:ATTR name="Name" type="string">formatter</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="qFDuzmHTkk24gp7JWgucBwAA">
+<XPD:REF name="Namespace">YKLbxJmpOECbtM/emMmnLwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">o3P7d2oa3Emys+undX+SZQAA</XPD:REF>
+<XPD:REF name="Views[1]">5VTWbxJdP0qBqvVMzfxh4AAA</XPD:REF>
+<XPD:REF name="Views[2]">/LwAzUP230C36V6pywg4LgAA</XPD:REF>
+<XPD:REF name="Views[3]">z6TH02YmpE+CgGH0cTRoEAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="it8oL7K2G0OWf9i5jlTy/AAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+<XPD:REF name="Participant">4yP+KZkgKUeDDlNYajqefgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3DCe2Gy2bkuUHfw1Fh4rfAAA</XPD:REF>
+<XPD:REF name="Views[1]">uD707gJKXUq8+WABGZtABQAA</XPD:REF>
+<XPD:REF name="Views[2]">gdNR3N6OEUK0UjZdbvGfxwAA</XPD:REF>
+<XPD:REF name="Views[3]">MXQShAklZEWswk8BFwdzmgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="yi3TdlMWv0yNevDHzJ5umQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">qFDuzmHTkk24gp7JWgucBwAA</XPD:REF>
+<XPD:REF name="Participant">ThAFaRsy80+bQYf7JAabBwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ClkdjiDFs0uvnN3NpsfSkAAA</XPD:REF>
+<XPD:REF name="Views[1]">0AhjLJdiQkqVhvsOWkamowAA</XPD:REF>
+<XPD:REF name="Views[2]">n6xMoVQfYE2urz66Qn6oYgAA</XPD:REF>
+<XPD:REF name="Views[3]">BPOh5jgDIE6xIRVZkBLXkAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[26]" type="UMLSubsystem" guid="3q8/Gqy8BE6llPh/zkCQ1QAA">
+<XPD:ATTR name="Name" type="string">content2</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="0XBGlaeYa0mhVvT7HmGlpgAA">
+<XPD:ATTR name="Name" type="string">content2</XPD:ATTR>
+<XPD:REF name="DiagramOwner">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="ZwknZ2zdyECLSoMUyqHiGAAA">
+<XPD:REF name="Diagram">0XBGlaeYa0mhVvT7HmGlpgAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">13</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="f8VxW8OVdEC1Ifglf0w3KQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">60</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">110</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">37</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="2b6IkSBkV0av6LHAmjeiLAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="7N0gYGSUCUa1qin+6qTydAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">&lt;&lt;content v.2&gt;&gt;</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="d8vwnbNL00mJ+th/R9iKkwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="MMNoiPtVV0atesOF4Oj7wwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="hM4omv6+BUCtvVAq2IpllQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="p+5FqB0RkEyMyy7HPlGYUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="avpVwwSPMkK8vsB03T7RdgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">qH8EpavZy0uYaWHuDNJMmwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="VqsyvTGqykGXuB4//e+E1QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">132</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">176</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="DDM4O2htdkKXxazBRTJYFgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="4D4DjV9AH0uY5wrMrTJR2AAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">output</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="oy6cNfx9lU+q+xeQ3GdtPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="DzbD4kTsmk2bVxe3bhnTMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="pXZ2T88WYkqqLC3C5J5JGQAA">
+<XPD:REF name="Model">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ogXT3yXsVESLaM9lETp9YgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qlZfSHmkokCz217g75ZeFgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="XcB/Q/sATESweCaW2t4wnQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">172,176;174,96</XPD:ATTR>
+<XPD:REF name="Model">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+<XPD:REF name="Head">f8VxW8OVdEC1Ifglf0w3KQAA</XPD:REF>
+<XPD:REF name="Tail">VqsyvTGqykGXuB4//e+E1QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="zKxSi5pvBEyo9pokzGV0nQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="a092OvmkWkKcH0d8lorXkwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="UBRCnMpUxUapUxmOYMTPhQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">jYjMEcDtz0aFEBPfn7j7/QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="suPFDNWV3UOb/+M8fH7y7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXN+Z0guxUy+Rz7TPELWrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="vwbK1pbOv02FS5I6Zmus5wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Oz+BmuTcoUOLIBa7KS6DCQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="12LM0klzFkWFjNfvokdKGAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXN+Z0guxUy+Rz7TPELWrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="k90lw606mEK4db48UMuY/wAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">Oz+BmuTcoUOLIBa7KS6DCQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="A66naIO5mkenjssIQuWtVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">rXN+Z0guxUy+Rz7TPELWrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="2QeJVqdXo06b+P8rEGtegwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Oz+BmuTcoUOLIBa7KS6DCQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="r9b1icqUYUC8D2R1+xz7cgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">rXN+Z0guxUy+Rz7TPELWrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="+yXh9uY7k0iik/y2BVB3FwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Oz+BmuTcoUOLIBa7KS6DCQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="xIrnHgVLxUm97jUu4dACtAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">200</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">308</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">101</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="jxbbvDMyBEqPYtCuqIVXRwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="PEGFis4dREOjlRiGf6OKSQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">input</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LsztukBOrEWYYkeLEig1OwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="vlwMs92lYUG24nL5GDdvsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FJL7VBgksUqf+mJgiwAJEgAA">
+<XPD:REF name="Model">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="rnfjw1R4i0K4tZwRBQQpZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Fr1gW265/EygPEwH23p21QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="WGg3rakepkWtBAqoWP44ywAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">232,308;194,247</XPD:ATTR>
+<XPD:REF name="Model">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+<XPD:REF name="Head">VqsyvTGqykGXuB4//e+E1QAA</XPD:REF>
+<XPD:REF name="Tail">xIrnHgVLxUm97jUu4dACtAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="mQmYEEnXuUmEJj4piUmHowAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="0G5mlrJr+Eiv4dfimQXojQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="YdgBHEDo8UG0pehkXHibOQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">FMFT2mNP8kuBwaPLNS+zWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="oRXm+3xyXUquxxvMBCrX6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">lKnU1zst3E2NB7kzxoZgugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="tIFm2Q+KGkizuJZ9/6nexQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">nckaYJRIc0C6lCvSiTPB3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ydX7TsoJQUilkCbPAMy/jQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">lKnU1zst3E2NB7kzxoZgugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="TChX1hF8602JC7MGrLA/IgAA">
+<XPD:ATTR name="Alpha" type="real">4.9932447272606</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">13.4536240470737</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">nckaYJRIc0C6lCvSiTPB3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="JIbveD8ApUyCkEPBOuSwDAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">lKnU1zst3E2NB7kzxoZgugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="x2Fh6dvb0kCt53+FJQOT0wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">nckaYJRIc0C6lCvSiTPB3gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="z+rUEoZdm0KObqQEeWkbsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">lKnU1zst3E2NB7kzxoZgugAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="XoROrupIIkugkyX8kIWoQQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1076</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">nckaYJRIc0C6lCvSiTPB3gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="hiEBWGBHwkiFkbHZnmNXjwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">96</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">308</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">87</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="S9i9gjN5UkGT38s3tnfBkQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="KknwOTOXwkCLrc72IbkvogAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">externalinput</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="QLaxmFClzEml8IEsFIJgnQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="aaxC/75TqEu7xh64F3RVqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="a3/Zo5lKO0io0KWOJBoBswAA">
+<XPD:REF name="Model">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="icZ50wwgJEm1Eh73JceQdAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="DdjJBPyuZE+3STMvtDaQLgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="0hyPJ79WpEGOk+EFfFMj8AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">146,308;162,247</XPD:ATTR>
+<XPD:REF name="Model">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+<XPD:REF name="Head">VqsyvTGqykGXuB4//e+E1QAA</XPD:REF>
+<XPD:REF name="Tail">hiEBWGBHwkiFkbHZnmNXjwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5LQZ7vYPHUGto5ewngofEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="qbCamC1EF0uQywm8EGy8bgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="biqXKjM3Ek2ivOQJQZO+FAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WyvGK0t/hESPxIXfgMmsXwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ClejYgSmD0ecLH4SuH7/IQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">UXpHqpXWWkWaXmnhdMf/GwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="eOlKymCtCkOGx1KgXpsgwwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3UfPK4/xyES+AyWGHmWJsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vUgzL99dqU62JX+eWE/+swAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">UXpHqpXWWkWaXmnhdMf/GwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Q8U3oLdrLE2F5AtQ/C0DhwAA">
+<XPD:ATTR name="Alpha" type="real">-5.11361760228685</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15.6524758424985</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">3UfPK4/xyES+AyWGHmWJsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="AAcCsmN/PUOAeQ94dDuc2wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">UXpHqpXWWkWaXmnhdMf/GwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="5tHt4ItsCkGUkVfd4UdrPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3UfPK4/xyES+AyWGHmWJsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="G72vhO67tU+FvKsr+wbwvQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">UXpHqpXWWkWaXmnhdMf/GwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="P/plYL/fbUCLyPvAe8Xb5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">3UfPK4/xyES+AyWGHmWJsQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="Ge7hwnTE00+T03ai+/7E4QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">212</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">428</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="BdAqR1XBbUKfOk9bi/V3EgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="2NPw7EN9j0aKCUh41QBPggAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">include</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="6UljgUgrKE2Dxyg+l1wSzwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="xQvNpqOkPUuTROp3rWgeIgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="7i9IofoLd0SQ8bvL01zEVwAA">
+<XPD:REF name="Model">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="zVMOY5mMX0KTQyrEkrJ9OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="i07nfUkJU0CKLIX0bOJ/tgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="IFsLjjiZFUWiemuBScOPdwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">251,428;250,366</XPD:ATTR>
+<XPD:REF name="Model">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+<XPD:REF name="Head">xIrnHgVLxUm97jUu4dACtAAA</XPD:REF>
+<XPD:REF name="Tail">Ge7hwnTE00+T03ai+/7E4QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="SfPmx9VC40y36maowqYE9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="dCfwLT1Mi0uQiki30jg58wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="+mZMtPs3FE+Yp7qmfXT6kgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">TBMgXpKOvkqNYUoAAwF/kwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Hrwon9AU20KBrLenzKCCJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KX2YnwUuo0G17Q+mXzzS2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="VN6jbvdN0Eq5Z75i5FutKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Lezmq5MfFEew6znmWvrvMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Q15G0gVK50GhgDMyeL+n1AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KX2YnwUuo0G17Q+mXzzS2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="UOl1s6w3qkeExTCMQmUejQAA">
+<XPD:ATTR name="Alpha" type="real">5.22798466438914</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">19.723082923316</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">Lezmq5MfFEew6znmWvrvMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="NCx8+BohkkG8/3vayHPzUAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KX2YnwUuo0G17Q+mXzzS2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="p7x2bZh4P0+r2gl85iTL9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Lezmq5MfFEew6znmWvrvMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="0TMEEeywLE24hl+z2wKOtgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">KX2YnwUuo0G17Q+mXzzS2wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WhbvRyIYoEaZg82e7bNmQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Lezmq5MfFEew6znmWvrvMAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="cAti98LcSkS2mT0tBmFgXgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">224,428;166,366</XPD:ATTR>
+<XPD:REF name="Model">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+<XPD:REF name="Head">hiEBWGBHwkiFkbHZnmNXjwAA</XPD:REF>
+<XPD:REF name="Tail">Ge7hwnTE00+T03ai+/7E4QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="DOUQLueVh06YyWL/PD21nwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Cd7piLNWA0mAgjvLVavXTQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0JpGkmClT0Gn2KUgtQJ5wwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">DrVKQ3pWaUi+uJD9jDo4mgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="U6af9iwY4Euj7+Pv6jQMxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">8TqXpAmOBEiEDJ5OcyQ/XQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="GrW/KPjagUOkA4kik0jnwwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HJqngn7i40G7I2drQ2M13AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ymveNro9J0SmVCAIbKxYnAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">8TqXpAmOBEiEDJ5OcyQ/XQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="iDS4D4p3wkGquvQu6b4BvQAA">
+<XPD:ATTR name="Alpha" type="real">5.01196091937824</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">16.1245154965971</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">HJqngn7i40G7I2drQ2M13AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="FMoH3AVUskuTFAsg+/zS/gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">8TqXpAmOBEiEDJ5OcyQ/XQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="qxpRLqGUHUmujCT8CFiwTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HJqngn7i40G7I2drQ2M13AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Tpaf2aSuWUmwb+CW46meEQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">8TqXpAmOBEiEDJ5OcyQ/XQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4VhMNvKIzESZo+RC2OQ22wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">HJqngn7i40G7I2drQ2M13AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="1qpBGzzGLEW4skqW8PLQfQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">96</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">428</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="D8DEOQVBKU+wqBuQR7htXwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="M+bFFOpYREqhg6MgsJvzaAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">exclude</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="P4zFtW4/IkaUkmlHTJPzBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="RtFYpO/mY0aKmDNXIN9MXAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="uvFIM8khYkCOy0etwshVqwAA">
+<XPD:REF name="Model">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="7gPI8oW6sE+H2SdMYjie0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="BOTUOx3bo0qWbgyekPr3kAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="8EckyC2TmUuarEhp8FAySAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">138,428;139,366</XPD:ATTR>
+<XPD:REF name="Model">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+<XPD:REF name="Head">hiEBWGBHwkiFkbHZnmNXjwAA</XPD:REF>
+<XPD:REF name="Tail">1qpBGzzGLEW4skqW8PLQfQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="2FPQ4Xkcy0azGg7GBNt9rwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="tsmfINAYAUq57iBKodP1fAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="XkyBeCmDf0S5CQ6ztHMNzgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">+L/IOS7xU0CZQGaUuRo79wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="JLwEQ+OnK0K81MYE0IwDxAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Bb0khctAz0uZw09KLQlAkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="pBqxLpNTIUu8G++vWA2aJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zJtttkdoP0Sbxkekv0oDkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ZwdNiLLuVkW5ypkoJbamnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Bb0khctAz0uZw09KLQlAkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="2jWAWOd/pUKdHuoh2Uwv5wAA">
+<XPD:ATTR name="Alpha" type="real">-0.966666235847484</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">18.0277563773199</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">zJtttkdoP0Sbxkekv0oDkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="nn2UiGiRDE2R4H3exI7h6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Bb0khctAz0uZw09KLQlAkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="oDEdcF7BgEWVG/UO54xulQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">zJtttkdoP0Sbxkekv0oDkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="0IN6dhUTmkO5BJJ0HuunmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Bb0khctAz0uZw09KLQlAkgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="VkFvWYP1FE+NB1AVf3BRZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zJtttkdoP0Sbxkekv0oDkgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="keuqwZ/b70O9JGtNWC1HOwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">165,428;223,366</XPD:ATTR>
+<XPD:REF name="Model">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+<XPD:REF name="Head">xIrnHgVLxUm97jUu4dACtAAA</XPD:REF>
+<XPD:REF name="Tail">1qpBGzzGLEW4skqW8PLQfQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="TXT7PT01rUK8hWWcouQrqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="p/xzX/wsJE2iH2iQKBfV6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="bvte2UT4Hk2L6XiA6IW1oQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">o4nt6mUd0E+mlHL56Zp/egAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="OaKExY1aI02AMjQkxCLysQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">i4KhAL0Fx02s74Y8MHfVngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="lXiXD4C2AU6b5a6EbgVIpQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">KGcKEMkgh0aSl/cfRzrdIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="3FruEk6P60eJZ2yGPgdfqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">i4KhAL0Fx02s74Y8MHfVngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="hsqzdQmMWEKu8ifaCZqRSAAA">
+<XPD:ATTR name="Alpha" type="real">-0.408591891701127</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25.0798724079689</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">KGcKEMkgh0aSl/cfRzrdIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="SB9KA5RQakKw8yg9PurfsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">i4KhAL0Fx02s74Y8MHfVngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="lDGnXZzhbk67kSR0WhJW2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">KGcKEMkgh0aSl/cfRzrdIAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="imNjlVqaKke7tf3SjnP19AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">i4KhAL0Fx02s74Y8MHfVngAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="x2L2vrEHJU6bLG6YvmN+BgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-944</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">KGcKEMkgh0aSl/cfRzrdIAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">7</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="qH8EpavZy0uYaWHuDNJMmwAA">
+<XPD:ATTR name="Name" type="string">&lt;&lt;content v.2&gt;&gt;</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">f8VxW8OVdEC1Ifglf0w3KQAA</XPD:REF>
+<XPD:REF name="Views[1]">hM4omv6+BUCtvVAq2IpllQAA</XPD:REF>
+<XPD:REF name="Views[2]">p+5FqB0RkEyMyy7HPlGYUgAA</XPD:REF>
+<XPD:REF name="Views[3]">avpVwwSPMkK8vsB03T7RdgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">rXN+Z0guxUy+Rz7TPELWrwAA</XPD:REF>
+<XPD:REF name="Associations[1]">icqPwTtyj0mQrj/C6I39GgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="5zzJFTvUNk2trdiXalmeUQAA">
+<XPD:ATTR name="Name" type="string">output</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VqsyvTGqykGXuB4//e+E1QAA</XPD:REF>
+<XPD:REF name="Views[1]">pXZ2T88WYkqqLC3C5J5JGQAA</XPD:REF>
+<XPD:REF name="Views[2]">ogXT3yXsVESLaM9lETp9YgAA</XPD:REF>
+<XPD:REF name="Views[3]">qlZfSHmkokCz217g75ZeFgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">Oz+BmuTcoUOLIBa7KS6DCQAA</XPD:REF>
+<XPD:REF name="Associations[1]">lKnU1zst3E2NB7kzxoZgugAA</XPD:REF>
+<XPD:REF name="Associations[2]">UXpHqpXWWkWaXmnhdMf/GwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="Vt81DrHQHESJBilG85zs2gAA">
+<XPD:ATTR name="Name" type="string">dir</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="ilXc8TLBzkuEeHwK1NkzVgAA">
+<XPD:ATTR name="Name" type="string">flatten</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="oLEHaLlqvk2KiI0vg9OtWgAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">5zzJFTvUNk2trdiXalmeUQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="uLUfupUhTEy2wLImcq6rhwAA">
+<XPD:ATTR name="Name" type="string">desc</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">1b5HAClRfUyRCPe52Vr/SgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="ivlA8JWOIEOE/0Z2gIiUMAAA">
+<XPD:ATTR name="Name" type="string">externalinput</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">hiEBWGBHwkiFkbHZnmNXjwAA</XPD:REF>
+<XPD:REF name="Views[1]">a3/Zo5lKO0io0KWOJBoBswAA</XPD:REF>
+<XPD:REF name="Views[2]">icZ50wwgJEm1Eh73JceQdAAA</XPD:REF>
+<XPD:REF name="Views[3]">DdjJBPyuZE+3STMvtDaQLgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">3UfPK4/xyES+AyWGHmWJsQAA</XPD:REF>
+<XPD:REF name="Associations[1]">8TqXpAmOBEiEDJ5OcyQ/XQAA</XPD:REF>
+<XPD:REF name="Associations[2]">Bb0khctAz0uZw09KLQlAkgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="VnSopj+uhEq0dwiY7f7xUwAA">
+<XPD:ATTR name="Name" type="string">dir</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="R8YIoG13A0+fOf8SeyWQJwAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">ivlA8JWOIEOE/0Z2gIiUMAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="RSfNCw5wNUGCDOhEi/bCrwAA">
+<XPD:ATTR name="Name" type="string">input</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xIrnHgVLxUm97jUu4dACtAAA</XPD:REF>
+<XPD:REF name="Views[1]">FJL7VBgksUqf+mJgiwAJEgAA</XPD:REF>
+<XPD:REF name="Views[2]">rnfjw1R4i0K4tZwRBQQpZwAA</XPD:REF>
+<XPD:REF name="Views[3]">Fr1gW265/EygPEwH23p21QAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">nckaYJRIc0C6lCvSiTPB3gAA</XPD:REF>
+<XPD:REF name="Associations[1]">KX2YnwUuo0G17Q+mXzzS2wAA</XPD:REF>
+<XPD:REF name="Associations[2]">i4KhAL0Fx02s74Y8MHfVngAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="nhDjFrLrwUaeWlRC/g6kpgAA">
+<XPD:ATTR name="Name" type="string">dir</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="ArARsrAKpUy/dMjwqEZDtQAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">RSfNCw5wNUGCDOhEi/bCrwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="RR0EuzZlckCzW5H+HzADZAAA">
+<XPD:ATTR name="Name" type="string">include</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Ge7hwnTE00+T03ai+/7E4QAA</XPD:REF>
+<XPD:REF name="Views[1]">7i9IofoLd0SQ8bvL01zEVwAA</XPD:REF>
+<XPD:REF name="Views[2]">zVMOY5mMX0KTQyrEkrJ9OAAA</XPD:REF>
+<XPD:REF name="Views[3]">i07nfUkJU0CKLIX0bOJ/tgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">Lezmq5MfFEew6znmWvrvMAAA</XPD:REF>
+<XPD:REF name="Associations[1]">HJqngn7i40G7I2drQ2M13AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="a3h/PQ5fFESCcmZ7zjLu7QAA">
+<XPD:ATTR name="Name" type="string">pattern</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="hG85hrOsUkCTWDGQ57+fnAAA">
+<XPD:ATTR name="Name" type="string">files</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">RR0EuzZlckCzW5H+HzADZAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLClass" guid="5zz6gIaMNUKuDMdUeCpo8AAA">
+<XPD:ATTR name="Name" type="string">exclude</XPD:ATTR>
+<XPD:REF name="Namespace">3q8/Gqy8BE6llPh/zkCQ1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1qpBGzzGLEW4skqW8PLQfQAA</XPD:REF>
+<XPD:REF name="Views[1]">uvFIM8khYkCOy0etwshVqwAA</XPD:REF>
+<XPD:REF name="Views[2]">7gPI8oW6sE+H2SdMYjie0gAA</XPD:REF>
+<XPD:REF name="Views[3]">BOTUOx3bo0qWbgyekPr3kAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">zJtttkdoP0Sbxkekv0oDkgAA</XPD:REF>
+<XPD:REF name="Associations[1]">KGcKEMkgh0aSl/cfRzrdIAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="WlvWDj2L3kyIt4/0rrnFCAAA">
+<XPD:ATTR name="Name" type="string">pattern</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="nb+dv6JkJU6s0l70FhRXewAA">
+<XPD:ATTR name="Name" type="string">files</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">5zz6gIaMNUKuDMdUeCpo8AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[27]" type="UMLSubsystem" guid="qGZtK480D0mYNBVDpwOmTQAA">
+<XPD:ATTR name="Name" type="string">crml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="lHoPttW5gkeXVIETRYHrUgAA">
+<XPD:ATTR name="Name" type="string">crml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="fnFKhN1XqESp1bUzI4dGqQAA">
+<XPD:REF name="Diagram">lHoPttW5gkeXVIETRYHrUgAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">14</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="+nwbLtWGLU+Hz+YSIaPSPgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">28</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">134</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">111</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentStereotype" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="j4E8NMQLzUWq0k8eu2uMogAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="y6sCFFXidU2P8LLusHGLRwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">repository</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="fvbL3/gH0UewF/wqzeEiTAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="uAjG1dLIoUKtWGh49jvFFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="UizWMh4VkEmN+kftLvxc/gAA">
+<XPD:REF name="Model">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="VSWdlssMk0aMasrpCwCJOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="AWD09lz0YUmnV4QV1eOY1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="5EaYUrSobEeRZVmpVQKv3QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">44</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">244</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">111</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="JRzWXsPDrUSCPMEmqaucDAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="tCPgmbPDbUW5XCs06T8R1wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">key</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="e8vpxnDKqU2ZPgsTGVMafwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="uqTS2oJG3EKbQp8DCIpISAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="dXGVOm9nmEy/KTy5FcmCTQAA">
+<XPD:REF name="Model">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/AmPM8keC0uf3yV0kWnKNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="DkQ0l+BmBk+D/XNNYw8QJwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="Oyz3g+Eb+0aLBMMP2OdnywAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">129,244;211,138</XPD:ATTR>
+<XPD:REF name="Model">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+<XPD:REF name="Head">+nwbLtWGLU+Hz+YSIaPSPgAA</XPD:REF>
+<XPD:REF name="Tail">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="nALUx2T9Ek2OwwszSpQDZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="1AfqmcpjFUqxPQk69aW+XgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="2gKd+sQZT0yFRQh0A9mb5AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">T6dZEmqJBk+JCBjNk+rKTgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="p08f/TURiUuXtccGxGI10gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IlupvcREqU63XTFypXGQ7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="QufHXsbWl0WSow4YCLlr3QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">iLAuQHEQv06jzD7kiYoXuAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="EcM/X/O720i4uubgSZgh8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IlupvcREqU63XTFypXGQ7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="8o0CenYCKkm2TwPtqznYVgAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">iLAuQHEQv06jzD7kiYoXuAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="U8VyjCE1+ESpHThR6j5jeQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">IlupvcREqU63XTFypXGQ7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="0jizQRMG7kGF2Ihk78xtLQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">iLAuQHEQv06jzD7kiYoXuAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="XOW7tTTEHUy8X5gRLyzGzQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">IlupvcREqU63XTFypXGQ7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="26SPYXaf9kyQmuPCOLhxZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">iLAuQHEQv06jzD7kiYoXuAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="VpBGGuW55UySrLIkovhGCAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">24</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">444</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="CO+Nm+VA1kaurH8JY2pN6AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="nwHP3Kt81kuAw3Ro6vkQAAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">bit</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="SwkynkUep0auNvVNk+IF5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="laYG38bdSUGw+4V0Rn+FTQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="T+oMueN60k2jocvQkL7/bgAA">
+<XPD:REF name="Model">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="OV3DMJJtlkSHWbQ6B/2QpAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="KpcFJEB1zUuPKUwPp8ZoeQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="NbRVlVzojEy/Lq+DBHs5wAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">67,444;79,354</XPD:ATTR>
+<XPD:REF name="Model">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+<XPD:REF name="Head">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:REF name="Tail">VpBGGuW55UySrLIkovhGCAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="osmqNSG9XUmyM4IO4+pP+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="TlF7nqwiKk6+wLo7NlpH9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Q+cxwoveCkeigaspgfX7JgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">bp+wZYcgB06p/FXxYnPeTwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="M8HJcPL9qk+XCdB9mxXCGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GHXyLRfe2keijGBsIZEejAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="W9D4rtyWhUu4LVWN0R18+QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HhbIwX8GCEqzk5wgVXMRVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vIvkfgU6eEqHe14QMZtKwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GHXyLRfe2keijGBsIZEejAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="iMaiGEU8WUq24TcEgWNe1gAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">HhbIwX8GCEqzk5wgVXMRVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Srn6vi9WtE+f+sBRNq53WgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GHXyLRfe2keijGBsIZEejAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="tQkf5tlxJEC1xXIkDHKV8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">HhbIwX8GCEqzk5wgVXMRVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="a2Mk9EYtl0CIEogV7Q8rYwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">GHXyLRfe2keijGBsIZEejAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="69sDpwOjyUm2y2rmEdZ31gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">HhbIwX8GCEqzk5wgVXMRVwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="cJgk6WhGO0avPyOwTnu1cwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">224</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">204</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="TwnNUnI8gUi0eBam6BOTnQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="6Wwt3Y30gkejkBsGT9ktLwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">access</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="8u59Sz9iLE+6P5DKCmLZsAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="YPDG3VClwk2khkzROqh8KAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="wUthsVEsoEKYXTCCIeYGAwAA">
+<XPD:REF name="Model">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8douAJiqj0easJyFlmL3iAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="2ac7MKCI8UOB0WqZZooLRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="dLWcwxVERkGRdXFNtBJxSgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">261,204;257,138</XPD:ATTR>
+<XPD:REF name="Model">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+<XPD:REF name="Head">+nwbLtWGLU+Hz+YSIaPSPgAA</XPD:REF>
+<XPD:REF name="Tail">cJgk6WhGO0avPyOwTnu1cwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="fi7JFxBqykSKlYSmEXn0YgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="7rvLfWINwECFyjNqf5+1ugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="javyJkUdeUGEYWXn5RsElAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">kRhs7Db07UCnVGvTeUn8qgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="mLfeBa3PtkOo6uvLbzwmWQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pX9DIVuaOEuVu+1aJ6TVBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="zuVp2v+ehEOqKJcMTlKiQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">bgAX+775K0+IdCitgl+l0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="wEaj9RGukkK91gRZ9BNeowAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pX9DIVuaOEuVu+1aJ6TVBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cPdSWjZ5NEuBpfrIAx3rYAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Model">bgAX+775K0+IdCitgl+l0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="7w3JfnHZSEiz51HcCeTD0gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">pX9DIVuaOEuVu+1aJ6TVBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Ubfg9u6qUE2EwVbLux9JcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">bgAX+775K0+IdCitgl+l0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="D8eh27iipUigD3DOeweTgwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">pX9DIVuaOEuVu+1aJ6TVBwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="9grqcoX0n0WN2qPf2TC/iwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">bgAX+775K0+IdCitgl+l0gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="BtR16XQRokCb/cA1/inx8gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">120</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">436</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">101</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="XTgaFaaVr0qEwNIl4rt64AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="PXghJlGHyk+misaFwUxfpwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">value</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="G1e6LDbszE2rcNeVq5QFqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="IyJvN4TiBE2vXsCFvCnh9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="/QlnnLPpk0K4LIQGtgPlMQAA">
+<XPD:REF name="Model">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bDTplzAAnU+yd8NRbba4ggAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="lQIsiurv6U61NSrIl6xDZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLClassView" guid="NbmAtWNEy0uviAWASDmMxAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">424</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">232</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">90</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">150</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="pJqMNPjSdEK2Qdx1AjlUIQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="nMjjkRYIuUCCxPPZUXvi7wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">keyRange</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="eBwvnZsQV0eUkW3uZwpInQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eoz1ZiwUMkeCNPtKiL+aYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="oe3w5nWFLkOEF0x7esL3gwAA">
+<XPD:REF name="Model">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wHXSmfvk3EicS65WwlHwngAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="+Ui3b2tC0kuC4O21ierDQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="YnexAQXCSEmdRB4mzG2eDAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">424,260;307,138</XPD:ATTR>
+<XPD:REF name="Model">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+<XPD:REF name="Head">+nwbLtWGLU+Hz+YSIaPSPgAA</XPD:REF>
+<XPD:REF name="Tail">NbmAtWNEy0uviAWASDmMxAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="6R2FOEPEREub7zclEMKu7QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="hvvGcnL/aUG2lUskmWcyVgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="GahVFnML8U+n3sq4jSuybwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">eb3ayVr/ukqo6hvbKDz/swAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="UuiygYFsvEqjuBpVAK+QYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7c4AqBkyEUiX8qdLBY9+IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="tEA8cl7lHEO8LOt56RhoCQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">YPoJAT5z60mJJ/4nlVKgQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="3nvXpaiPaEWwGDRUCky1DAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7c4AqBkyEUiX8qdLBY9+IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="5c/P9C3GDU6RvQUbTcNiLgAA">
+<XPD:ATTR name="Alpha" type="real">0.551133160098852</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">23.7697286480094</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">YPoJAT5z60mJJ/4nlVKgQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="JZfOJJlwCkSzGpsVbu5l5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">7c4AqBkyEUiX8qdLBY9+IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="xj10XT1n1UCWgHaZncTTGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">YPoJAT5z60mJJ/4nlVKgQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="vgPoo8+OM02s/JymWoSSHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">7c4AqBkyEUiX8qdLBY9+IQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="BFna1MLap0Cde8OsO8HmlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">YPoJAT5z60mJJ/4nlVKgQwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="+ajNiZhtfkqr4Ip+H9i7ygAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">303,252;424,292</XPD:ATTR>
+<XPD:REF name="Model">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+<XPD:REF name="Head">NbmAtWNEy0uviAWASDmMxAAA</XPD:REF>
+<XPD:REF name="Tail">cJgk6WhGO0avPyOwTnu1cwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="xEmIj3vizUyc8IeHzZzehgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="jm13hIyI3k2LrpIL5e0jNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="DMeHYWv+s0agt3t1wzwM1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">uqzj6Tgi3UqwZ2fIPCUxxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="9ay94DWRiUaWXzZBc+zNCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YCmqDh6mYEC2sMTiRqfJhgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="fKYHJ5cc1k+APkFy8CvvxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">+0..2</XPD:ATTR>
+<XPD:REF name="Model">cma9bSbXZku+M+oWkso1HAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="pyk4GBNMuESdYmyhGJB5GAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YCmqDh6mYEC2sMTiRqfJhgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="0pZdlegq40ak5db1s7bKkAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Model">cma9bSbXZku+M+oWkso1HAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="hBhmpDWP6kyFVSNGduiusAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YCmqDh6mYEC2sMTiRqfJhgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="FTmXdCOLlk2ky3vVlEbyJgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">cma9bSbXZku+M+oWkso1HAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="9bNtG1JQOEWudwR9deV29AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">YCmqDh6mYEC2sMTiRqfJhgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="ZMLXleFVeEmCF/KGwnv8yAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">cma9bSbXZku+M+oWkso1HAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="hwJMwHLkvUG+IsAaCaziqwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">224,252;129,284</XPD:ATTR>
+<XPD:REF name="Model">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+<XPD:REF name="Head">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:REF name="Tail">cJgk6WhGO0avPyOwTnu1cwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="KYhSQdxF2ESNumBL6XCXSAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Avl0Bwz1g0mTxAt22ofQygAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="Cbymk6DX80ezDS9Hc235CwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">kXQY/Vx23UC1DCh8F9IRdQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="/X35LDb+DEiJXnNfVU2rdAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vvpTBHVSakeBGaqd5bC6mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="T/ua+KCigE20Gfl/dJ4XrQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">eJrRdjRApEijUlwTFcnU6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="U8Asfcm4x0m9eo1mJ54HqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vvpTBHVSakeBGaqd5bC6mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="qQYS/rwfTke5k4gCNB2yXQAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..2</XPD:ATTR>
+<XPD:REF name="Model">eJrRdjRApEijUlwTFcnU6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="vSkSRdqBp0WIvH69UZgUNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">vvpTBHVSakeBGaqd5bC6mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="KrSmFvVFOUK62Gbf5HAMPQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">eJrRdjRApEijUlwTFcnU6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="90A2D258u0CKJ56gBl6brgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">vvpTBHVSakeBGaqd5bC6mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="/ENNOk7hbESKFw4vl2LbqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">eJrRdjRApEijUlwTFcnU6QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLAssociationView" guid="+KAZSHjliE20MOigCSjtswAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">129,300;424,305</XPD:ATTR>
+<XPD:REF name="Model">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+<XPD:REF name="Head">NbmAtWNEy0uviAWASDmMxAAA</XPD:REF>
+<XPD:REF name="Tail">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="sBuc1XPgEEqF7cNlI6g8fAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ZdaGtQlOBEyWh+XqTEYoaQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="3ogUEW08UU6YGhRDKod94gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">i+idGeRyH0O6Trx2aQWMcwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="1H6EHKqhr06EQGdQOXQK7gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RfAdcCNofE+evhlZyty3cgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="cIX+mr93JEG2b8kI8CaJ4QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">c/1XK8730064TYgqeMtY+wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="61URF7/rmkGbZG9o4j3/8AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RfAdcCNofE+evhlZyty3cgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="gc5YwU7ap0uUsjn1ia0pMAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">c/1XK8730064TYgqeMtY+wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="I9NVsfIvLU+QtoEeKdFiaQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RfAdcCNofE+evhlZyty3cgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="l6EeEQrG0UG3x4QS2FtNnAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">c/1XK8730064TYgqeMtY+wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="H3+QpAFFCEqLMC2AZU5STwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">RfAdcCNofE+evhlZyty3cgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="HhbrxzkVrUq6n0+QjfKfSAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">c/1XK8730064TYgqeMtY+wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLAssociationView" guid="iN8vizAkO0SdgDkxW75xWQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">153,436;113,354</XPD:ATTR>
+<XPD:REF name="Model">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+<XPD:REF name="Head">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:REF name="Tail">BtR16XQRokCb/cA1/inx8gAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="9isiJhLnKEqUzJ0bbm2prgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="yxDY2j0ycUKvrfzBqyMY+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="y2AXYAqQe0iKD6O8s23/HQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">POwBB4/GAUeNaKKEcJpIlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="sypIgjQeU02cHtbTtCyfDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ZEDi//IT4ESS+61ttQt0ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="gLKU7VT0fkaL49FlQlsFwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">/F1D5wzLBE2wKfdscOPvswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="fTGcxOEsP0GMN9kamSHNUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ZEDi//IT4ESS+61ttQt0ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="vcTkKyxY4Uy0P3Dn4XpEbAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">/F1D5wzLBE2wKfdscOPvswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="3lDt7gvTSECW3UteHCcrSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ZEDi//IT4ESS+61ttQt0ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="N7cRTUq3k0qbJpPo2FrXUQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">/F1D5wzLBE2wKfdscOPvswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HiOYXtGhm0GbNpW1wzW3EQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">ZEDi//IT4ESS+61ttQt0ZQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4WLr8c1VmEapx+ZiSHSFVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1308</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1196</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">/F1D5wzLBE2wKfdscOPvswAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">6</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="bsLMfNcnMUOLwcGU0WrbswAA">
+<XPD:ATTR name="Name" type="string">repository</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">+nwbLtWGLU+Hz+YSIaPSPgAA</XPD:REF>
+<XPD:REF name="Views[1]">UizWMh4VkEmN+kftLvxc/gAA</XPD:REF>
+<XPD:REF name="Views[2]">VSWdlssMk0aMasrpCwCJOwAA</XPD:REF>
+<XPD:REF name="Views[3]">AWD09lz0YUmnV4QV1eOY1wAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">IlupvcREqU63XTFypXGQ7gAA</XPD:REF>
+<XPD:REF name="Associations[1]">pX9DIVuaOEuVu+1aJ6TVBwAA</XPD:REF>
+<XPD:REF name="Associations[2]">7c4AqBkyEUiX8qdLBY9+IQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">6</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="HDrNslgJZ06Gd6kceEyYvwAA">
+<XPD:ATTR name="Name" type="string">version</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Op5627fvWkGsO/rDGqHxVwAA">
+<XPD:ATTR name="Name" type="string">uidName</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="EUnSC24uIU6Oc/cGBf6/HQAA">
+<XPD:ATTR name="Name" type="string">uidValue</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="4lmUbe28lky2CSREw8fD6wAA">
+<XPD:ATTR name="Name" type="string">initialialisationFileVersion</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="OpL2U9dA8kKe/QWFhBt73AAA">
+<XPD:ATTR name="Name" type="string">owner</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="VYb6jAk4DUuUEjtykUXt9QAA">
+<XPD:ATTR name="Name" type="string">backup</XPD:ATTR>
+<XPD:REF name="Owner">bsLMfNcnMUOLwcGU0WrbswAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="8qRD67PVK0aWXk0wa4g0EAAA">
+<XPD:ATTR name="Name" type="string">key</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">5EaYUrSobEeRZVmpVQKv3QAA</XPD:REF>
+<XPD:REF name="Views[1]">dXGVOm9nmEy/KTy5FcmCTQAA</XPD:REF>
+<XPD:REF name="Views[2]">/AmPM8keC0uf3yV0kWnKNgAA</XPD:REF>
+<XPD:REF name="Views[3]">DkQ0l+BmBk+D/XNNYw8QJwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">5</XPD:ATTR>
+<XPD:REF name="Associations[0]">iLAuQHEQv06jzD7kiYoXuAAA</XPD:REF>
+<XPD:REF name="Associations[1]">GHXyLRfe2keijGBsIZEejAAA</XPD:REF>
+<XPD:REF name="Associations[2]">vvpTBHVSakeBGaqd5bC6mwAA</XPD:REF>
+<XPD:REF name="Associations[3]">ZEDi//IT4ESS+61ttQt0ZQAA</XPD:REF>
+<XPD:REF name="Associations[4]">c/1XK8730064TYgqeMtY+wAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">6</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="+FiKBTo7g0+OGXWfFUJg7wAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="29yB7WffPEGQ/AFwy6WfZgAA">
+<XPD:ATTR name="Name" type="string">int</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="GPn47F/ngk6g5LJ8XwiD3gAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="To+IqWqR4EKLTGSbJ+uSsAAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="dVyqXjFjQE+tCdyipDp6wgAA">
+<XPD:ATTR name="Name" type="string">readOnly</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="blthl7JbrUm/wYj20gXuvwAA">
+<XPD:ATTR name="Name" type="string">backup</XPD:ATTR>
+<XPD:REF name="Owner">8qRD67PVK0aWXk0wa4g0EAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="RH51ga45KE6KDoeLQE8QlQAA">
+<XPD:ATTR name="Name" type="string">access</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cJgk6WhGO0avPyOwTnu1cwAA</XPD:REF>
+<XPD:REF name="Views[1]">wUthsVEsoEKYXTCCIeYGAwAA</XPD:REF>
+<XPD:REF name="Views[2]">8douAJiqj0easJyFlmL3iAAA</XPD:REF>
+<XPD:REF name="Views[3]">2ac7MKCI8UOB0WqZZooLRQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">bgAX+775K0+IdCitgl+l0gAA</XPD:REF>
+<XPD:REF name="Associations[1]">cma9bSbXZku+M+oWkso1HAAA</XPD:REF>
+<XPD:REF name="Associations[2]">eJrRdjRApEijUlwTFcnU6QAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="w312n9EBsEyqwu7K14p3egAA">
+<XPD:ATTR name="Name" type="string">capabilities</XPD:ATTR>
+<XPD:REF name="Owner">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="FVmh4muEvEqp+xSKm3fyFQAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="gNh4Pm5fYE6ZcMwwKRVe3wAA">
+<XPD:ATTR name="Name" type="string">sid</XPD:ATTR>
+<XPD:REF name="Owner">RH51ga45KE6KDoeLQE8QlQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="owewdd03PEqMInhVg8hxegAA">
+<XPD:ATTR name="Name" type="string">bit</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VpBGGuW55UySrLIkovhGCAAA</XPD:REF>
+<XPD:REF name="Views[1]">T+oMueN60k2jocvQkL7/bgAA</XPD:REF>
+<XPD:REF name="Views[2]">OV3DMJJtlkSHWbQ6B/2QpAAA</XPD:REF>
+<XPD:REF name="Views[3]">KpcFJEB1zUuPKUwPp8ZoeQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">HhbIwX8GCEqzk5wgVXMRVwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="3hWhEcZvn0OdN2tYRdJODAAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:REF name="Owner">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="ios9pxi2eU+HlwU4mwUZFAAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Owner">owewdd03PEqMInhVg8hxegAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="eYGzjuCMLkKn4NjB0dEn0AAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">BtR16XQRokCb/cA1/inx8gAA</XPD:REF>
+<XPD:REF name="Views[1]">/QlnnLPpk0K4LIQGtgPlMQAA</XPD:REF>
+<XPD:REF name="Views[2]">bDTplzAAnU+yd8NRbba4ggAA</XPD:REF>
+<XPD:REF name="Views[3]">lQIsiurv6U61NSrIl6xDZgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">/F1D5wzLBE2wKfdscOPvswAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="HOIsIXFN/0CnwMRLY3IFkgAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Owner">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="iqEcJJbxS0KXu4mv9wrqdgAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="aa0BHjKqzUeUrmafcNUdjwAA">
+<XPD:ATTR name="Name" type="string">desc</XPD:ATTR>
+<XPD:REF name="Owner">eYGzjuCMLkKn4NjB0dEn0AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="LyqVpBJycU+8Cyr2qe1BvAAA">
+<XPD:ATTR name="Name" type="string">keyRange</XPD:ATTR>
+<XPD:REF name="Namespace">qGZtK480D0mYNBVDpwOmTQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">NbmAtWNEy0uviAWASDmMxAAA</XPD:REF>
+<XPD:REF name="Views[1]">oe3w5nWFLkOEF0x7esL3gwAA</XPD:REF>
+<XPD:REF name="Views[2]">wHXSmfvk3EicS65WwlHwngAA</XPD:REF>
+<XPD:REF name="Views[3]">+Ui3b2tC0kuC4O21ierDQgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">YPoJAT5z60mJJ/4nlVKgQwAA</XPD:REF>
+<XPD:REF name="Associations[1]">YCmqDh6mYEC2sMTiRqfJhgAA</XPD:REF>
+<XPD:REF name="Associations[2]">RfAdcCNofE+evhlZyty3cgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">9</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="ZunJuB3iOEO06LHKOv2A9QAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="O2q/VyBUP0CATJglzcAMrgAA">
+<XPD:ATTR name="Name" type="string">firstInt</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="TMoTw/sZfUK0KBoSqQEgQwAA">
+<XPD:ATTR name="Name" type="string">lastInt</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[3]" type="UMLAttribute" guid="fb6vcSzxOUe+a3zibYIhtwAA">
+<XPD:ATTR name="Name" type="string">indexBits</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[4]" type="UMLAttribute" guid="Ra7WkfFo0U+FMxMc7+00ogAA">
+<XPD:ATTR name="Name" type="string">firstIndex</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[5]" type="UMLAttribute" guid="0el6SHlW2keC4Y1TYscD9gAA">
+<XPD:ATTR name="Name" type="string">countInt</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[6]" type="UMLAttribute" guid="nypmkbkGjE2FD8KycYQ6qwAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[7]" type="UMLAttribute" guid="yNFMnQzAC0Ga8x249NAxzgAA">
+<XPD:ATTR name="Name" type="string">readOnly</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[8]" type="UMLAttribute" guid="VsT0E6bUWE6tCvM+FqWlhAAA">
+<XPD:ATTR name="Name" type="string">backup</XPD:ATTR>
+<XPD:REF name="Owner">LyqVpBJycU+8Cyr2qe1BvAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[28]" type="UMLSubsystem" guid="W9oh7yos/U2flTVaR6jCYQAA">
+<XPD:ATTR name="Name" type="string">ruleml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="Qb0bMw3xFkm+c/jyw9QK/gAA">
+<XPD:ATTR name="Name" type="string">ruleml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">W9oh7yos/U2flTVaR6jCYQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="sKXUPygDhU2bKgxKhPdC9QAA">
+<XPD:REF name="Diagram">Qb0bMw3xFkm+c/jyw9QK/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">5</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="dyXXZnwue02hiPSfuW8khAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">264</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">105</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="USt/e4JS+ESxUI9FhfyYTgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="vcnG1qrdRUux0x8STeT72AAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">eval_globals</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="eO+7jWKHXUSwKlaxLPgXbgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="qpqVZXZqlE+kp4XUNIJGKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="reFnGrjcmUmvbgNWcMLchgAA">
+<XPD:REF name="Model">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="QAL5BcfilkiGMFwc1FqX9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="sBNYasn4h0ShnAVtLQkrfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="6xgTZ7FpWUWAaKkd9yGFOAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">152</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">90</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">30</XPD:ATTR>
+<XPD:REF name="Model">1UxBGcFK3EKPBFhSfrqD/gAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Ciz2lNB01EePcDqbaVY7CgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="ksZGVL7NsUygmuUt1/L6VQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">rule</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="5Axfb3B3M0yJdl42bAPmsQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="334g98Diw0aMc6Vjbq5SnQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="WdjwZH85+UKt546ACmpSUwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1UxBGcFK3EKPBFhSfrqD/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="QBcb/+4Zt0C9KGOho0itEgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1UxBGcFK3EKPBFhSfrqD/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="yBCZtO71ykyejq6twf3sJwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1UxBGcFK3EKPBFhSfrqD/gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="m31f7bq1D0GmhHHoFyocMgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">208</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">36</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">30</XPD:ATTR>
+<XPD:REF name="Model">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="k3JmEiNpxkCMhjZx60dp1wAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="MtrU6nS9jEeGyXN6Pzl9bwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">&lt;&lt;ruleml&gt;&gt;</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Mdl2TPaTvkWgE1Fpwks57AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="SgYIwoXpREyg5ANyDp1qFgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="9Jix+EFpNEeQwrtd6FtreAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="karUmOGlDUGWg1fLA4xncgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="k4/35kxCtUOzOETdRAt8ZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Zb0aDQhc/0+9cFTqn86nzAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLAssociationView" guid="xZ3+dsZIfEiC43OHIp6HbwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">224,124;224,65</XPD:ATTR>
+<XPD:REF name="Model">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+<XPD:REF name="Head">m31f7bq1D0GmhHHoFyocMgAA</XPD:REF>
+<XPD:REF name="Tail">6xgTZ7FpWUWAaKkd9yGFOAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="OwFBa/th9Uy8Lm8eq4Aj4QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="c27YkTyoM0aKzvAZCm2iIgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="FQhWGDczYUyEyHgdkNc//gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">VBvmUm8cYUO9N+N5odPPwgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Tl6bZUBecES9Wf3QPI+W5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">3BfCAZv/iUS90Qjw30LrDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="0fKpEItNIEyLVHn22yCbcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">atPDiS9SkUuVO8zUd1za/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="oveJexj1FUaO2/ZC0Yr20QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">3BfCAZv/iUS90Qjw30LrDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Kr274H6cB0uV7Jh3zEPCDwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">atPDiS9SkUuVO8zUd1za/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="yZdaFpAs4U2WLaLyYzu4BAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">3BfCAZv/iUS90Qjw30LrDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="I/O9qvaRCkm2U9iU87kcegAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">atPDiS9SkUuVO8zUd1za/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ITJeMH8P+UGCKmh0E0oV+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">3BfCAZv/iUS90Qjw30LrDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="w8cW1VW7NEGh84PNhZoIKAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">atPDiS9SkUuVO8zUd1za/gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="FJnWa3Qkd0Oa/L/Bnos5PwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">280,124;280,65</XPD:ATTR>
+<XPD:REF name="Model">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+<XPD:REF name="Head">m31f7bq1D0GmhHHoFyocMgAA</XPD:REF>
+<XPD:REF name="Tail">dyXXZnwue02hiPSfuW8khAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="dtfpOxLsxEi76MixqvFxeAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="FNV9oBeYnEq1AKz4TK157QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="kskyU4LPAkeYLLAIBSQDqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Xyq6xieNl0Cn5MPsr7wH4gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="PwBGm+gLokmVo1vE9urRjgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">17kbByDKYUyZ+m2wpPWaxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="2E5HCfk9rUGK4qKkKTmuCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">b2WodVCgbkarRKGvRfujywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="D3w6jbaif0yLYBhIM21JzQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">17kbByDKYUyZ+m2wpPWaxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Xhy7Xm7Jy0eG8KMLyL+ItAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">b2WodVCgbkarRKGvRfujywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="nhGgwZkUGUijmCSxNabUfwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">17kbByDKYUyZ+m2wpPWaxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="LMSNfK4lCEuMmi3UVWkLUQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">b2WodVCgbkarRKGvRfujywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="h8N5Cnk8mU+N53/yc4WifgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">17kbByDKYUyZ+m2wpPWaxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="DMDmkcKWpE64qvIf5u0vsAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">b2WodVCgbkarRKGvRfujywAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="Zb0aDQhc/0+9cFTqn86nzAAA">
+<XPD:ATTR name="Name" type="string">&lt;&lt;ruleml&gt;&gt;</XPD:ATTR>
+<XPD:REF name="Namespace">W9oh7yos/U2flTVaR6jCYQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">m31f7bq1D0GmhHHoFyocMgAA</XPD:REF>
+<XPD:REF name="Views[1]">9Jix+EFpNEeQwrtd6FtreAAA</XPD:REF>
+<XPD:REF name="Views[2]">karUmOGlDUGWg1fLA4xncgAA</XPD:REF>
+<XPD:REF name="Views[3]">k4/35kxCtUOzOETdRAt8ZgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">3BfCAZv/iUS90Qjw30LrDwAA</XPD:REF>
+<XPD:REF name="Associations[1]">17kbByDKYUyZ+m2wpPWaxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="1UxBGcFK3EKPBFhSfrqD/gAA">
+<XPD:ATTR name="Name" type="string">rule</XPD:ATTR>
+<XPD:REF name="Namespace">W9oh7yos/U2flTVaR6jCYQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">6xgTZ7FpWUWAaKkd9yGFOAAA</XPD:REF>
+<XPD:REF name="Views[1]">WdjwZH85+UKt546ACmpSUwAA</XPD:REF>
+<XPD:REF name="Views[2]">QBcb/+4Zt0C9KGOho0itEgAA</XPD:REF>
+<XPD:REF name="Views[3]">yBCZtO71ykyejq6twf3sJwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">atPDiS9SkUuVO8zUd1za/gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="tPNexD/wZ0Kui7rS13cHiQAA">
+<XPD:ATTR name="Name" type="string">eval_globals</XPD:ATTR>
+<XPD:REF name="Namespace">W9oh7yos/U2flTVaR6jCYQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">dyXXZnwue02hiPSfuW8khAAA</XPD:REF>
+<XPD:REF name="Views[1]">reFnGrjcmUmvbgNWcMLchgAA</XPD:REF>
+<XPD:REF name="Views[2]">QAL5BcfilkiGMFwc1FqX9QAA</XPD:REF>
+<XPD:REF name="Views[3]">sBNYasn4h0ShnAVtLQkrfwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">b2WodVCgbkarRKGvRfujywAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="iRpJiH2fwkSYiiL/eQCfUAAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">tPNexD/wZ0Kui7rS13cHiQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[29]" type="UMLSubsystem" guid="nunAvzsMpEeElylKkdpPBgAA">
+<XPD:ATTR name="Name" type="string">implml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="Qj8LTG3bgE6FmHTG1v3Y+gAA">
+<XPD:ATTR name="Name" type="string">implml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="dVUQRx8sZk6oM+RR+pRFSwAA">
+<XPD:REF name="Diagram">Qj8LTG3bgE6FmHTG1v3Y+gAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">19</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="fFUPdkT+cECZRPlQsVRNmgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">368</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">457</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">103</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="LdJ6OrFikUO6OIAfXjtDEgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="6LX+Kw4AXEWaDlCJcLWzMAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">tag</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="LW0rVbHUyk2F6GXaxU9HSgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="w5a1/f4qf0mBOAKWAacphQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="hhUPNV2dYUe93B+roOUBxAAA">
+<XPD:REF name="Model">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="IqDATwgrQU+YDY6SgU4zPAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="C6uIjH9Jz06qP1N9c9sHRgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="t73r2IX7MECggYesswXDJAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">216</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">232</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">137</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="E+epKK4uiUemSgKTQwOa1gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="4db4Nr5M30qDSG0UOMmHdAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="hThDGK0i6Uqt0w+/KONcqAAA">
+<XPD:ATTR name="Text" type="string">&lt;&lt;implml file&gt;&gt;</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="QhGC5IhDcUarFXfXOC701gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="PI856VbJ1EmqFDdtNo2osAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="QufBQRkAJEWVH35TPaGEcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="OBSt/hkfT0uBJX9vhn/ZYAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="33uAhI5hLUWb7Axy/eyXZgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">424,457;424,436;452,436;452,400</XPD:ATTR>
+<XPD:REF name="Model">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">fFUPdkT+cECZRPlQsVRNmgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="tUMOJDDxLUqqomPTayLrUQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="mm+t0pMG20KB7AwHTHzjWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="/vtG/tvzPk2y2gPniiYPgQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">bgc8Y2rnekGMLllh30J1OQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="3o8m9AMXSEyj9NuoG48g6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">aULbbut4DECnPwmgTtTx2gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="q5R3azzdLEq9J9i5gPI0DAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Q4SS4jSQ20i54ioZw+85jQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="4U3CJtdrSE6v0RtK8cfbmQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">aULbbut4DECnPwmgTtTx2gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="2yewimL/dk6m6bpFnRan+gAA">
+<XPD:ATTR name="Alpha" type="real">-5.34741517464291</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">23.6008474424119</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">Q4SS4jSQ20i54ioZw+85jQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="cqEDZ6uFDU+d99Mg4pdsRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">aULbbut4DECnPwmgTtTx2gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="LS3AvKHSa02HeWvrF4I0owAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Q4SS4jSQ20i54ioZw+85jQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="DiasEUayJkiGpAbs8CCj1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">aULbbut4DECnPwmgTtTx2gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hxIjQHEETUihPyBoroARPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Q4SS4jSQ20i54ioZw+85jQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="N8ckb8OYP0SfE9Y3pFPHeQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">480</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">457</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">145</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="fd5gifexSUCGuK/Dlr6XvAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="zyt0ML9ILEW0uj2R0NX5OQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">phase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="0rKvKmJ920ysEIXt5hOlDQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="p9NX69O9VkqhPwK1waiVgQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="pGbr5OSan0KaHW/kfKG06gAA">
+<XPD:REF name="Model">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="q4nmbqnRj02UOcrLD1YKXgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="mwWMDNy96U2S95ynkMKM6gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="uIDgNBc5UU+LdBtKBxIR8gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">520,457;520,436;452,436;452,400</XPD:ATTR>
+<XPD:REF name="Model">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">N8ckb8OYP0SfE9Y3pFPHeQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="5tUhqIYIyU27VWbzjNQiKQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="5ppftDIPjUa6ZqVDeohPAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="ihvFb0GsjkS5/O+Kun9vxwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">xX7RE0ASlkOrRf9dOxH/zgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="3lI3E9NaG0ecYhVlRZfMOgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">eXkeLjSvuU6MRxUlhWndcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="xpUbJo+EfEeDXJwxUI0rCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">mWEP+8jbjE24hKhlVCG8uQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Lkjawm3/i0GjCA4UEjTVWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">eXkeLjSvuU6MRxUlhWndcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="pJdulqbefkGnbq1iXskheQAA">
+<XPD:ATTR name="Alpha" type="real">-0.750928942501882</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">20.5182845286832</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">mWEP+8jbjE24hKhlVCG8uQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="rMu4spxAdUKJKBpc2tyrNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">eXkeLjSvuU6MRxUlhWndcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="biEwgK/6UUeESLm1DAHiPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">mWEP+8jbjE24hKhlVCG8uQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="08M182NXqUCM9djSdJom9wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">eXkeLjSvuU6MRxUlhWndcAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4e3r4Vq+7Uu1V8jh7OyJKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">mWEP+8jbjE24hKhlVCG8uQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="q4XlSDOPYU+NPe527blyDAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">272</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">320</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">82</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">72</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="ewCsx4fCNkqNwA7IxizoZAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="gHMhj5NChEukw4okXGLeawAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">tempfeature</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="apFFGXf0CUWxPlNhUCvrswAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="MwmPBH/gTkyaKCmvAxZWRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="OPmimASZgkeXIjYxldjyCwAA">
+<XPD:REF name="Model">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="99Yd5gndkkyskqSs6f7DxgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="5Z63Ifg2AkSGODIoh2d+pQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLClassView" guid="EQYzSHCrWUaPx/wRaFPzOwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">244</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">457</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">102</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="g9AY4sZoWkCebu//ValDDAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="RMxlHUcMrUab36O1gtUMNAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">tempseqfeature</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="mhjeEe+KKkGsozB1ErIhrAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="sO5jpzShTkW30hnUTeuAtgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="WUJqg6xiME6JRZYBE52z6QAA">
+<XPD:REF name="Model">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="81QcggEHtESSYNzW/5PV2QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="VmcXcfWsuU+bWPIkjuPHUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="lDijJz+lnkadB0oxsMOAAQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">353,363;432,363</XPD:ATTR>
+<XPD:REF name="Model">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">q4XlSDOPYU+NPe527blyDAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="JjVQpSvmgEm54HeP9POXvwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="eoVARvn3OEqynyhClbO8yAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0dBBCuYIWkq/zCoyhQ140wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="nXLYOXclLEq/2y6E25OcVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ABzc1o7mCkiMBst076lYvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="TEn2uTNL9ESnQTpl5oyOKgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">MU/1J6u8VEukQZBFAc2A2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="mJZcS8A23UCjjPXR4Js0fgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ABzc1o7mCkiMBst076lYvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="TCdbptC6Hkey6HYbSHSlUwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">MU/1J6u8VEukQZBFAc2A2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Rx5zN26i2k2Fvy+F7kNHTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">ABzc1o7mCkiMBst076lYvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="fV+2hhuvbE+GX25nb51XBwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">MU/1J6u8VEukQZBFAc2A2QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="uI7s6qqcGEqx84dV+JAmqwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-792</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">ABzc1o7mCkiMBst076lYvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="KAXmkwuIp0aDj+4oQ50XfgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-792</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">MU/1J6u8VEukQZBFAc2A2QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="f+FpiX4HAUiGKFcnimx97AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">345,457;345,436;452,436;452,400</XPD:ATTR>
+<XPD:REF name="Model">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">EQYzSHCrWUaPx/wRaFPzOwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="yIipsqN2aUahEVrhm8LOiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="JZ+fwjd92keC3R4jIuX9owAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="FzSHhWKaTke2a/z/KlTxcAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="GYmmwpC+cE+fi1tnRZpY9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5lW8exzmFUirT6PzXp05/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="DeST4IpeUkuKir0N1A+aMQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xx3gzV5BjUSwJg5lsak/CgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="Dsz6KvcRzUGpkTDhjlSRSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5lW8exzmFUirT6PzXp05/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="qcnw+p3bqEiOv/Nwq7EgoQAA">
+<XPD:ATTR name="Alpha" type="real">-5.45433553370487</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">16.2788205960997</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">xx3gzV5BjUSwJg5lsak/CgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="4Xv4IN4btESYQH5UO7Z1cgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5lW8exzmFUirT6PzXp05/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="HTxhSxf5J0WgxsqCKpBMAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xx3gzV5BjUSwJg5lsak/CgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="08SxPJBOcEqe/OQitUB50AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">5lW8exzmFUirT6PzXp05/AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="/LWDzwsu0EawQTr1UGbTVgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">xx3gzV5BjUSwJg5lsak/CgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLAssociationView" guid="qDs4zMrgQUu/VKS9qmKz4wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">308,391;308,457</XPD:ATTR>
+<XPD:REF name="Model">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+<XPD:REF name="Head">EQYzSHCrWUaPx/wRaFPzOwAA</XPD:REF>
+<XPD:REF name="Tail">q4XlSDOPYU+NPe527blyDAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="+fo9wKErd0qKhHlrtKowVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="c9CYUcVs5ESBJb/0NuVAHgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="5MSI9Omy3EKF/ZGqLtDJIAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="naNIibz2akyw2UwxuvDGZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">uIda2Q00s0uCEjYvkFMChwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="8syy+G5BVkCkzztWIIof1gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ePQ/2OtUrky7xn80sS850gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="8JbJbpjl0k+TZK+PrtHQxgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">uIda2Q00s0uCEjYvkFMChwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="qjSUWtPas0G4tIeu/8AH7AAA">
+<XPD:ATTR name="Alpha" type="real">-1.07685413469956</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">14.7648230602334</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">ePQ/2OtUrky7xn80sS850gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="F9vzq6GvgEmLf4KzlJ/wugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">uIda2Q00s0uCEjYvkFMChwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="ClDwYsQriEati/Nbvlx8OQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ePQ/2OtUrky7xn80sS850gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="6a9Hd+IgAEWymmjI9AlFPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">uIda2Q00s0uCEjYvkFMChwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="6QdZ3MQgCkSArLSSrf+kWQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-808</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-652</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">ePQ/2OtUrky7xn80sS850gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLClassView" guid="BXtJ8bydRkaG4zZDEHjyvAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">432</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">332</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
+<XPD:REF name="Model">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="we+qfmlEsEagSD9yC32B2gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="kzHf7LviQkeHQP4ho2aVyQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">container</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="1Sr6fkTd1Ua8jFDdHp/GiAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="g8xf7B4yx0WtOdQbGQPOqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ZrMXdpPY1Ues7G33I2U5/QAA">
+<XPD:REF name="Model">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="hkIt753UDkOqOpsvMF1yugAA">
+<XPD:REF name="Model">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="JYbuLcvZYUuBlwhbmGv9egAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="XbKd2ozKm0KjBH2+B7EbFQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">319,274;432,342</XPD:ATTR>
+<XPD:REF name="Model">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">t73r2IX7MECggYesswXDJAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="cx5HEnUDjkKIcEHbXnmY6QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Xx8upWKNs0SUSG7RBq4LEQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="sNaKIINw7UyrvzWXhDmn8wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="1MMX4GDxXUi7GjKlTVKNVgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">A/HqW/8oKkubU3VPXj3eWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="qt2dV6wVZk2xQ8O7aZwO1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3frzsw0XSEq7O8j/X125ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="RA9vB3//80CoXo0NzBR6rAAA">
+<XPD:ATTR name="Alpha" type="real">-5.35162832296677</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15.6204993518133</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">A/HqW/8oKkubU3VPXj3eWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="/z7KGc76rEaqbSPpLyDtQQAA">
+<XPD:ATTR name="Alpha" type="real">-0.99615158422557</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">16.1245154965971</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">3frzsw0XSEq7O8j/X125ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="nT3LpEfP30ybhNGs+O27TAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">A/HqW/8oKkubU3VPXj3eWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="uiOZ0KB9r0GHM82RdkSvGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">3frzsw0XSEq7O8j/X125ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="ktsmWvzHm0u2QeBz00go2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-928</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-764</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">A/HqW/8oKkubU3VPXj3eWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="FFP7IHWkN0aJxFT/1EqaigAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-928</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-764</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">3frzsw0XSEq7O8j/X125ewAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[12]" type="UMLInterfaceView" guid="nsTcPUP9yEKZ2Ue56O4iCAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">440</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">220</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">61</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">45</XPD:ATTR>
+<XPD:ATTR name="StereotypeDisplay" type="UMLStereotypeDisplayKind">sdkIcon</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="QBDB7b1AN0mIhzokiZSeTgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="dBS5RJ+qwUO+UMh/kehs8gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">implbase</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="9F37XMB4t0CwkkTSbjYlrQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="JJ1turk180WHxQWl+9nmKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="2WZs30HgKkeocNW87z6sVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ibZP/x+DQUur6Dm7HuS6kgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[13]" type="UMLGeneralizationView" guid="m7xPi5BLfkm9e2kcVPCUxAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">470,332;470,264</XPD:ATTR>
+<XPD:REF name="Model">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+<XPD:REF name="Head">nsTcPUP9yEKZ2Ue56O4iCAAA</XPD:REF>
+<XPD:REF name="Tail">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="OEWOhp7dtk26r3VphiSNrwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="dTW+1qCx9E2PbuJZwc7G7gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="0ykP3jgL9kCPtJ/1aOYqQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[14]" type="UMLAssociationView" guid="JGJJrvFGokuwAuL+iejuGQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">500,241;564,241;564,360;511,360</XPD:ATTR>
+<XPD:REF name="Model">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">nsTcPUP9yEKZ2Ue56O4iCAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="wQDxUEaM1k2xJjjWkLsMcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="/xn+temNuE+205GV2L0f2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="xF1jr6X3O0K6c2SVgDv+ywAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="A7inrXPBM0OXakiq/FvO/wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">MhZygEis/U2M0wvtfV4YYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="qnHkuoKx106+BYE+LUQtDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LIobfyFbwUOnOz751BxBWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="731HeOV/+Em/AUMRahjHzAAA">
+<XPD:ATTR name="Alpha" type="real">1.55119089793615</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">102.019605958855</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">MhZygEis/U2M0wvtfV4YYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="FFk2PvxCdUSAWeqc4WyumQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LIobfyFbwUOnOz751BxBWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="KrL9XCcPtUS7ABk0PptIugAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">MhZygEis/U2M0wvtfV4YYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="vE8jpuRvkka3P0mYLJF8iwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">LIobfyFbwUOnOz751BxBWAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="9bw+bjGuTk2UhVE7s6v5ogAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">MhZygEis/U2M0wvtfV4YYQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="bwrWtyvnCEOwkIRJvFxmHAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">LIobfyFbwUOnOz751BxBWAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[15]" type="UMLClassView" guid="2T5uPBt7eke2HwgRYpnCMAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">632</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">457</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="xzvpCjx3UUO9LAc+95tT0QAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="mIghplQgYEaDFw7/W4VqQQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">outputSubDir</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="MpnnOnb92UO9jDS+jbMUvgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="fKT+jXK+KEuav7ebkC6rgAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="//nXFFeA0EKGX1Zc18aCzwAA">
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="S2mAQKq9Y0yCSbV56srKxwAA">
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="9UFPdyghe0mo1UxopenN6wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[16]" type="UMLClassView" guid="m1sFZHb29ECv9kAxRQcW5gAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">736</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">457</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="kU4KEPWs3UOMCMFlezgKOAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="ZFXm8hvaoUSp0QbcAGVmvwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">outputSubDir</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="ky6IKqH5A0ScnBchrjJHBAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="4wI9hfMmPU6Q8eSBnXNhkQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="wRqhwTujYki/Lp4EyXVtRQAA">
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="AsHbUNhps0OQ9BfREA4eNAAA">
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Gj/HOJSfP0is9coJtP6lXwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[17]" type="UMLAssociationView" guid="FqEmtfhZP0yvsRDUVGRNxgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">677,457;677,436;452,436;452,408;453,408;453,400</XPD:ATTR>
+<XPD:REF name="Model">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">2T5uPBt7eke2HwgRYpnCMAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AVpaj5e93UGbI3rCX4aPHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="1UwmvOI8HUKCxNtlxHaCawAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="CSNDh0Zbo0+b8vLXvrfW+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="r6eRUvMhvUmpyOw9Pz6N1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KFvQin5iLEGAVIH9T8e6rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="cQglapci3kmBoYtTQy73RQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">r9ZKI6MesUucCgcfzS0QfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="DR82HdfhIUWzLgMfaRac3wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KFvQin5iLEGAVIH9T8e6rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="2VwG90y+X0CLJoic/n6tFgAA">
+<XPD:ATTR name="Alpha" type="real">-0.88847960161191</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">20.6155281280883</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">r9ZKI6MesUucCgcfzS0QfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="SiywKdY/aEqjgK18qKv7kAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">KFvQin5iLEGAVIH9T8e6rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="WEIx6/fcNU6IgI+i70cmQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">r9ZKI6MesUucCgcfzS0QfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="a8VZOZ5dak+Y8SONKr6evwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1016</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">KFvQin5iLEGAVIH9T8e6rAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="PU0/W99Y9kqy1/6HlGH0pwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1016</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">r9ZKI6MesUucCgcfzS0QfgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[18]" type="UMLAssociationView" guid="dUrSwDKAKEu3+zLxMPZaIwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">781,457;781,436;452,436;452,408;453,408;453,400</XPD:ATTR>
+<XPD:REF name="Model">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+<XPD:REF name="Head">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Tail">m1sFZHb29ECv9kAxRQcW5gAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ERGMmShXbU2+7HxuYHBk8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="ikxxeX8f2kiAUOdxwrywOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="gvSAjIPYrECqd4sajy2j+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="xrwQNzvkYEOLRTC/V2czAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bk8NyfMQ3UuXujm5JaC0lAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="IWyM8Abdp0aFdUyH2LeR+AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">+gLQ5RBZP0y5F8LsLF0a7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="7FAPDNEAe0SiTC9kHSm+BgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bk8NyfMQ3UuXujm5JaC0lAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="wnXqAc2wAEG9IrfIdZskuAAA">
+<XPD:ATTR name="Alpha" type="real">-0.817644881492434</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">21.9317121994613</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Model">+gLQ5RBZP0y5F8LsLF0a7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="xwDzPSmjDEekIiVkDoYaGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">bk8NyfMQ3UuXujm5JaC0lAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="QMt1zHcMLEOZFl1bcJ3FRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">+gLQ5RBZP0y5F8LsLF0a7gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HfV42i/6Tki3op6A+jQ67QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1016</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">bk8NyfMQ3UuXujm5JaC0lAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="uGaNmZ6d6kmSpCLGOymxAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1016</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1000</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">+gLQ5RBZP0y5F8LsLF0a7gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">16</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="dQcGnfO8tUKc0D+z/TWjpgAA">
+<XPD:ATTR name="Name" type="string">common</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">/8Anp5uSOUG7NmHhFk/nrAAA</XPD:REF>
+<XPD:REF name="Associations[1]">2S195WIy+0Syn1xEV2jn8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="A9TZ2/XE7UqgiiSvVEDLQwAA">
+<XPD:ATTR name="Name" type="string">phase</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">N8ckb8OYP0SfE9Y3pFPHeQAA</XPD:REF>
+<XPD:REF name="Views[1]">pGbr5OSan0KaHW/kfKG06gAA</XPD:REF>
+<XPD:REF name="Views[2]">q4nmbqnRj02UOcrLD1YKXgAA</XPD:REF>
+<XPD:REF name="Views[3]">mwWMDNy96U2S95ynkMKM6gAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">mWEP+8jbjE24hKhlVCG8uQAA</XPD:REF>
+<XPD:REF name="Associations[1]">YjWzlZsOqEqUJsdVQD/XAgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="D2ZcmS8StUucJ14/z+mWJwAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">A9TZ2/XE7UqgiiSvVEDLQwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="zjzhCfIGK0Ooz0gx49BvDwAA">
+<XPD:ATTR name="StereotypeName" type="string">implml file</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">t73r2IX7MECggYesswXDJAAA</XPD:REF>
+<XPD:REF name="Views[1]">PI856VbJ1EmqFDdtNo2osAAA</XPD:REF>
+<XPD:REF name="Views[2]">QufBQRkAJEWVH35TPaGEcgAA</XPD:REF>
+<XPD:REF name="Views[3]">OBSt/hkfT0uBJX9vhn/ZYAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">SGqBWylq6kqsO+xgQtMRGQAA</XPD:REF>
+<XPD:REF name="Associations[1]">3frzsw0XSEq7O8j/X125ewAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="DEez7Bc9Uk2h44eLm4tOTAAA">
+<XPD:ATTR name="Name" type="string">tag</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fFUPdkT+cECZRPlQsVRNmgAA</XPD:REF>
+<XPD:REF name="Views[1]">hhUPNV2dYUe93B+roOUBxAAA</XPD:REF>
+<XPD:REF name="Views[2]">IqDATwgrQU+YDY6SgU4zPAAA</XPD:REF>
+<XPD:REF name="Views[3]">C6uIjH9Jz06qP1N9c9sHRgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">Q4SS4jSQ20i54ioZw+85jQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="dPSyznaZc0WzLhRCXcrLkwAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="ucX/sX3LCUuz1PBqgiRTJAAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">DEez7Bc9Uk2h44eLm4tOTAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLClass" guid="hEercfKAykep6GRNpygwAAAA">
+<XPD:ATTR name="Name" type="string">tempfeature</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">q4XlSDOPYU+NPe527blyDAAA</XPD:REF>
+<XPD:REF name="Views[1]">OPmimASZgkeXIjYxldjyCwAA</XPD:REF>
+<XPD:REF name="Views[2]">99Yd5gndkkyskqSs6f7DxgAA</XPD:REF>
+<XPD:REF name="Views[3]">5Z63Ifg2AkSGODIoh2d+pQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">MU/1J6u8VEukQZBFAc2A2QAA</XPD:REF>
+<XPD:REF name="Associations[1]">ePQ/2OtUrky7xn80sS850gAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="V416S1bKKEe9SOUwtXwYRAAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="uFJkRX/TKU+MTJGTSEa0oQAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="GJ875xg+EE6TZNPZD5ctvgAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Owner">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="MuE9xXdvYEODEr1y4vsX9QAA">
+<XPD:ATTR name="Name" type="string">tempseqfeature</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">EQYzSHCrWUaPx/wRaFPzOwAA</XPD:REF>
+<XPD:REF name="Views[1]">WUJqg6xiME6JRZYBE52z6QAA</XPD:REF>
+<XPD:REF name="Views[2]">81QcggEHtESSYNzW/5PV2QAA</XPD:REF>
+<XPD:REF name="Views[3]">VmcXcfWsuU+bWPIkjuPHUgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">xx3gzV5BjUSwJg5lsak/CgAA</XPD:REF>
+<XPD:REF name="Associations[1]">uIda2Q00s0uCEjYvkFMChwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="C/8SGm83TUigyw1G07fNkwAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="ACScvSJbSEqRvLIQ0IWV9AAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">lDijJz+lnkadB0oxsMOAAQAA</XPD:REF>
+<XPD:REF name="Views[1]">JjVQpSvmgEm54HeP9POXvwAA</XPD:REF>
+<XPD:REF name="Views[2]">eoVARvn3OEqynyhClbO8yAAA</XPD:REF>
+<XPD:REF name="Views[3]">0dBBCuYIWkq/zCoyhQ140wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="MU/1J6u8VEukQZBFAc2A2QAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+<XPD:REF name="Participant">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TEn2uTNL9ESnQTpl5oyOKgAA</XPD:REF>
+<XPD:REF name="Views[1]">TCdbptC6Hkey6HYbSHSlUwAA</XPD:REF>
+<XPD:REF name="Views[2]">fV+2hhuvbE+GX25nb51XBwAA</XPD:REF>
+<XPD:REF name="Views[3]">KAXmkwuIp0aDj+4oQ50XfgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="ABzc1o7mCkiMBst076lYvAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">ACScvSJbSEqRvLIQ0IWV9AAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">nXLYOXclLEq/2y6E25OcVAAA</XPD:REF>
+<XPD:REF name="Views[1]">mJZcS8A23UCjjPXR4Js0fgAA</XPD:REF>
+<XPD:REF name="Views[2]">Rx5zN26i2k2Fvy+F7kNHTwAA</XPD:REF>
+<XPD:REF name="Views[3]">uI7s6qqcGEqx84dV+JAmqwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="DefM64TTyU2ZcEZyZ7rTnQAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">f+FpiX4HAUiGKFcnimx97AAA</XPD:REF>
+<XPD:REF name="Views[1]">yIipsqN2aUahEVrhm8LOiwAA</XPD:REF>
+<XPD:REF name="Views[2]">JZ+fwjd92keC3R4jIuX9owAA</XPD:REF>
+<XPD:REF name="Views[3]">FzSHhWKaTke2a/z/KlTxcAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="xx3gzV5BjUSwJg5lsak/CgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+<XPD:REF name="Participant">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">DeST4IpeUkuKir0N1A+aMQAA</XPD:REF>
+<XPD:REF name="Views[1]">qcnw+p3bqEiOv/Nwq7EgoQAA</XPD:REF>
+<XPD:REF name="Views[2]">HTxhSxf5J0WgxsqCKpBMAAAA</XPD:REF>
+<XPD:REF name="Views[3]">/LWDzwsu0EawQTr1UGbTVgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="5lW8exzmFUirT6PzXp05/AAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">DefM64TTyU2ZcEZyZ7rTnQAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">GYmmwpC+cE+fi1tnRZpY9gAA</XPD:REF>
+<XPD:REF name="Views[1]">Dsz6KvcRzUGpkTDhjlSRSQAA</XPD:REF>
+<XPD:REF name="Views[2]">4Xv4IN4btESYQH5UO7Z1cgAA</XPD:REF>
+<XPD:REF name="Views[3]">08SxPJBOcEqe/OQitUB50AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="XoJDBeddjkqF9PVLMr+HVgAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qDs4zMrgQUu/VKS9qmKz4wAA</XPD:REF>
+<XPD:REF name="Views[1]">+fo9wKErd0qKhHlrtKowVQAA</XPD:REF>
+<XPD:REF name="Views[2]">c9CYUcVs5ESBJb/0NuVAHgAA</XPD:REF>
+<XPD:REF name="Views[3]">5MSI9Omy3EKF/ZGqLtDJIAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="ePQ/2OtUrky7xn80sS850gAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+<XPD:REF name="Participant">hEercfKAykep6GRNpygwAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">8syy+G5BVkCkzztWIIof1gAA</XPD:REF>
+<XPD:REF name="Views[1]">qjSUWtPas0G4tIeu/8AH7AAA</XPD:REF>
+<XPD:REF name="Views[2]">ClDwYsQriEati/Nbvlx8OQAA</XPD:REF>
+<XPD:REF name="Views[3]">6QdZ3MQgCkSArLSSrf+kWQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="uIda2Q00s0uCEjYvkFMChwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">XoJDBeddjkqF9PVLMr+HVgAA</XPD:REF>
+<XPD:REF name="Participant">MuE9xXdvYEODEr1y4vsX9QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">naNIibz2akyw2UwxuvDGZgAA</XPD:REF>
+<XPD:REF name="Views[1]">8JbJbpjl0k+TZK+PrtHQxgAA</XPD:REF>
+<XPD:REF name="Views[2]">F9vzq6GvgEmLf4KzlJ/wugAA</XPD:REF>
+<XPD:REF name="Views[3]">6a9Hd+IgAEWymmjI9AlFPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="QHug9JDMF0eIdhAMRc3BlwAA">
+<XPD:ATTR name="Name" type="string">container</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">BXtJ8bydRkaG4zZDEHjyvAAA</XPD:REF>
+<XPD:REF name="Views[1]">ZrMXdpPY1Ues7G33I2U5/QAA</XPD:REF>
+<XPD:REF name="Views[2]">hkIt753UDkOqOpsvMF1yugAA</XPD:REF>
+<XPD:REF name="Views[3]">JYbuLcvZYUuBlwhbmGv9egAA</XPD:REF>
+<XPD:ATTR name="#Generalizations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Generalizations[0]">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">8</XPD:ATTR>
+<XPD:REF name="Associations[0]">ABzc1o7mCkiMBst076lYvAAA</XPD:REF>
+<XPD:REF name="Associations[1]">aULbbut4DECnPwmgTtTx2gAA</XPD:REF>
+<XPD:REF name="Associations[2]">5lW8exzmFUirT6PzXp05/AAA</XPD:REF>
+<XPD:REF name="Associations[3]">eXkeLjSvuU6MRxUlhWndcAAA</XPD:REF>
+<XPD:REF name="Associations[4]">A/HqW/8oKkubU3VPXj3eWQAA</XPD:REF>
+<XPD:REF name="Associations[5]">MhZygEis/U2M0wvtfV4YYQAA</XPD:REF>
+<XPD:REF name="Associations[6]">KFvQin5iLEGAVIH9T8e6rAAA</XPD:REF>
+<XPD:REF name="Associations[7]">bk8NyfMQ3UuXujm5JaC0lAAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="NITS1eFfFUmjGjxSZQzwpQAA">
+<XPD:ATTR name="Name" type="string">condition</XPD:ATTR>
+<XPD:REF name="Owner">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="X5ojQuR3DEGyWzbWB8ErbAAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Owner">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="fOjqr0wnzEqQV2QbncXRyAAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">XbKd2ozKm0KjBH2+B7EbFQAA</XPD:REF>
+<XPD:REF name="Views[1]">cx5HEnUDjkKIcEHbXnmY6QAA</XPD:REF>
+<XPD:REF name="Views[2]">Xx8upWKNs0SUSG7RBq4LEQAA</XPD:REF>
+<XPD:REF name="Views[3]">sNaKIINw7UyrvzWXhDmn8wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="3frzsw0XSEq7O8j/X125ewAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+<XPD:REF name="Participant">zjzhCfIGK0Ooz0gx49BvDwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qt2dV6wVZk2xQ8O7aZwO1QAA</XPD:REF>
+<XPD:REF name="Views[1]">/z7KGc76rEaqbSPpLyDtQQAA</XPD:REF>
+<XPD:REF name="Views[2]">uiOZ0KB9r0GHM82RdkSvGwAA</XPD:REF>
+<XPD:REF name="Views[3]">FFP7IHWkN0aJxFT/1EqaigAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="A/HqW/8oKkubU3VPXj3eWQAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">fOjqr0wnzEqQV2QbncXRyAAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">1MMX4GDxXUi7GjKlTVKNVgAA</XPD:REF>
+<XPD:REF name="Views[1]">RA9vB3//80CoXo0NzBR6rAAA</XPD:REF>
+<XPD:REF name="Views[2]">nT3LpEfP30ybhNGs+O27TAAA</XPD:REF>
+<XPD:REF name="Views[3]">ktsmWvzHm0u2QeBz00go2gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLGeneralization" guid="taqNNc4Me0uannQ7Vlc89gAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:REF name="Child">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:REF name="Parent">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">m7xPi5BLfkm9e2kcVPCUxAAA</XPD:REF>
+<XPD:REF name="Views[1]">OEWOhp7dtk26r3VphiSNrwAA</XPD:REF>
+<XPD:REF name="Views[2]">dTW+1qCx9E2PbuJZwc7G7gAA</XPD:REF>
+<XPD:REF name="Views[3]">0ykP3jgL9kCPtJ/1aOYqQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[12]" type="UMLAssociation" guid="zYO7Oxc95E6KdcR2XpasaAAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JGJJrvFGokuwAuL+iejuGQAA</XPD:REF>
+<XPD:REF name="Views[1]">wQDxUEaM1k2xJjjWkLsMcwAA</XPD:REF>
+<XPD:REF name="Views[2]">/xn+temNuE+205GV2L0f2gAA</XPD:REF>
+<XPD:REF name="Views[3]">xF1jr6X3O0K6c2SVgDv+ywAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="LIobfyFbwUOnOz751BxBWAAA">
+<XPD:REF name="Association">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+<XPD:REF name="Participant">IONricIIR0WGo59WsXpFtgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qnHkuoKx106+BYE+LUQtDwAA</XPD:REF>
+<XPD:REF name="Views[1]">FFk2PvxCdUSAWeqc4WyumQAA</XPD:REF>
+<XPD:REF name="Views[2]">vE8jpuRvkka3P0mYLJF8iwAA</XPD:REF>
+<XPD:REF name="Views[3]">bwrWtyvnCEOwkIRJvFxmHAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="MhZygEis/U2M0wvtfV4YYQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">zYO7Oxc95E6KdcR2XpasaAAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">A7inrXPBM0OXakiq/FvO/wAA</XPD:REF>
+<XPD:REF name="Views[1]">731HeOV/+Em/AUMRahjHzAAA</XPD:REF>
+<XPD:REF name="Views[2]">KrL9XCcPtUS7ABk0PptIugAA</XPD:REF>
+<XPD:REF name="Views[3]">9bw+bjGuTk2UhVE7s6v5ogAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[13]" type="UMLClass" guid="NuUKs/mthU6Lxh76zy/UYwAA">
+<XPD:ATTR name="Name" type="string">outputSubDir</XPD:ATTR>
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">8</XPD:ATTR>
+<XPD:REF name="Views[0]">2T5uPBt7eke2HwgRYpnCMAAA</XPD:REF>
+<XPD:REF name="Views[1]">//nXFFeA0EKGX1Zc18aCzwAA</XPD:REF>
+<XPD:REF name="Views[2]">S2mAQKq9Y0yCSbV56srKxwAA</XPD:REF>
+<XPD:REF name="Views[3]">9UFPdyghe0mo1UxopenN6wAA</XPD:REF>
+<XPD:REF name="Views[4]">m1sFZHb29ECv9kAxRQcW5gAA</XPD:REF>
+<XPD:REF name="Views[5]">wRqhwTujYki/Lp4EyXVtRQAA</XPD:REF>
+<XPD:REF name="Views[6]">AsHbUNhps0OQ9BfREA4eNAAA</XPD:REF>
+<XPD:REF name="Views[7]">Gj/HOJSfP0is9coJtP6lXwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">r9ZKI6MesUucCgcfzS0QfgAA</XPD:REF>
+<XPD:REF name="Associations[1]">+gLQ5RBZP0y5F8LsLF0a7gAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="/3huuVQTZkGWdikB4M/eAAAA">
+<XPD:ATTR name="Name" type="string">value</XPD:ATTR>
+<XPD:REF name="Owner">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[14]" type="UMLAssociation" guid="rzRRpqBkm0yfwy3aI3cqxwAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">FqEmtfhZP0yvsRDUVGRNxgAA</XPD:REF>
+<XPD:REF name="Views[1]">AVpaj5e93UGbI3rCX4aPHQAA</XPD:REF>
+<XPD:REF name="Views[2]">1UwmvOI8HUKCxNtlxHaCawAA</XPD:REF>
+<XPD:REF name="Views[3]">CSNDh0Zbo0+b8vLXvrfW+wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="r9ZKI6MesUucCgcfzS0QfgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+<XPD:REF name="Participant">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">cQglapci3kmBoYtTQy73RQAA</XPD:REF>
+<XPD:REF name="Views[1]">2VwG90y+X0CLJoic/n6tFgAA</XPD:REF>
+<XPD:REF name="Views[2]">WEIx6/fcNU6IgI+i70cmQgAA</XPD:REF>
+<XPD:REF name="Views[3]">PU0/W99Y9kqy1/6HlGH0pwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="KFvQin5iLEGAVIH9T8e6rAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">rzRRpqBkm0yfwy3aI3cqxwAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">r6eRUvMhvUmpyOw9Pz6N1QAA</XPD:REF>
+<XPD:REF name="Views[1]">DR82HdfhIUWzLgMfaRac3wAA</XPD:REF>
+<XPD:REF name="Views[2]">SiywKdY/aEqjgK18qKv7kAAA</XPD:REF>
+<XPD:REF name="Views[3]">a8VZOZ5dak+Y8SONKr6evwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[15]" type="UMLAssociation" guid="BM7xfj//AUeshsMNOxgsxgAA">
+<XPD:REF name="Namespace">nunAvzsMpEeElylKkdpPBgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">dUrSwDKAKEu3+zLxMPZaIwAA</XPD:REF>
+<XPD:REF name="Views[1]">ERGMmShXbU2+7HxuYHBk8gAA</XPD:REF>
+<XPD:REF name="Views[2]">ikxxeX8f2kiAUOdxwrywOwAA</XPD:REF>
+<XPD:REF name="Views[3]">gvSAjIPYrECqd4sajy2j+wAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="+gLQ5RBZP0y5F8LsLF0a7gAA">
+<XPD:ATTR name="Multiplicity" type="string">0..1</XPD:ATTR>
+<XPD:REF name="Association">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+<XPD:REF name="Participant">NuUKs/mthU6Lxh76zy/UYwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">IWyM8Abdp0aFdUyH2LeR+AAA</XPD:REF>
+<XPD:REF name="Views[1]">wnXqAc2wAEG9IrfIdZskuAAA</XPD:REF>
+<XPD:REF name="Views[2]">QMt1zHcMLEOZFl1bcJ3FRAAA</XPD:REF>
+<XPD:REF name="Views[3]">uGaNmZ6d6kmSpCLGOymxAQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="bk8NyfMQ3UuXujm5JaC0lAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">BM7xfj//AUeshsMNOxgsxgAA</XPD:REF>
+<XPD:REF name="Participant">QHug9JDMF0eIdhAMRc3BlwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xrwQNzvkYEOLRTC/V2czAQAA</XPD:REF>
+<XPD:REF name="Views[1]">7FAPDNEAe0SiTC9kHSm+BgAA</XPD:REF>
+<XPD:REF name="Views[2]">xwDzPSmjDEekIiVkDoYaGgAA</XPD:REF>
+<XPD:REF name="Views[3]">HfV42i/6Tki3op6A+jQ67QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[30]" type="UMLSubsystem" guid="I0mGM2cIbES/2vP45srj7AAA">
+<XPD:ATTR name="Name" type="string">imageml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="Oz6AUWlj3Ei96BpX7wdxtAAA">
+<XPD:ATTR name="Name" type="string">imageml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">I0mGM2cIbES/2vP45srj7AAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="QrtSXmbP5Eme/v7a4ua20gAA">
+<XPD:REF name="Diagram">Oz6AUWlj3Ei96BpX7wdxtAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[31]" type="UMLSubsystem" guid="2C+Cmz3pQU69bnFdQ4NEQwAA">
+<XPD:ATTR name="Name" type="string">makeml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="gkjy8NS9rki3NBrJjDqeIQAA">
+<XPD:ATTR name="Name" type="string">makeml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">2C+Cmz3pQU69bnFdQ4NEQwAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="ydWfsf+HbUyXB6EJQYlVpQAA">
+<XPD:REF name="Diagram">gkjy8NS9rki3NBrJjDqeIQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[32]" type="UMLSubsystem" guid="V+1ArsAv8UiFK7JhBEzPggAA">
+<XPD:ATTR name="Name" type="string">gcfml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="XFblftP7akSDLFNty78ILgAA">
+<XPD:ATTR name="Name" type="string">gcfml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="7SZTi65OtESelcg07xpXIAAA">
+<XPD:REF name="Diagram">XFblftP7akSDLFNty78ILgAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="Jdyoma73zU6scrgVlhqoFwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">92</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">20</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="4g4F2/8Pw06Q2AnfsbYqtwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="sWM33uGxaU6yVMXoXNLtHQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">file</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Rql8zuoI6UigrDui4+tvpwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ElumTO0pbEyatRinfta3tgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="b6Qe6bA46UCV3nJ6buDPhwAA">
+<XPD:REF name="Model">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="zywqqoD9KUyEg7H1xCO/XgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="WW2Oq7CWfEC7nZwvSrGpYgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="RcAFldfCDUiCe4pE6ajUiAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">28</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">144</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="KkG16qKrMECsnaOO+ka86AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="+k/0RxZY6Ueh4C1YRZCGRQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">setting</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="myy3HckVhUyHjPjilh5mrAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="ax9yKyISa0+j8TrrA7JPiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="h2CquA3TzEi6huNrhEto7QAA">
+<XPD:REF name="Model">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ncPt0SADRkiyNy3x1MFSRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="TLbO8Rj1AEat/yI9Eu3yjgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="FvMvaBDG0UGqMF8O0M3szQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">80,144;118,78</XPD:ATTR>
+<XPD:REF name="Model">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+<XPD:REF name="Head">Jdyoma73zU6scrgVlhqoFwAA</XPD:REF>
+<XPD:REF name="Tail">RcAFldfCDUiCe4pE6ajUiAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="ufaBujZD9Em/8baqgZCmpAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="EGfsWfiCEU6Kf/4EaZtfpQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="VrnRFooWxE6SvdGe3R4CxAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vhbevDI3jkqKPA+GLeGoOgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">x8TqIv4G1k+wirLi5+frGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="u5KYBJ0gD0mwyu8B9qP6bAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xbbHGPUK5E2jvUJ05zW1gwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="OCEro0FXQU2mFCcx0eAHrwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">x8TqIv4G1k+wirLi5+frGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="cOhivJSweEOQUozlVDTR3QAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">xbbHGPUK5E2jvUJ05zW1gwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="A9YIucGQk0aTrybcJhiIbwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">x8TqIv4G1k+wirLi5+frGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="W5Vgx5cQoUqXCmc1cWrOZgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">xbbHGPUK5E2jvUJ05zW1gwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="sN5mmeLV60KRB1chJ0ZqcgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">x8TqIv4G1k+wirLi5+frGAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="SLd8338SpEeH7wpOgebnvgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">xbbHGPUK5E2jvUJ05zW1gwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="4BYArj9b10+WEoIpPr+QCwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">180</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">144</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">89</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="ykzSTgM6xEO9G8RQu5lB/gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="HmHgQ/zn5ka8k0+x0wLf6QAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">xsl:stylesheet</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="tOObsVI8JEmYNq/2mB6pLgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="tkB07b+kDkq26ZlbA7Z2hAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="dCit6j/vR0Krc5CnE38DLAAA">
+<XPD:REF name="Model">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="/wq5okCFTE+YVXlM9TMd3AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="aD9dNbbDTUWqtpugEURuNgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="W7h/8eYPskmnwomltgs98AAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">207,144;156,78</XPD:ATTR>
+<XPD:REF name="Model">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+<XPD:REF name="Head">Jdyoma73zU6scrgVlhqoFwAA</XPD:REF>
+<XPD:REF name="Tail">4BYArj9b10+WEoIpPr+QCwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="QnpEzK9mVUSyXAu+rxr4VwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lPEPipNPHUqNzkEg7U2N2gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="lhJzUNN3C0+dr2obkO72RQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="LM5L2yTlXkWSxJg3iFAAbwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">m9gWVhQ/zUyuRhIvfKSq8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="47F9iqUijkKxZwLDyvywZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Q/8ql+Vuzkec7bwh1EEGFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="vbLwqjPV+kq0fwJr+tbpGwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">m9gWVhQ/zUyuRhIvfKSq8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="zfzIwdDzbki3Tf8/MJiREgAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">Q/8ql+Vuzkec7bwh1EEGFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="EOeSibSBf0WapJWU8t3sCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">m9gWVhQ/zUyuRhIvfKSq8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="sw1pGy546kSg4kezTSnDaAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">Q/8ql+Vuzkec7bwh1EEGFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="g98LHacOvU6gamPh5UU3TwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">m9gWVhQ/zUyuRhIvfKSq8AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="prP90vWjYUWS06apPPLX0AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Q/8ql+Vuzkec7bwh1EEGFQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="ft2YpT4rYkqiOFoZvMisrgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">112</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">232</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">101</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MTPqElKxk0m8Mq1ZWJzg5gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="9vEO5ARZGkajJigJ/N12dAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">xsl:output</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="D3rO4vCoYUKXYi3qN8yoVAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="RIMU/Dz4j0yFqkO7G3kEKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="ig+6oMwYzEa0sewqxnM2lwAA">
+<XPD:REF name="Model">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ZofOTGjMyUW6UFCCH3w9YwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="16a/3Jl3yUKorvnQOzlduwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="XoMRU3io90G36TQ/U0CVVwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">181,232;209,189</XPD:ATTR>
+<XPD:REF name="Model">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+<XPD:REF name="Head">4BYArj9b10+WEoIpPr+QCwAA</XPD:REF>
+<XPD:REF name="Tail">ft2YpT4rYkqiOFoZvMisrgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="M7v50slC+0yKCFbErqHHfgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="aqXS1Q15d0W7qUC497mnZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="8Cqn7TeIOUGHRx9OlGK/zwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="QGh16Fu90k2L0fMRj3oIngAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zZi5WaO5XE2jkNFbiTMzTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="JYrQNO6xyUaq5AIdWe4g+gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">U6OM61MtzkKCnIJtqrGUgQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="8KhvkOdcXkSMPeOjWJL/MQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zZi5WaO5XE2jkNFbiTMzTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="SrzRH47iSU6J7I70jTI/ngAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">U6OM61MtzkKCnIJtqrGUgQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="lCbO3RXsLEOBxCxuoJV+RQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">zZi5WaO5XE2jkNFbiTMzTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="xPGxjgkc40ikQRYkdn1SlQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">U6OM61MtzkKCnIJtqrGUgQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="90vaJtlEYka3EdcDBkSnxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">zZi5WaO5XE2jkNFbiTMzTAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="WqIHpYMXPUuHcWvd3OKk9AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">U6OM61MtzkKCnIJtqrGUgQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="3AWO9V+LQ0uyIPA+rve3lAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">232</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">244</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">90</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="WbTCJmJ1iU+KM7INSZ0V7AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="dvRI8pw+Akqktd+6QPHFcAAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">xsl:template</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="4+8fLgCU6ka2V6jogP7DlAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="OiDDpchg606BtL/cRDFvlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="WF4wgh1w0Uiw0m1hYwJSVAAA">
+<XPD:REF name="Model">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="ielEBWtNFE6tQN/HC7Qz0AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gqYeILj6cU+Bp1kKF9JMIwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="ZyG1KYn3e0mPcJe3vctoSwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">265,244;236,189</XPD:ATTR>
+<XPD:REF name="Model">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+<XPD:REF name="Head">4BYArj9b10+WEoIpPr+QCwAA</XPD:REF>
+<XPD:REF name="Tail">3AWO9V+LQ0uyIPA+rve3lAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="0WRL5v4YE028/n8q7Mh9xQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="d0490/5xIkSluRKRdEDkQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="St4S9Vu4YkOfMllIJfQ/nAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="xnSs++0eiE+a2PGdWk34ywAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">mFf1jezitEysnpnhm+kZCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="/lBKB9C2jkS36WrjV2lwOAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ZWy+omRz4EOKB/GHl1/T9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="QuGA5NzSpke7sEK1QM0vNQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">mFf1jezitEysnpnhm+kZCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="ayHsdPbbMUCV+JR8AkXGYgAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">ZWy+omRz4EOKB/GHl1/T9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="MGWpYuYFiEm85u2OHMMFJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">mFf1jezitEysnpnhm+kZCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="eht5DkO+x0OD+fY7PqxtBgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">ZWy+omRz4EOKB/GHl1/T9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="1XuthdvMw0qjPjImIxnbswAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">mFf1jezitEysnpnhm+kZCwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="EvpeXFaDRk2yRfxzIa5xOQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">ZWy+omRz4EOKB/GHl1/T9AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="4curCB5tE0y4dYaDqwzFqQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">232</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">344</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:REF name="Model">yPed4fBEF0et5jplS0KL1QAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="0pK83lG8l0ikr14pdkarigAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="iddvmxc9Akuc4KXOJXPYKwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">xsl:</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="5+TKHRT8G0Sr50M9NQkyQgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="mmIaXeZPbEmQMv83VrQIOwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="1GAzUCeYLUKgxkdKoQ+GWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yPed4fBEF0et5jplS0KL1QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="6tTc1fBS3EqovAPepXIllwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yPed4fBEF0et5jplS0KL1QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="OdW6NHCNy0y9YEmyJgQjUgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">yPed4fBEF0et5jplS0KL1QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="/N+UY3fRtkaxXsgXw6oEFgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">275,344;275,289</XPD:ATTR>
+<XPD:REF name="Model">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+<XPD:REF name="Head">3AWO9V+LQ0uyIPA+rve3lAAA</XPD:REF>
+<XPD:REF name="Tail">4curCB5tE0y4dYaDqwzFqQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="WoSQHOaHyUqa92WrXMGZ8AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="JS6F5/ZXRku6yKyW4EdIVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="FFeyvlkJn0+FpgzP5+zvdQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="ZMLtp2NqEkW8wlof8D9tRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GJXnVHy3pUuzUgUCkzK6FgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="kMlEYKfM+EWLa1RfrOo4fwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">cwjGmzSusEOq9Gj4PZo9mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="AChd79+4RkWhwmiHbEdg8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GJXnVHy3pUuzUgUCkzK6FgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="/3FOgLVzXEGGoRG5wTF/IAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Model">cwjGmzSusEOq9Gj4PZo9mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Uz7/dV2+gEKcdrIxcZRC3wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">GJXnVHy3pUuzUgUCkzK6FgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="xxvh5xNXX0mwPq3c4YVUcQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">cwjGmzSusEOq9Gj4PZo9mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="5czjoEZUc0KbwespIPag+wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">GJXnVHy3pUuzUgUCkzK6FgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="RhfmBS/kykCeD+Ht8ZaecwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1148</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-996</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">cwjGmzSusEOq9Gj4PZo9mwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="0NN2NTb+K0GnRvsVagJUAAAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Jdyoma73zU6scrgVlhqoFwAA</XPD:REF>
+<XPD:REF name="Views[1]">b6Qe6bA46UCV3nJ6buDPhwAA</XPD:REF>
+<XPD:REF name="Views[2]">zywqqoD9KUyEg7H1xCO/XgAA</XPD:REF>
+<XPD:REF name="Views[3]">WW2Oq7CWfEC7nZwvSrGpYgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">x8TqIv4G1k+wirLi5+frGAAA</XPD:REF>
+<XPD:REF name="Associations[1]">m9gWVhQ/zUyuRhIvfKSq8AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="fFGuNEkgDUiacWHa6cQejQAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="yZD7pokWBEGuz1aPrZqX6wAA">
+<XPD:ATTR name="Name" type="string">target</XPD:ATTR>
+<XPD:REF name="Owner">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="8xSNygiE4km9qtTz0lwzMQAA">
+<XPD:ATTR name="Name" type="string">setting</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">RcAFldfCDUiCe4pE6ajUiAAA</XPD:REF>
+<XPD:REF name="Views[1]">h2CquA3TzEi6huNrhEto7QAA</XPD:REF>
+<XPD:REF name="Views[2]">ncPt0SADRkiyNy3x1MFSRAAA</XPD:REF>
+<XPD:REF name="Views[3]">TLbO8Rj1AEat/yI9Eu3yjgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">xbbHGPUK5E2jvUJ05zW1gwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="gB5rtjzFn0CPArONbB/V0QAA">
+<XPD:ATTR name="Name" type="string">ref</XPD:ATTR>
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Owner">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="CLkcptWRtUmcTy6uhI1XygAA">
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">FvMvaBDG0UGqMF8O0M3szQAA</XPD:REF>
+<XPD:REF name="Views[1]">ufaBujZD9Em/8baqgZCmpAAA</XPD:REF>
+<XPD:REF name="Views[2]">EGfsWfiCEU6Kf/4EaZtfpQAA</XPD:REF>
+<XPD:REF name="Views[3]">VrnRFooWxE6SvdGe3R4CxAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="xbbHGPUK5E2jvUJ05zW1gwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+<XPD:REF name="Participant">8xSNygiE4km9qtTz0lwzMQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">u5KYBJ0gD0mwyu8B9qP6bAAA</XPD:REF>
+<XPD:REF name="Views[1]">cOhivJSweEOQUozlVDTR3QAA</XPD:REF>
+<XPD:REF name="Views[2]">W5Vgx5cQoUqXCmc1cWrOZgAA</XPD:REF>
+<XPD:REF name="Views[3]">SLd8338SpEeH7wpOgebnvgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="x8TqIv4G1k+wirLi5+frGAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">CLkcptWRtUmcTy6uhI1XygAA</XPD:REF>
+<XPD:REF name="Participant">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vhbevDI3jkqKPA+GLeGoOgAA</XPD:REF>
+<XPD:REF name="Views[1]">OCEro0FXQU2mFCcx0eAHrwAA</XPD:REF>
+<XPD:REF name="Views[2]">A9YIucGQk0aTrybcJhiIbwAA</XPD:REF>
+<XPD:REF name="Views[3]">sN5mmeLV60KRB1chJ0ZqcgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="Y0FG+nLPIkCUVfqHSn052gAA">
+<XPD:ATTR name="Name" type="string">xsl:stylesheet</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4BYArj9b10+WEoIpPr+QCwAA</XPD:REF>
+<XPD:REF name="Views[1]">dCit6j/vR0Krc5CnE38DLAAA</XPD:REF>
+<XPD:REF name="Views[2]">/wq5okCFTE+YVXlM9TMd3AAA</XPD:REF>
+<XPD:REF name="Views[3]">aD9dNbbDTUWqtpugEURuNgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">Q/8ql+Vuzkec7bwh1EEGFQAA</XPD:REF>
+<XPD:REF name="Associations[1]">zZi5WaO5XE2jkNFbiTMzTAAA</XPD:REF>
+<XPD:REF name="Associations[2]">mFf1jezitEysnpnhm+kZCwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="AfxDsw8si0qCRRQdjZorAwAA">
+<XPD:ATTR name="Name" type="string">version</XPD:ATTR>
+<XPD:REF name="Owner">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="Edpn1GnNrkK8TAcwlSjFRwAA">
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">W7h/8eYPskmnwomltgs98AAA</XPD:REF>
+<XPD:REF name="Views[1]">QnpEzK9mVUSyXAu+rxr4VwAA</XPD:REF>
+<XPD:REF name="Views[2]">lPEPipNPHUqNzkEg7U2N2gAA</XPD:REF>
+<XPD:REF name="Views[3]">lhJzUNN3C0+dr2obkO72RQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="Q/8ql+Vuzkec7bwh1EEGFQAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+<XPD:REF name="Participant">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">47F9iqUijkKxZwLDyvywZQAA</XPD:REF>
+<XPD:REF name="Views[1]">zfzIwdDzbki3Tf8/MJiREgAA</XPD:REF>
+<XPD:REF name="Views[2]">sw1pGy546kSg4kezTSnDaAAA</XPD:REF>
+<XPD:REF name="Views[3]">prP90vWjYUWS06apPPLX0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="m9gWVhQ/zUyuRhIvfKSq8AAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">Edpn1GnNrkK8TAcwlSjFRwAA</XPD:REF>
+<XPD:REF name="Participant">0NN2NTb+K0GnRvsVagJUAAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">LM5L2yTlXkWSxJg3iFAAbwAA</XPD:REF>
+<XPD:REF name="Views[1]">vbLwqjPV+kq0fwJr+tbpGwAA</XPD:REF>
+<XPD:REF name="Views[2]">EOeSibSBf0WapJWU8t3sCgAA</XPD:REF>
+<XPD:REF name="Views[3]">g98LHacOvU6gamPh5UU3TwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="1AcPCR57Q0a21p8zgmownwAA">
+<XPD:ATTR name="Name" type="string">xsl:output</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ft2YpT4rYkqiOFoZvMisrgAA</XPD:REF>
+<XPD:REF name="Views[1]">ig+6oMwYzEa0sewqxnM2lwAA</XPD:REF>
+<XPD:REF name="Views[2]">ZofOTGjMyUW6UFCCH3w9YwAA</XPD:REF>
+<XPD:REF name="Views[3]">16a/3Jl3yUKorvnQOzlduwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">U6OM61MtzkKCnIJtqrGUgQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="8lJHuSaY20OzH55JL+PtpwAA">
+<XPD:ATTR name="Name" type="string">method</XPD:ATTR>
+<XPD:REF name="Owner">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Fyp0yUax5UmuskWrbVUf7AAA">
+<XPD:ATTR name="Name" type="string">encoding</XPD:ATTR>
+<XPD:REF name="Owner">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="jKymlkqbbEGJL8hTuA4lowAA">
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">XoMRU3io90G36TQ/U0CVVwAA</XPD:REF>
+<XPD:REF name="Views[1]">M7v50slC+0yKCFbErqHHfgAA</XPD:REF>
+<XPD:REF name="Views[2]">aqXS1Q15d0W7qUC497mnZwAA</XPD:REF>
+<XPD:REF name="Views[3]">8Cqn7TeIOUGHRx9OlGK/zwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="U6OM61MtzkKCnIJtqrGUgQAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+<XPD:REF name="Participant">1AcPCR57Q0a21p8zgmownwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JYrQNO6xyUaq5AIdWe4g+gAA</XPD:REF>
+<XPD:REF name="Views[1]">SrzRH47iSU6J7I70jTI/ngAA</XPD:REF>
+<XPD:REF name="Views[2]">xPGxjgkc40ikQRYkdn1SlQAA</XPD:REF>
+<XPD:REF name="Views[3]">WqIHpYMXPUuHcWvd3OKk9AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="zZi5WaO5XE2jkNFbiTMzTAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">jKymlkqbbEGJL8hTuA4lowAA</XPD:REF>
+<XPD:REF name="Participant">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QGh16Fu90k2L0fMRj3oIngAA</XPD:REF>
+<XPD:REF name="Views[1]">8KhvkOdcXkSMPeOjWJL/MQAA</XPD:REF>
+<XPD:REF name="Views[2]">lCbO3RXsLEOBxCxuoJV+RQAA</XPD:REF>
+<XPD:REF name="Views[3]">90vaJtlEYka3EdcDBkSnxQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="pGXKqhizL0+bptHyaeJW+gAA">
+<XPD:ATTR name="Name" type="string">xsl:template</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">3AWO9V+LQ0uyIPA+rve3lAAA</XPD:REF>
+<XPD:REF name="Views[1]">WF4wgh1w0Uiw0m1hYwJSVAAA</XPD:REF>
+<XPD:REF name="Views[2]">ielEBWtNFE6tQN/HC7Qz0AAA</XPD:REF>
+<XPD:REF name="Views[3]">gqYeILj6cU+Bp1kKF9JMIwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">ZWy+omRz4EOKB/GHl1/T9AAA</XPD:REF>
+<XPD:REF name="Associations[1]">GJXnVHy3pUuzUgUCkzK6FgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="0+j+ftTOxEWtdxn7yLpphgAA">
+<XPD:ATTR name="Name" type="string">match</XPD:ATTR>
+<XPD:REF name="Owner">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="80y69KlvtkyLI9fXZ63EPQAA">
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ZyG1KYn3e0mPcJe3vctoSwAA</XPD:REF>
+<XPD:REF name="Views[1]">0WRL5v4YE028/n8q7Mh9xQAA</XPD:REF>
+<XPD:REF name="Views[2]">d0490/5xIkSluRKRdEDkQwAA</XPD:REF>
+<XPD:REF name="Views[3]">St4S9Vu4YkOfMllIJfQ/nAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="ZWy+omRz4EOKB/GHl1/T9AAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+<XPD:REF name="Participant">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/lBKB9C2jkS36WrjV2lwOAAA</XPD:REF>
+<XPD:REF name="Views[1]">ayHsdPbbMUCV+JR8AkXGYgAA</XPD:REF>
+<XPD:REF name="Views[2]">eht5DkO+x0OD+fY7PqxtBgAA</XPD:REF>
+<XPD:REF name="Views[3]">EvpeXFaDRk2yRfxzIa5xOQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="mFf1jezitEysnpnhm+kZCwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">80y69KlvtkyLI9fXZ63EPQAA</XPD:REF>
+<XPD:REF name="Participant">Y0FG+nLPIkCUVfqHSn052gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">xnSs++0eiE+a2PGdWk34ywAA</XPD:REF>
+<XPD:REF name="Views[1]">QuGA5NzSpke7sEK1QM0vNQAA</XPD:REF>
+<XPD:REF name="Views[2]">MGWpYuYFiEm85u2OHMMFJQAA</XPD:REF>
+<XPD:REF name="Views[3]">1XuthdvMw0qjPjImIxnbswAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="yPed4fBEF0et5jplS0KL1QAA">
+<XPD:ATTR name="Name" type="string">xsl:</XPD:ATTR>
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">4curCB5tE0y4dYaDqwzFqQAA</XPD:REF>
+<XPD:REF name="Views[1]">1GAzUCeYLUKgxkdKoQ+GWAAA</XPD:REF>
+<XPD:REF name="Views[2]">6tTc1fBS3EqovAPepXIllwAA</XPD:REF>
+<XPD:REF name="Views[3]">OdW6NHCNy0y9YEmyJgQjUgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">cwjGmzSusEOq9Gj4PZo9mwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="Y+SiYbvoK0qRL5azXByV0gAA">
+<XPD:REF name="Namespace">V+1ArsAv8UiFK7JhBEzPggAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/N+UY3fRtkaxXsgXw6oEFgAA</XPD:REF>
+<XPD:REF name="Views[1]">WoSQHOaHyUqa92WrXMGZ8AAA</XPD:REF>
+<XPD:REF name="Views[2]">JS6F5/ZXRku6yKyW4EdIVwAA</XPD:REF>
+<XPD:REF name="Views[3]">FFeyvlkJn0+FpgzP5+zvdQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="cwjGmzSusEOq9Gj4PZo9mwAA">
+<XPD:ATTR name="Multiplicity" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Association">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+<XPD:REF name="Participant">yPed4fBEF0et5jplS0KL1QAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kMlEYKfM+EWLa1RfrOo4fwAA</XPD:REF>
+<XPD:REF name="Views[1]">/3FOgLVzXEGGoRG5wTF/IAAA</XPD:REF>
+<XPD:REF name="Views[2]">xxvh5xNXX0mwPq3c4YVUcQAA</XPD:REF>
+<XPD:REF name="Views[3]">RhfmBS/kykCeD+Ht8ZaecwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="GJXnVHy3pUuzUgUCkzK6FgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">Y+SiYbvoK0qRL5azXByV0gAA</XPD:REF>
+<XPD:REF name="Participant">pGXKqhizL0+bptHyaeJW+gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">ZMLtp2NqEkW8wlof8D9tRQAA</XPD:REF>
+<XPD:REF name="Views[1]">AChd79+4RkWhwmiHbEdg8QAA</XPD:REF>
+<XPD:REF name="Views[2]">Uz7/dV2+gEKcdrIxcZRC3wAA</XPD:REF>
+<XPD:REF name="Views[3]">5czjoEZUc0KbwespIPag+wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[33]" type="UMLSubsystem" guid="dJLeoE8dBU6wuilHUj+y3gAA">
+<XPD:ATTR name="Name" type="string">convertprojectml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="zwJUtzHaJU21M83o154H7wAA">
+<XPD:ATTR name="Name" type="string">convertprojectml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="TyP6fIVcrEW6I+xmJyDvUgAA">
+<XPD:REF name="Diagram">zwJUtzHaJU21M83o154H7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">12</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="iv3WNEaVUkyVZFthO5NWpAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">112</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">8</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">109</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="HAfaLTbpckmOJsy9lh5BHgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="2vHYhw7bsEeCGCBb589MjgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">convertprojectml</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="be7Vix6ZkkOk67gY42BGCAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="F3a8m1CtLE+cbQ8fr4rY1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="6GkgL0HFhk2+4p3cHxQuuAAA">
+<XPD:REF name="Model">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="V/OLD6PLJE2sTgoxhFPr5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="GzQ90Lb030+iCObLiCouzQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="VpqNyMzcgUKFjkrP2MYKXAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">20</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">87</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="aEwk8OP18EqmG+c5iQQ0XQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="nZwuglQ9YkmGsYzeHoW/6wAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">targetProject</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="SRUVZNT2gEOdlotZ5MwMMwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="jic+dSAVq0mxoZkV0zrQTwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="TFNnSzLONkCG5/BpZAIeagAA">
+<XPD:REF name="Model">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="NH0nETVU0EuJ6Z9Cz48x5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="cxcTAxaEb0WAQVOnN9psUQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="/fCBgmCAk0CO4akmTB9asAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">87,124;149,50</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+<XPD:REF name="Head">iv3WNEaVUkyVZFthO5NWpAAA</XPD:REF>
+<XPD:REF name="Tail">VpqNyMzcgUKFjkrP2MYKXAAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="FXBHUSeK9Ui4mcgWsbLx9QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="0qBBdcCSTUGu/+qWzhDm3gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="6lcCKGyeb0G994ykTac1FwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="UEiwJZuxV0qiwEruVB/fagAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">4qk8cKW65kie31vCKuC5LQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="D0TN80bW5EOQFb5Q7OrWuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">2+NhaybpyE+grJZ6zRo07AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="VK5ZX7eD/0SyDw7Eufj4vQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">4qk8cKW65kie31vCKuC5LQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="UMxDUG68zkybuet7LtcblAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">2+NhaybpyE+grJZ6zRo07AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="cLLDfyut6kGwvf6NUeypKQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">4qk8cKW65kie31vCKuC5LQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="ovkjWz6hFUSm3YE1E6gPPwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">2+NhaybpyE+grJZ6zRo07AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="JfOr8liXA0SDPav6llhs0QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">4qk8cKW65kie31vCKuC5LQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="uUkbFBONiEK4tQ8+jvGOagAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">2+NhaybpyE+grJZ6zRo07AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="g+ZdW0H0HESi/Ogvi7viDwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">192</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zSCDbjiLIEqjLFKMLGXR2AAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="J2DS1DefmUWAPN+Pppzz3gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">layer</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="YG1LOfL40EK9jgRGkYcBcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Xlcnqy1J6E6vqiE5wiT77gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FH8AkyxL5EOCX+BYa6SrlgAA">
+<XPD:REF name="Model">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="USFNUNhmj0yH1SvfBQEQrQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="qJCGu3GWKEC7Mr7Bh0/wFQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="Se3ExbwAX0azxiV+lhbH1QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">224,124;179,50</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+<XPD:REF name="Head">iv3WNEaVUkyVZFthO5NWpAAA</XPD:REF>
+<XPD:REF name="Tail">g+ZdW0H0HESi/Ogvi7viDwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="vkZ0Fv4Bn0W41OB6HQavDgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="LQR6UWHc4Ea3gcYRzo4rtQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="utBA13fqHEmyRaVuabIumAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="vXzjhvstTkSYH5e+JqNO3QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">v71Cv0dawUKL+j5BmN9CRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="z/UH4Q3Z4EWHKaaR8vvtfQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">e3mjKSqfHkG5KNzBPWb2xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="X5PozNl5cEauMneuFrs07wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">v71Cv0dawUKL+j5BmN9CRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="MqHBFuNZcU2QxpK7I4i2AAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Model">e3mjKSqfHkG5KNzBPWb2xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="4m8gx9uY6U2rKOpnM2P+DQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">v71Cv0dawUKL+j5BmN9CRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="B3JM9SfN6UOJHoBOPeLOXwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">e3mjKSqfHkG5KNzBPWb2xgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="LLo+exIB20+Y44xBRPncQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">v71Cv0dawUKL+j5BmN9CRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="IVcwoQfX5kuC26wihsMOGgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">e3mjKSqfHkG5KNzBPWb2xgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="PTTthVdFJkSuxFmOBKW8BQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">196</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">220</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">56</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="ZZjzm+etd0K7UvX6eS98aAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="VI3cs1bRqEaqPAIHHaYSPQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">folder</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="tAz1nOgII0mBLq9pM7WmaQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="QXfrLpyPKkGQ9vNGyCLOAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="9bTnu14KsU+bjx01kQjXkQAA">
+<XPD:REF name="Model">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="GmVBBTyRTUm5aydZhl8uiQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gbWtSI5IL0yQ4YixznRTJwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="Lh/iX7FeqUC6HaaNzKIcAAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">238,220;237,169</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+<XPD:REF name="Head">g+ZdW0H0HESi/Ogvi7viDwAA</XPD:REF>
+<XPD:REF name="Tail">PTTthVdFJkSuxFmOBKW8BQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="tARUeKesG0+P0dqfJYtPngAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="cXj6zgnDdUS5eb0jbzEIwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="xmSD+TyyiUqlg5UifHLqwgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="g56+K6gaJUCXbCCDMD3yrgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">97iT6tCGKkyCXaz6CZeuLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="JRjeqlUrOEaICyTmumrkZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">uYYWPxyAeUi8S962EuC1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="85EuFW2/n0u7Rs1KNL8DcwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">97iT6tCGKkyCXaz6CZeuLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="8w3hAl+aLUGxp4MbOogPpwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">uYYWPxyAeUi8S962EuC1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="RmHhCI+6KEqr131Pp66AAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">97iT6tCGKkyCXaz6CZeuLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="q1V84zM0+UiTJRerY/Zb9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">uYYWPxyAeUi8S962EuC1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HTJUbsD9PUmlo9tEtonI4QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">97iT6tCGKkyCXaz6CZeuLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="9R4PmO7klkiCMDymCJSl8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">uYYWPxyAeUi8S962EuC1rQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="Lnqf22dPvUeqZR4EVOcXpwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">160</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">332</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="iV+x9nVzKUqRr9QNqwv8mQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="y7S1Al9BgEGxOHMG0dXGDgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">filter</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="EiQONjOjIkmVSvdqHbIjigAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="Sf8v+QCc7Ee6W7fjldtn1AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="Q00ZOYiNLk6FMB7Q9Ph3VQAA">
+<XPD:REF name="Model">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="EcTlqk+l0EiCdWtDxdyvKwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="yHyE5XoFYE+c9l9cF248ZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="YjtBOo0EJ0+pt6FGBWw+IQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">209,332;228,275</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+<XPD:REF name="Head">PTTthVdFJkSuxFmOBKW8BQAA</XPD:REF>
+<XPD:REF name="Tail">Lnqf22dPvUeqZR4EVOcXpwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="4ii7MCdDxECAqwVSN/izogAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="O+wIAw6nZUuvJSFD4dPvzwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="LYAMaqZWTkidLQY+56mMwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="TwxQlo6YgUSxOSvOowV3SQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">LRa97zvNfE6QDL2KMnaL6AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="gEA67EMVs0awcRlwAk8r1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">B23oUY88Cki+zVKzGFAFQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="oz+AsvXI8k6sSenEMRIMwAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">LRa97zvNfE6QDL2KMnaL6AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Asccy8b6nUKktHBeNPW/ogAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">B23oUY88Cki+zVKzGFAFQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="GceYc3HbukmueOkr4LlLVwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">LRa97zvNfE6QDL2KMnaL6AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="GGyyfQFqAkCqRB4ixaIO5QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">B23oUY88Cki+zVKzGFAFQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="I9iPInyOo0O8lKR7r0/CRAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">LRa97zvNfE6QDL2KMnaL6AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="G//iq2AzQEqzixTcs5y4NgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">B23oUY88Cki+zVKzGFAFQwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="TUke9easfU6EiMuTuB0RVgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">212</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">69</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="IoYqnU329k+LT5RhAVP7kQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="pb5tq2nSbEiYfulQOQ69xwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">file</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="gnOFTaP/x0u3pPmC2+CaEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="lgwTg2CwZUK2rA1OkaBN5gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XPOeAYVXIUecTeVh8nZf/gAA">
+<XPD:REF name="Model">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="17HZGDoEvkKQvOS9iEoHZAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="ULFpJlTs30ib6+JsymDRJgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="Y2oggBOnQ0mTJTq1W/N5NQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">159,212;210,169</XPD:ATTR>
+<XPD:REF name="Model">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+<XPD:REF name="Head">g+ZdW0H0HESi/Ogvi7viDwAA</XPD:REF>
+<XPD:REF name="Tail">TUke9easfU6EiMuTuB0RVgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="75mbZhUHuUy+I+SUrwHP7AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="A6S7do0+ikSpnXpUrpSZSQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="hSHjElEcQU+vPwfY9Wv5OwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="bzv1AIGxqUe1OZUf2khOTgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">35JrPMkLO0Gu4ajaIH1veQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Xkj3BF+LL0eEOwn9mDCMsQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">dXGPheZzhEickh57kun1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="qjXGDJbOmkWR5aVjMYp/pAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">35JrPMkLO0Gu4ajaIH1veQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="V8jzTvOiVkaX2OdcsoWdOAAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">dXGPheZzhEickh57kun1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="WBQbtXOaVEa72Rwy5EsQiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">35JrPMkLO0Gu4ajaIH1veQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="IDlxkebmR0KLVuWoA+eg1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">dXGPheZzhEickh57kun1rQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="qz3x7XlZCEmqYD9lMYn43QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">35JrPMkLO0Gu4ajaIH1veQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Bz0v56MxlkOMYPoMFG2ljAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">dXGPheZzhEickh57kun1rQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[11]" type="UMLAssociationView" guid="L1P6nujprEiF4AEy6WsBlQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">179,332;143,280</XPD:ATTR>
+<XPD:REF name="Model">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+<XPD:REF name="Head">TUke9easfU6EiMuTuB0RVgAA</XPD:REF>
+<XPD:REF name="Tail">Lnqf22dPvUeqZR4EVOcXpwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="MVgXXDXydEmyC+X+9tYa6wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Kzv9UMT4DUyxMMJHwH2/HQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="81dN834u0kWtQhb/ahuVuAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Ttzz8EY52U+59ICd4dk+lAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RpCKWviz/k6U/Zb0TlYL0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="MwIsbjaQZkmapb3k7bQUzAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">h36S8nlkK0O/Y12q9bev2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="x8+dMKRJBka8hb42W2vRiwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RpCKWviz/k6U/Zb0TlYL0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Xsf4ZsEsLUec441Bzjng1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">h36S8nlkK0O/Y12q9bev2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="sc6SVZ+Vg0G0J6W8+/CvdQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">RpCKWviz/k6U/Zb0TlYL0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="ubv5ve55f0Kktu9yQ2P3jAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">h36S8nlkK0O/Y12q9bev2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="wKXgxL2co0uBDUhw1ZMX+QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">RpCKWviz/k6U/Zb0TlYL0AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="4G2vvqboTEO7IXr3DavvqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1164</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1160</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">h36S8nlkK0O/Y12q9bev2AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">12</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="pY4k1EkTmk6ZYPgvdrAXtgAA">
+<XPD:ATTR name="Name" type="string">convertprojectml</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">iv3WNEaVUkyVZFthO5NWpAAA</XPD:REF>
+<XPD:REF name="Views[1]">6GkgL0HFhk2+4p3cHxQuuAAA</XPD:REF>
+<XPD:REF name="Views[2]">V/OLD6PLJE2sTgoxhFPr5gAA</XPD:REF>
+<XPD:REF name="Views[3]">GzQ90Lb030+iCObLiCouzQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">4qk8cKW65kie31vCKuC5LQAA</XPD:REF>
+<XPD:REF name="Associations[1]">v71Cv0dawUKL+j5BmN9CRAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="Bd5einjYSUuwBOyRucxDOgAA">
+<XPD:ATTR name="Name" type="string">targetProject</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">VpqNyMzcgUKFjkrP2MYKXAAA</XPD:REF>
+<XPD:REF name="Views[1]">TFNnSzLONkCG5/BpZAIeagAA</XPD:REF>
+<XPD:REF name="Views[2]">NH0nETVU0EuJ6Z9Cz48x5QAA</XPD:REF>
+<XPD:REF name="Views[3]">cxcTAxaEb0WAQVOnN9psUQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">2+NhaybpyE+grJZ6zRo07AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="tXsIUtYt5ECkUyYpOlJx5AAA">
+<XPD:ATTR name="Name" type="string">path</XPD:ATTR>
+<XPD:REF name="Owner">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="wXWt1fHrs0mUZzdzdFzs8AAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="A6cb4Q7lhEuoG/7OMN+p9wAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/fCBgmCAk0CO4akmTB9asAAA</XPD:REF>
+<XPD:REF name="Views[1]">FXBHUSeK9Ui4mcgWsbLx9QAA</XPD:REF>
+<XPD:REF name="Views[2]">0qBBdcCSTUGu/+qWzhDm3gAA</XPD:REF>
+<XPD:REF name="Views[3]">6lcCKGyeb0G994ykTac1FwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="2+NhaybpyE+grJZ6zRo07AAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+<XPD:REF name="Participant">Bd5einjYSUuwBOyRucxDOgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">D0TN80bW5EOQFb5Q7OrWuwAA</XPD:REF>
+<XPD:REF name="Views[1]">UMxDUG68zkybuet7LtcblAAA</XPD:REF>
+<XPD:REF name="Views[2]">ovkjWz6hFUSm3YE1E6gPPwAA</XPD:REF>
+<XPD:REF name="Views[3]">uUkbFBONiEK4tQ8+jvGOagAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="4qk8cKW65kie31vCKuC5LQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">A6cb4Q7lhEuoG/7OMN+p9wAA</XPD:REF>
+<XPD:REF name="Participant">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">UEiwJZuxV0qiwEruVB/fagAA</XPD:REF>
+<XPD:REF name="Views[1]">VK5ZX7eD/0SyDw7Eufj4vQAA</XPD:REF>
+<XPD:REF name="Views[2]">cLLDfyut6kGwvf6NUeypKQAA</XPD:REF>
+<XPD:REF name="Views[3]">JfOr8liXA0SDPav6llhs0QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="8tRKm9V57EqPhwTgLVrWPgAA">
+<XPD:ATTR name="Name" type="string">layer</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">g+ZdW0H0HESi/Ogvi7viDwAA</XPD:REF>
+<XPD:REF name="Views[1]">FH8AkyxL5EOCX+BYa6SrlgAA</XPD:REF>
+<XPD:REF name="Views[2]">USFNUNhmj0yH1SvfBQEQrQAA</XPD:REF>
+<XPD:REF name="Views[3]">qJCGu3GWKEC7Mr7Bh0/wFQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">e3mjKSqfHkG5KNzBPWb2xgAA</XPD:REF>
+<XPD:REF name="Associations[1]">97iT6tCGKkyCXaz6CZeuLgAA</XPD:REF>
+<XPD:REF name="Associations[2]">35JrPMkLO0Gu4ajaIH1veQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="wbc6sI0leEqiA9w2r940OgAA">
+<XPD:ATTR name="Name" type="string">path</XPD:ATTR>
+<XPD:REF name="Owner">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="SSk55GHANUS/X4vl9shC8QAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Se3ExbwAX0azxiV+lhbH1QAA</XPD:REF>
+<XPD:REF name="Views[1]">vkZ0Fv4Bn0W41OB6HQavDgAA</XPD:REF>
+<XPD:REF name="Views[2]">LQR6UWHc4Ea3gcYRzo4rtQAA</XPD:REF>
+<XPD:REF name="Views[3]">utBA13fqHEmyRaVuabIumAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="e3mjKSqfHkG5KNzBPWb2xgAA">
+<XPD:ATTR name="Multiplicity" type="string">1..*</XPD:ATTR>
+<XPD:REF name="Association">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+<XPD:REF name="Participant">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">z/UH4Q3Z4EWHKaaR8vvtfQAA</XPD:REF>
+<XPD:REF name="Views[1]">MqHBFuNZcU2QxpK7I4i2AAAA</XPD:REF>
+<XPD:REF name="Views[2]">B3JM9SfN6UOJHoBOPeLOXwAA</XPD:REF>
+<XPD:REF name="Views[3]">IVcwoQfX5kuC26wihsMOGgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="v71Cv0dawUKL+j5BmN9CRAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">SSk55GHANUS/X4vl9shC8QAA</XPD:REF>
+<XPD:REF name="Participant">pY4k1EkTmk6ZYPgvdrAXtgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">vXzjhvstTkSYH5e+JqNO3QAA</XPD:REF>
+<XPD:REF name="Views[1]">X5PozNl5cEauMneuFrs07wAA</XPD:REF>
+<XPD:REF name="Views[2]">4m8gx9uY6U2rKOpnM2P+DQAA</XPD:REF>
+<XPD:REF name="Views[3]">LLo+exIB20+Y44xBRPncQAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="NcePGMdhZE+ri6hKbPWURgAA">
+<XPD:ATTR name="Name" type="string">folder</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">PTTthVdFJkSuxFmOBKW8BQAA</XPD:REF>
+<XPD:REF name="Views[1]">9bTnu14KsU+bjx01kQjXkQAA</XPD:REF>
+<XPD:REF name="Views[2]">GmVBBTyRTUm5aydZhl8uiQAA</XPD:REF>
+<XPD:REF name="Views[3]">gbWtSI5IL0yQ4YixznRTJwAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">uYYWPxyAeUi8S962EuC1rQAA</XPD:REF>
+<XPD:REF name="Associations[1]">LRa97zvNfE6QDL2KMnaL6AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="3/NxtYzq8U+4t1rWSWFEMQAA">
+<XPD:ATTR name="Name" type="string">path</XPD:ATTR>
+<XPD:REF name="Owner">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="GlHcJZ4KsUGJaYdLveiVFQAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Lh/iX7FeqUC6HaaNzKIcAAAA</XPD:REF>
+<XPD:REF name="Views[1]">tARUeKesG0+P0dqfJYtPngAA</XPD:REF>
+<XPD:REF name="Views[2]">cXj6zgnDdUS5eb0jbzEIwAAA</XPD:REF>
+<XPD:REF name="Views[3]">xmSD+TyyiUqlg5UifHLqwgAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="uYYWPxyAeUi8S962EuC1rQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+<XPD:REF name="Participant">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JRjeqlUrOEaICyTmumrkZAAA</XPD:REF>
+<XPD:REF name="Views[1]">8w3hAl+aLUGxp4MbOogPpwAA</XPD:REF>
+<XPD:REF name="Views[2]">q1V84zM0+UiTJRerY/Zb9gAA</XPD:REF>
+<XPD:REF name="Views[3]">9R4PmO7klkiCMDymCJSl8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="97iT6tCGKkyCXaz6CZeuLgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">GlHcJZ4KsUGJaYdLveiVFQAA</XPD:REF>
+<XPD:REF name="Participant">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">g56+K6gaJUCXbCCDMD3yrgAA</XPD:REF>
+<XPD:REF name="Views[1]">85EuFW2/n0u7Rs1KNL8DcwAA</XPD:REF>
+<XPD:REF name="Views[2]">RmHhCI+6KEqr131Pp66AAAAA</XPD:REF>
+<XPD:REF name="Views[3]">HTJUbsD9PUmlo9tEtonI4QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="MinkjMMmj0WnGAFffRPN7AAA">
+<XPD:ATTR name="Name" type="string">filter</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Lnqf22dPvUeqZR4EVOcXpwAA</XPD:REF>
+<XPD:REF name="Views[1]">Q00ZOYiNLk6FMB7Q9Ph3VQAA</XPD:REF>
+<XPD:REF name="Views[2]">EcTlqk+l0EiCdWtDxdyvKwAA</XPD:REF>
+<XPD:REF name="Views[3]">yHyE5XoFYE+c9l9cF248ZAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">B23oUY88Cki+zVKzGFAFQwAA</XPD:REF>
+<XPD:REF name="Associations[1]">h36S8nlkK0O/Y12q9bev2AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="nB4Po/q5kUim45wTd1u9zAAA">
+<XPD:ATTR name="Name" type="string">action</XPD:ATTR>
+<XPD:REF name="Owner">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="21CzzkWdl0WPR0vZchuEfgAA">
+<XPD:ATTR name="Name" type="string">data</XPD:ATTR>
+<XPD:REF name="Owner">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="dm/HWW2igUWAx0IfHYYNFQAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">YjtBOo0EJ0+pt6FGBWw+IQAA</XPD:REF>
+<XPD:REF name="Views[1]">4ii7MCdDxECAqwVSN/izogAA</XPD:REF>
+<XPD:REF name="Views[2]">O+wIAw6nZUuvJSFD4dPvzwAA</XPD:REF>
+<XPD:REF name="Views[3]">LYAMaqZWTkidLQY+56mMwAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="B23oUY88Cki+zVKzGFAFQwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+<XPD:REF name="Participant">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">gEA67EMVs0awcRlwAk8r1wAA</XPD:REF>
+<XPD:REF name="Views[1]">Asccy8b6nUKktHBeNPW/ogAA</XPD:REF>
+<XPD:REF name="Views[2]">GGyyfQFqAkCqRB4ixaIO5QAA</XPD:REF>
+<XPD:REF name="Views[3]">G//iq2AzQEqzixTcs5y4NgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="LRa97zvNfE6QDL2KMnaL6AAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">dm/HWW2igUWAx0IfHYYNFQAA</XPD:REF>
+<XPD:REF name="Participant">NcePGMdhZE+ri6hKbPWURgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TwxQlo6YgUSxOSvOowV3SQAA</XPD:REF>
+<XPD:REF name="Views[1]">oz+AsvXI8k6sSenEMRIMwAAA</XPD:REF>
+<XPD:REF name="Views[2]">GceYc3HbukmueOkr4LlLVwAA</XPD:REF>
+<XPD:REF name="Views[3]">I9iPInyOo0O8lKR7r0/CRAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="GSN9ennMhUCX9bSMU2RbvAAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">TUke9easfU6EiMuTuB0RVgAA</XPD:REF>
+<XPD:REF name="Views[1]">XPOeAYVXIUecTeVh8nZf/gAA</XPD:REF>
+<XPD:REF name="Views[2]">17HZGDoEvkKQvOS9iEoHZAAA</XPD:REF>
+<XPD:REF name="Views[3]">ULFpJlTs30ib6+JsymDRJgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">dXGPheZzhEickh57kun1rQAA</XPD:REF>
+<XPD:REF name="Associations[1]">RpCKWviz/k6U/Zb0TlYL0AAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="jAXth+tMiUSSq+fATdc8/QAA">
+<XPD:ATTR name="Name" type="string">type</XPD:ATTR>
+<XPD:REF name="Owner">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="wq4/lWMoSkK6IE/5NS1gtwAA">
+<XPD:ATTR name="Name" type="string">path</XPD:ATTR>
+<XPD:REF name="Owner">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="k4g3SQ7ifkqOQmiq3Ews0gAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Y2oggBOnQ0mTJTq1W/N5NQAA</XPD:REF>
+<XPD:REF name="Views[1]">75mbZhUHuUy+I+SUrwHP7AAA</XPD:REF>
+<XPD:REF name="Views[2]">A6S7do0+ikSpnXpUrpSZSQAA</XPD:REF>
+<XPD:REF name="Views[3]">hSHjElEcQU+vPwfY9Wv5OwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="dXGPheZzhEickh57kun1rQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+<XPD:REF name="Participant">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Xkj3BF+LL0eEOwn9mDCMsQAA</XPD:REF>
+<XPD:REF name="Views[1]">V8jzTvOiVkaX2OdcsoWdOAAA</XPD:REF>
+<XPD:REF name="Views[2]">IDlxkebmR0KLVuWoA+eg1wAA</XPD:REF>
+<XPD:REF name="Views[3]">Bz0v56MxlkOMYPoMFG2ljAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="35JrPMkLO0Gu4ajaIH1veQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">k4g3SQ7ifkqOQmiq3Ews0gAA</XPD:REF>
+<XPD:REF name="Participant">8tRKm9V57EqPhwTgLVrWPgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">bzv1AIGxqUe1OZUf2khOTgAA</XPD:REF>
+<XPD:REF name="Views[1]">qjXGDJbOmkWR5aVjMYp/pAAA</XPD:REF>
+<XPD:REF name="Views[2]">WBQbtXOaVEa72Rwy5EsQiwAA</XPD:REF>
+<XPD:REF name="Views[3]">qz3x7XlZCEmqYD9lMYn43QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[11]" type="UMLAssociation" guid="J56fu3iSu0mLjzTyb5mWsQAA">
+<XPD:REF name="Namespace">dJLeoE8dBU6wuilHUj+y3gAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">L1P6nujprEiF4AEy6WsBlQAA</XPD:REF>
+<XPD:REF name="Views[1]">MVgXXDXydEmyC+X+9tYa6wAA</XPD:REF>
+<XPD:REF name="Views[2]">Kzv9UMT4DUyxMMJHwH2/HQAA</XPD:REF>
+<XPD:REF name="Views[3]">81dN834u0kWtQhb/ahuVuAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="h36S8nlkK0O/Y12q9bev2AAA">
+<XPD:REF name="Association">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+<XPD:REF name="Participant">MinkjMMmj0WnGAFffRPN7AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">MwIsbjaQZkmapb3k7bQUzAAA</XPD:REF>
+<XPD:REF name="Views[1]">Xsf4ZsEsLUec441Bzjng1wAA</XPD:REF>
+<XPD:REF name="Views[2]">ubv5ve55f0Kktu9yQ2P3jAAA</XPD:REF>
+<XPD:REF name="Views[3]">4G2vvqboTEO7IXr3DavvqAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="RpCKWviz/k6U/Zb0TlYL0AAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">J56fu3iSu0mLjzTyb5mWsQAA</XPD:REF>
+<XPD:REF name="Participant">GSN9ennMhUCX9bSMU2RbvAAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Ttzz8EY52U+59ICd4dk+lAAA</XPD:REF>
+<XPD:REF name="Views[1]">x8+dMKRJBka8hb42W2vRiwAA</XPD:REF>
+<XPD:REF name="Views[2]">sc6SVZ+Vg0G0J6W8+/CvdQAA</XPD:REF>
+<XPD:REF name="Views[3]">wKXgxL2co0uBDUhw1ZMX+QAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[34]" type="UMLSubsystem" guid="NBOnOHSop0qGcP1sMvuIqQAA">
+<XPD:ATTR name="Name" type="string">templateml</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="1tS2Rly7fkeaiJArnuzjggAA">
+<XPD:ATTR name="Name" type="string">templateml</XPD:ATTR>
+<XPD:REF name="DiagramOwner">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="iSJaGesu3U2BifCQcvp2fAAA">
+<XPD:REF name="Diagram">1tS2Rly7fkeaiJArnuzjggAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">8</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="U1r4twqdtE+71hOpS9c6sAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">108</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">12</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">101</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="wQeoOwNeH0WG9FLNhZcYKwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="Hl509bbut020fIEgIaj06AAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">templateml</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="RBnvIc36RkmWQRW6gyzgAgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="uR6OCE6e/EeM9zq7EKOFsgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="LVdRWi1iH0OtdwU8dffOYgAA">
+<XPD:REF name="Model">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="hXenmLyknUmGK8tw6YzZjQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="pViY1MZuNkSbcz+EvsaSIAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="OhfpUSWcwEes0nqeEAqNMgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">24</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">90</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">82</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="PQ2lbrjm9kexDp4J5JMXcAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="v4f1CFfJj0WIoraxl/e9/gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">output</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="7lDCBRK2RkKjVpGBM931YAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="eyyHx623R0iUNIbGc3dobwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="xTtj+2BgCUaJGfXDE4epKgAA">
+<XPD:REF name="Model">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="5T5QIJs5bkC3yFRHD+CS3gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="Q5IVhcazmkeovkvlbY+7gAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLAssociationView" guid="QTh97p8rQkKdA6/nPPCCOAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">95,124;143,54</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+<XPD:REF name="Head">U1r4twqdtE+71hOpS9c6sAAA</XPD:REF>
+<XPD:REF name="Tail">OhfpUSWcwEes0nqeEAqNMgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="EhE6sNZekEWoEMy8Bd+M1gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="mU0wtyD+3kCN+W194GZOHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="aRHEKIfKo0S6iBJ1ykt1OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="qCOzbMssm0q4DHiI1Be8YgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">VkpSC2YwLEqelxDb3MRkbAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="jaK0YKFkUUufuE1bN5mg6AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">p8U+8eh9YEu7vfqSGdIDQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="FvAf8GPhyEKfv7wyV3MyqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">VkpSC2YwLEqelxDb3MRkbAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="d3sRf7EUbEOYq9oSMPniQwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">p8U+8eh9YEu7vfqSGdIDQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="uTzQ5W67IUa+s0DysLvqcAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">VkpSC2YwLEqelxDb3MRkbAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="08gFHdTU7Eu73RKfKRuICwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">p8U+8eh9YEu7vfqSGdIDQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="tVphH9XkO0GwweAEJtO4JwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">VkpSC2YwLEqelxDb3MRkbAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Ws91SXD/3ECAejMthIpPIQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">p8U+8eh9YEu7vfqSGdIDQwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="/WUCCxjEGkKy+g9J7mc5hgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">176</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">136</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">59</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="htq92O7W0UmYe0lSno0XyAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="CagW4xUPSky5HSMVP09A0gAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">filter</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="rVOwRxou+kOmrrVD62rHvgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="PxZPLXNa+Ueb+UxVAEZr7AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="cOkP/ZDLd0WR/bhe2mHrGAAA">
+<XPD:REF name="Model">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="bx3/IIWKoU6ssJVLpr0IjwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="n8q1I0IwC0KSCpOC4GvUBQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="/XcOpl6Eakq9m3pREzu2qgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">205,136;168,54</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+<XPD:REF name="Head">U1r4twqdtE+71hOpS9c6sAAA</XPD:REF>
+<XPD:REF name="Tail">/WUCCxjEGkKy+g9J7mc5hgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="8A+IJWuUZECFDK8+ROtirQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="y2tg1tZQREa1mE1Bhanz1QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="pqpwqQc5FEm3M4QjeEtmkwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="FIDSh1RQYkqNGRJAqMGHQAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wg6dzEuNJEWFxVFa578pzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="tIq0+N/SMEWS7Ul9hUgAIwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">fnL+Az0cLkG7ny/btlA/nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="xIQ5HmOlHk2wF2lSey1lfAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wg6dzEuNJEWFxVFa578pzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="Uf6u9IJwmEetzhAnYu34RwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">fnL+Az0cLkG7ny/btlA/nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="Lo+LK5HzZUWe66RLyHRjHQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">Wg6dzEuNJEWFxVFa578pzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Mn1ysS8ZH0e91EC1bKYIVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">fnL+Az0cLkG7ny/btlA/nQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="NCzGopwd1EyU2Ii4xVWsZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">Wg6dzEuNJEWFxVFa578pzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="hJB7vnssxU6XBUKdZH906wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">fnL+Az0cLkG7ny/btlA/nQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLClassView" guid="wLwFsbh+D06trOxi89tn3QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">28</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">268</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">46</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="tn7aaStUO0SfpZjp3TwrlQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="xaYI6X+zd0OjMwGJVuNpogAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">template</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="iSFTRfZkAE23n3DPhvZb0QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="bnAijTE6e0iSGVocya9L7QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="FDzG0KM06UiF3jchy3fdbQAA">
+<XPD:REF name="Model">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="1PCwzXhrn0GqIHSHgKvqXgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="LoFXPjHYJEq9GA0ynoRJkAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="jcovGPVQI0GxHprQUKJgSQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">68,268;68,205</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+<XPD:REF name="Head">OhfpUSWcwEes0nqeEAqNMgAA</XPD:REF>
+<XPD:REF name="Tail">wLwFsbh+D06trOxi89tn3QAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="7hlkM0b0uE6lAbNPX2DPCgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="vNb1nL8N70+WUu7ldlU4ZQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="x5H+UXze7USmBJWDOZbvjAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="Pvjs451lBUmXyIiNz25/owAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">JE4UMolSLUCkhgzIjPusxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="BOzMiL32Sk+Y7NTaTQSFuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">fqzkaBDTOkWXymGMvmkWpQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="HD0dWWNupk+4YB2bF7uVjwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">JE4UMolSLUCkhgzIjPusxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="vogdshwKAk+g75I3DUPZYwAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">1</XPD:ATTR>
+<XPD:REF name="Model">fqzkaBDTOkWXymGMvmkWpQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="qH29/3IAg0OK800Zst2o8gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">JE4UMolSLUCkhgzIjPusxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="QB70zNO4iEipl2M2cwA4pQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">fqzkaBDTOkWXymGMvmkWpQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="HNWZYjgXWEmpaaZwzOH0agAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">JE4UMolSLUCkhgzIjPusxgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="o09/ZLSLA0CIuhO1WTv0oAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">fqzkaBDTOkWXymGMvmkWpQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLAssociationView" guid="Bxm0PcO3HkGzYIa/07SA+QAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="LineStyle" type="LineStyleKind">lsRectilinear</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">176,165;113,165</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+<XPD:REF name="Head">OhfpUSWcwEes0nqeEAqNMgAA</XPD:REF>
+<XPD:REF name="Tail">/WUCCxjEGkKy+g9J7mc5hgAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="zlHXniU8HkWXeXAvi8LC3wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="iqQ2fTYWCk2bVl0V8L8bAQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="qkJEISgeakevZZjEoEYYZwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="OJhw/l7OF0KqUw32zCJohQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qpJxc0PXGkyV1V6W0racVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="oMFnGwPi3EWXGH6rFNCaVQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">K5dsg2gf9kyvrWslEbV/QgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="qPXhNcsZ8kywAauSvgVxLQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qpJxc0PXGkyV1V6W0racVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="+cSNeipqp0O4evP77LJR8wAA">
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Model">K5dsg2gf9kyvrWslEbV/QgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="t3C2Ivb82Eqy6kEX7PkV+gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">qpJxc0PXGkyV1V6W0racVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="1loZyamgOky2w3Y+/JUNMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">K5dsg2gf9kyvrWslEbV/QgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="KjYuXW8P7UmFm4NiMC/GJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">qpJxc0PXGkyV1V6W0racVwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="Gefp+1/1ZUK9l9a5GSta9gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1064</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1140</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">K5dsg2gf9kyvrWslEbV/QgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">8</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="ZZqfHIjqoES//zvmLYmGvQAA">
+<XPD:ATTR name="Name" type="string">templateml</XPD:ATTR>
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">U1r4twqdtE+71hOpS9c6sAAA</XPD:REF>
+<XPD:REF name="Views[1]">LVdRWi1iH0OtdwU8dffOYgAA</XPD:REF>
+<XPD:REF name="Views[2]">hXenmLyknUmGK8tw6YzZjQAA</XPD:REF>
+<XPD:REF name="Views[3]">pViY1MZuNkSbcz+EvsaSIAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">VkpSC2YwLEqelxDb3MRkbAAA</XPD:REF>
+<XPD:REF name="Associations[1]">Wg6dzEuNJEWFxVFa578pzgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="HmWD/itgh0y3rMseN13BUgAA">
+<XPD:ATTR name="Name" type="string">output</XPD:ATTR>
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">OhfpUSWcwEes0nqeEAqNMgAA</XPD:REF>
+<XPD:REF name="Views[1]">xTtj+2BgCUaJGfXDE4epKgAA</XPD:REF>
+<XPD:REF name="Views[2]">5T5QIJs5bkC3yFRHD+CS3gAA</XPD:REF>
+<XPD:REF name="Views[3]">Q5IVhcazmkeovkvlbY+7gAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">p8U+8eh9YEu7vfqSGdIDQwAA</XPD:REF>
+<XPD:REF name="Associations[1]">JE4UMolSLUCkhgzIjPusxgAA</XPD:REF>
+<XPD:REF name="Associations[2]">qpJxc0PXGkyV1V6W0racVwAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">3</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="BRH6CwXo506Ob8gYLXSusQAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Owner">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="Ov2Fh1pcLEaYcTrygwJ2KwAA">
+<XPD:ATTR name="Name" type="string">encoding</XPD:ATTR>
+<XPD:REF name="Owner">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[2]" type="UMLAttribute" guid="3C1QC8QHmEKnMv7eZz1x4gAA">
+<XPD:ATTR name="Name" type="string">dir</XPD:ATTR>
+<XPD:REF name="Owner">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLAssociation" guid="A1nvBhHM00+kYXoRN/m94gAA">
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">QTh97p8rQkKdA6/nPPCCOAAA</XPD:REF>
+<XPD:REF name="Views[1]">EhE6sNZekEWoEMy8Bd+M1gAA</XPD:REF>
+<XPD:REF name="Views[2]">mU0wtyD+3kCN+W194GZOHQAA</XPD:REF>
+<XPD:REF name="Views[3]">aRHEKIfKo0S6iBJ1ykt1OAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="p8U+8eh9YEu7vfqSGdIDQwAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+<XPD:REF name="Participant">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">jaK0YKFkUUufuE1bN5mg6AAA</XPD:REF>
+<XPD:REF name="Views[1]">d3sRf7EUbEOYq9oSMPniQwAA</XPD:REF>
+<XPD:REF name="Views[2]">08gFHdTU7Eu73RKfKRuICwAA</XPD:REF>
+<XPD:REF name="Views[3]">Ws91SXD/3ECAejMthIpPIQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="VkpSC2YwLEqelxDb3MRkbAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">A1nvBhHM00+kYXoRN/m94gAA</XPD:REF>
+<XPD:REF name="Participant">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">qCOzbMssm0q4DHiI1Be8YgAA</XPD:REF>
+<XPD:REF name="Views[1]">FvAf8GPhyEKfv7wyV3MyqAAA</XPD:REF>
+<XPD:REF name="Views[2]">uTzQ5W67IUa+s0DysLvqcAAA</XPD:REF>
+<XPD:REF name="Views[3]">tVphH9XkO0GwweAEJtO4JwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="Xhfbq+Z8AkehSoc9Hm/TFQAA">
+<XPD:ATTR name="Name" type="string">filter</XPD:ATTR>
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/WUCCxjEGkKy+g9J7mc5hgAA</XPD:REF>
+<XPD:REF name="Views[1]">cOkP/ZDLd0WR/bhe2mHrGAAA</XPD:REF>
+<XPD:REF name="Views[2]">bx3/IIWKoU6ssJVLpr0IjwAA</XPD:REF>
+<XPD:REF name="Views[3]">n8q1I0IwC0KSCpOC4GvUBQAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">2</XPD:ATTR>
+<XPD:REF name="Associations[0]">fnL+Az0cLkG7ny/btlA/nQAA</XPD:REF>
+<XPD:REF name="Associations[1]">K5dsg2gf9kyvrWslEbV/QgAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="261vBr3wukGCA/t4pTCA5AAA">
+<XPD:ATTR name="Name" type="string">name</XPD:ATTR>
+<XPD:REF name="Owner">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Attributes[1]" type="UMLAttribute" guid="vZSRbguNGkqoVfm42lz1PQAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Owner">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="aKV3lamzTUOWSLJLamrmZgAA">
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">/XcOpl6Eakq9m3pREzu2qgAA</XPD:REF>
+<XPD:REF name="Views[1]">8A+IJWuUZECFDK8+ROtirQAA</XPD:REF>
+<XPD:REF name="Views[2]">y2tg1tZQREa1mE1Bhanz1QAA</XPD:REF>
+<XPD:REF name="Views[3]">pqpwqQc5FEm3M4QjeEtmkwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="fnL+Az0cLkG7ny/btlA/nQAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+<XPD:REF name="Participant">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tIq0+N/SMEWS7Ul9hUgAIwAA</XPD:REF>
+<XPD:REF name="Views[1]">Uf6u9IJwmEetzhAnYu34RwAA</XPD:REF>
+<XPD:REF name="Views[2]">Mn1ysS8ZH0e91EC1bKYIVQAA</XPD:REF>
+<XPD:REF name="Views[3]">hJB7vnssxU6XBUKdZH906wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="Wg6dzEuNJEWFxVFa578pzgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">aKV3lamzTUOWSLJLamrmZgAA</XPD:REF>
+<XPD:REF name="Participant">ZZqfHIjqoES//zvmLYmGvQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">FIDSh1RQYkqNGRJAqMGHQAAA</XPD:REF>
+<XPD:REF name="Views[1]">xIQ5HmOlHk2wF2lSey1lfAAA</XPD:REF>
+<XPD:REF name="Views[2]">Lo+LK5HzZUWe66RLyHRjHQAA</XPD:REF>
+<XPD:REF name="Views[3]">NCzGopwd1EyU2Ii4xVWsZQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLClass" guid="62pu/fhna0alwjKTg6UxrgAA">
+<XPD:ATTR name="Name" type="string">template</XPD:ATTR>
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">wLwFsbh+D06trOxi89tn3QAA</XPD:REF>
+<XPD:REF name="Views[1]">FDzG0KM06UiF3jchy3fdbQAA</XPD:REF>
+<XPD:REF name="Views[2]">1PCwzXhrn0GqIHSHgKvqXgAA</XPD:REF>
+<XPD:REF name="Views[3]">LoFXPjHYJEq9GA0ynoRJkAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">fqzkaBDTOkWXymGMvmkWpQAA</XPD:REF>
+<XPD:ATTR name="#Attributes" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="Attributes[0]" type="UMLAttribute" guid="qEBG+Cix9ki6mDwZ0vjK9wAA">
+<XPD:ATTR name="Name" type="string">file</XPD:ATTR>
+<XPD:REF name="Owner">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="J8S7UzExwUe/hB627vCc2AAA">
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">jcovGPVQI0GxHprQUKJgSQAA</XPD:REF>
+<XPD:REF name="Views[1]">7hlkM0b0uE6lAbNPX2DPCgAA</XPD:REF>
+<XPD:REF name="Views[2]">vNb1nL8N70+WUu7ldlU4ZQAA</XPD:REF>
+<XPD:REF name="Views[3]">x5H+UXze7USmBJWDOZbvjAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="fqzkaBDTOkWXymGMvmkWpQAA">
+<XPD:ATTR name="Multiplicity" type="string">1</XPD:ATTR>
+<XPD:REF name="Association">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+<XPD:REF name="Participant">62pu/fhna0alwjKTg6UxrgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">BOzMiL32Sk+Y7NTaTQSFuQAA</XPD:REF>
+<XPD:REF name="Views[1]">vogdshwKAk+g75I3DUPZYwAA</XPD:REF>
+<XPD:REF name="Views[2]">QB70zNO4iEipl2M2cwA4pQAA</XPD:REF>
+<XPD:REF name="Views[3]">o09/ZLSLA0CIuhO1WTv0oAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="JE4UMolSLUCkhgzIjPusxgAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">J8S7UzExwUe/hB627vCc2AAA</XPD:REF>
+<XPD:REF name="Participant">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Pvjs451lBUmXyIiNz25/owAA</XPD:REF>
+<XPD:REF name="Views[1]">HD0dWWNupk+4YB2bF7uVjwAA</XPD:REF>
+<XPD:REF name="Views[2]">qH29/3IAg0OK800Zst2o8gAA</XPD:REF>
+<XPD:REF name="Views[3]">HNWZYjgXWEmpaaZwzOH0agAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLAssociation" guid="i0gr6XmS8E2A1MzxSYycBgAA">
+<XPD:REF name="Namespace">NBOnOHSop0qGcP1sMvuIqQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Bxm0PcO3HkGzYIa/07SA+QAA</XPD:REF>
+<XPD:REF name="Views[1]">zlHXniU8HkWXeXAvi8LC3wAA</XPD:REF>
+<XPD:REF name="Views[2]">iqQ2fTYWCk2bVl0V8L8bAQAA</XPD:REF>
+<XPD:REF name="Views[3]">qkJEISgeakevZZjEoEYYZwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="K5dsg2gf9kyvrWslEbV/QgAA">
+<XPD:ATTR name="Multiplicity" type="string">0..*</XPD:ATTR>
+<XPD:REF name="Association">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+<XPD:REF name="Participant">Xhfbq+Z8AkehSoc9Hm/TFQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oMFnGwPi3EWXGH6rFNCaVQAA</XPD:REF>
+<XPD:REF name="Views[1]">+cSNeipqp0O4evP77LJR8wAA</XPD:REF>
+<XPD:REF name="Views[2]">1loZyamgOky2w3Y+/JUNMAAA</XPD:REF>
+<XPD:REF name="Views[3]">Gefp+1/1ZUK9l9a5GSta9gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="qpJxc0PXGkyV1V6W0racVwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">i0gr6XmS8E2A1MzxSYycBgAA</XPD:REF>
+<XPD:REF name="Participant">HmWD/itgh0y3rMseN13BUgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">OJhw/l7OF0KqUw32zCJohQAA</XPD:REF>
+<XPD:REF name="Views[1]">qPXhNcsZ8kywAauSvgVxLQAA</XPD:REF>
+<XPD:REF name="Views[2]">t3C2Ivb82Eqy6kEX7PkV+gAA</XPD:REF>
+<XPD:REF name="Views[3]">KjYuXW8P7UmFm4NiMC/GJQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[35]" type="UMLSubsystem" guid="AXaa4fXnMkSQbYhO++BySwAA">
+<XPD:ATTR name="Name" type="string">thememl</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="dsXIkwC9eUGhfkNKhAbscwAA">
+<XPD:ATTR name="Name" type="string">thememl</XPD:ATTR>
+<XPD:REF name="DiagramOwner">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="LAjHnclXkUeXyv3oUTrMUgAA">
+<XPD:REF name="Diagram">dsXIkwC9eUGhfkNKhAbscwAA</XPD:REF>
+<XPD:ATTR name="#OwnedViews" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="OwnedViews[0]" type="UMLClassView" guid="mhHfj6aZiUChhByPx5R1JwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">124</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">24</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="/ReJdGOazUqxAl6rihFSpAAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="cm+whnQ2yUe+asgSxbgDgQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">thememl</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="EwMVfwca5Ey1MNsVeKvAPQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="LQTQ9Nj5c0aT8XO7NbkIWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="F+df4ro24kugCVNjAI4JkAAA">
+<XPD:REF name="Model">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="3TTpSy5M+060wJn6+FGJHwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="37T5NgO9l0eDz7mms8wc8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[1]" type="UMLClassView" guid="zd6x5YWqzEazqG7OYjf4/wAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">32</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">132</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">91</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bW6r62dSEEmci8YVu/j1+AAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="zwbzv48QXU+VE8BnRBGKwwAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="NVL2Bz8YJU+BOOzuYx0XKwAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">carbideuiPath</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="2A3CdO+3lE+DSB0oYs57iAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="zM8lFMR7OkmTGcvrV0pCnwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="xqKFdQxjVkiB260Xy3hJngAA">
+<XPD:REF name="Model">bW6r62dSEEmci8YVu/j1+AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="u4CP0jn930GoXG8JvYZMDwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bW6r62dSEEmci8YVu/j1+AAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="9dSAAZCioE2lQu+Hyq3a8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">bW6r62dSEEmci8YVu/j1+AAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[2]" type="UMLClassView" guid="NAew17kPWEus8PVpRLBxgwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">136</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">132</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">86</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LCO1bffXG0OrOxRw0E8QrQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="MJXgA6RU5UC0iifYRWv6EQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="/JjVkmPy60WVUQBKMheUwgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">themeDir</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="novQDKppDUKKbnLgDhXg7wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="lkHuafjMzUad/lDLvxBZyQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="J10h/JJFOkqlnMuNlomxfgAA">
+<XPD:REF name="Model">LCO1bffXG0OrOxRw0E8QrQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="8kT61YNvQUqAEqoon8GJlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LCO1bffXG0OrOxRw0E8QrQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="QccIyLf0pkan4beJZF0xwgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">LCO1bffXG0OrOxRw0E8QrQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[3]" type="UMLClassView" guid="k+BoKCtq1kuPCID2EqWPRQAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">256</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">136</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">84</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="/DahuJNmwE6Bv4qVSoki7gAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="WlSdYEEa5EiREM3t3E+uyQAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">activeTheme</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="l6ZnQ4tgaEelyuZecDz84gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="xID71nhs2UOtuHoJneOhEwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KAiz8RKnL0qcOnrl0aro1QAA">
+<XPD:REF name="Model">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="wd5a4GlZ70+Cokyt15d6DQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="gaQqU+stC0SwxrmuQPA47AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[4]" type="UMLAssociationView" guid="UmtO+l5gk02eqTxal68NEgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">94,132;149,66</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+<XPD:REF name="Head">mhHfj6aZiUChhByPx5R1JwAA</XPD:REF>
+<XPD:REF name="Tail">zd6x5YWqzEazqG7OYjf4/wAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="JRZ8C1xd2EqgtNxwQp8nRQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="jrPqKqz5AE6Akst2foJ6nAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="FtvzpDgGNUSgrrsNCw75HwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="rgACMezpx06NC+uElqI8OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wcsyP+nnQUKjH0wjScVReAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="91T39LDFOUCfdgtQ8b0FBwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6zS16THhTkGwS65tWjQZCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="bji12pdW0kyQut+E4yL1TQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wcsyP+nnQUKjH0wjScVReAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="UxNdyZHbo0uFVzRrAJ0wJQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6zS16THhTkGwS65tWjQZCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="AjeuIq1FqUutfBdh8TR67AAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">wcsyP+nnQUKjH0wjScVReAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="l6TAszl58ECFG/bqul3hTgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">6zS16THhTkGwS65tWjQZCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="kNN5vQrcukewuz+MSve0fQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">wcsyP+nnQUKjH0wjScVReAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="VwOsLa+GL0uYCo2aee42tQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">6zS16THhTkGwS65tWjQZCAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[5]" type="UMLAssociationView" guid="oDmUyp5ZukCAMQ30G3YWsgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">176,132;168,66</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+<XPD:REF name="Head">mhHfj6aZiUChhByPx5R1JwAA</XPD:REF>
+<XPD:REF name="Tail">NAew17kPWEus8PVpRLBxgwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="hohK+vYmzE2c3CV5vDVYlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="Ke2HfdW0ukq0+nCL4ckZvwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="VUrmg0rfqUqigRm6tJf3EwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="fQpewNdnSUyM1sB8t3JXHgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YntvV5hUUUKJJTQuPjiKKwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="Dn9xo4in2kScOlx5voNCnAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">/KYpV/ZNd0664wj7eL8/lwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="x9Nlzi/bBk6MYpa2pBJ09gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YntvV5hUUUKJJTQuPjiKKwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="woDMTT0EXUKqDYyuxIfuFwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">/KYpV/ZNd0664wj7eL8/lwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="uIKzgAPzf0mGGMXcEwjCFAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">YntvV5hUUUKJJTQuPjiKKwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="STejq31rzEaS1ZPocsSb8QAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">/KYpV/ZNd0664wj7eL8/lwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="E0Va2COtt0mAIi3iuoZ+GQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">YntvV5hUUUKJJTQuPjiKKwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="i9SHgNaJF0qEA9zd9TRoAAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">/KYpV/ZNd0664wj7eL8/lwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[6]" type="UMLAssociationView" guid="JIfYu1MCjUu32qryaGlFcgAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">272,136;190,66</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+<XPD:REF name="Head">mhHfj6aZiUChhByPx5R1JwAA</XPD:REF>
+<XPD:REF name="Tail">k+BoKCtq1kuPCID2EqWPRQAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="wTTvCzCBp0CWh8y8fOjWlgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="W3WXsmgrNUaFnzM6OKbh1wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="7kk+toAuYUejpPPeJZcnxQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="CtFyPrHRFU220NwwMYJiNAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DHEqz/kumEqKpEuG6SZp0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="h8ktZnWArE2lUGGiikK6HgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">buExkO5cRkKq6ABkiq0yKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="hSTeJtccQk6XhwANh6uvJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DHEqz/kumEqKpEuG6SZp0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="HYtqXSYOykm9EHCY9FK34gAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">buExkO5cRkKq6ABkiq0yKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="gBUIg2VKoEG9JY+xmDX9rwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">DHEqz/kumEqKpEuG6SZp0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="Ap86LOy7dk2sgzvamgQ5OAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">buExkO5cRkKq6ABkiq0yKAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="jnvwNeHBokiwX8NIOwEdPgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">DHEqz/kumEqKpEuG6SZp0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="+nF9DqCQ00GaV/MeLotB4wAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">buExkO5cRkKq6ABkiq0yKAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[7]" type="UMLClassView" guid="kvcaM+qeN0Wl35tMVddpygAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">212</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">248</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">80</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">PcWGUaK8Z0qAqZHa1Kx3UQAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="Orbh6f80ikmCKn1E3jy9vgAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="uSaDLfbRQU2Q/+GEtrH4hgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">refSetting</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="Q93kq+Hy4ECVopKt6gN3CAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="wsKgADFQsUa8Dn7hDN5yaQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="XCrsD/viGUK9QLWi6/a/iAAA">
+<XPD:REF name="Model">PcWGUaK8Z0qAqZHa1Kx3UQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="AWr9XT7TL0SToL/ztqwwPQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">PcWGUaK8Z0qAqZHa1Kx3UQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="mAk4R+yKvUqjzliSa6VXMAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">PcWGUaK8Z0qAqZHa1Kx3UQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[8]" type="UMLAssociationView" guid="goeiQAhMAU+BS72puYAnhAAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">260,248;288,178</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+<XPD:REF name="Head">k+BoKCtq1kuPCID2EqWPRQAA</XPD:REF>
+<XPD:REF name="Tail">kvcaM+qeN0Wl35tMVddpygAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="hHNbId2yAUOOhXAX9Yl5SgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="lk8fI34YekiLrfRNR0q0AwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="4o7B6KUU3U2vZ6s2bK51PAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="k0kci9s8c0267NURI9vZqAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5vqtzQAgIk2Fz0Fh7XaBfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="T+nvbA/JJ0yRXtxY/LTCWAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">nEZrS2XOiE6AMkRarVVpLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="OBdTSTV+q02JS4nbKTN3zQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5vqtzQAgIk2Fz0Fh7XaBfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="xJMVyrXAEUisrVAF/uiLbQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">nEZrS2XOiE6AMkRarVVpLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="ZFFrz9pNxkSyAH9Z/XksWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">5vqtzQAgIk2Fz0Fh7XaBfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="34OrYUm6hkCjAfcxl5XmpgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">nEZrS2XOiE6AMkRarVVpLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="MrG1uu8oxkq+23hoqQu0xAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">5vqtzQAgIk2Fz0Fh7XaBfQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="GRTp68U9ekK2ElWFr9WiQwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">nEZrS2XOiE6AMkRarVVpLgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[9]" type="UMLClassView" guid="7IwNs/XM5kq9sOavQnifWwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">320</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">248</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">101</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">43</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3n6KakpGs0aeHYe1gxZ0PwAA</XPD:REF>
+<XPD:OBJ name="NameCompartment" type="UMLNameCompartmentView" guid="gvejguDYOkmv/ILzX+kBOQAA">
+<XPD:OBJ name="NameLabel" type="LabelView" guid="MDJdxsuJu066oXSXGSsrEgAA">
+<XPD:ATTR name="FontStyle" type="integer">1</XPD:ATTR>
+<XPD:ATTR name="Text" type="string">platformUID</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="LabelView" guid="XtOji99vVkyloT1//opxuQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="LabelView" guid="MJkkQ7nYPU24OJ0s8ZUGmAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="AttributeCompartment" type="UMLAttributeCompartmentView" guid="KF6DO0GUe0CRE/lr10Au4gAA">
+<XPD:REF name="Model">3n6KakpGs0aeHYe1gxZ0PwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OperationCompartment" type="UMLOperationCompartmentView" guid="3KpQaF4nJEGxjJRHvTrFEgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3n6KakpGs0aeHYe1gxZ0PwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TemplateParameterCompartment" type="UMLTemplateParameterCompartmentView" guid="a2ZZ7w/bh0SLYLZBDwm1xAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">3n6KakpGs0aeHYe1gxZ0PwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedViews[10]" type="UMLAssociationView" guid="tDLH1i4k3UO0L1TdSkKZYwAA">
+<XPD:ATTR name="LineColor" type="string">clMaroon</XPD:ATTR>
+<XPD:ATTR name="FillColor" type="string">$00B9FFFF</XPD:ATTR>
+<XPD:ATTR name="Points" type="Points">356,248;311,178</XPD:ATTR>
+<XPD:ATTR name="ShowCompartmentVisibility" type="boolean">False</XPD:ATTR>
+<XPD:REF name="Model">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+<XPD:REF name="Head">k+BoKCtq1kuPCID2EqWPRQAA</XPD:REF>
+<XPD:REF name="Tail">7IwNs/XM5kq9sOavQnifWwAA</XPD:REF>
+<XPD:OBJ name="NameLabel" type="EdgeLabelView" guid="AzklgW83WESiukDNEZieWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="StereotypeLabel" type="EdgeLabelView" guid="1ooS1thFeUmH+yywkTVgbwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:REF name="Model">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="PropertyLabel" type="EdgeLabelView" guid="+fIpxqYW/EONaV06QMwsxAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-1.5707963267949</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">15</XPD:ATTR>
+<XPD:REF name="Model">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadRoleNameLabel" type="EdgeLabelView" guid="E9dMmHeogUyoDU3wpcesqQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">HH2WAgAA0k2bTYjARMIr8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailRoleNameLabel" type="EdgeLabelView" guid="MB5y7axnz0axYeNDfNaumAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">30</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gl2nXNPFBUKFkpD9Y+jkywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadMultiplicityLabel" type="EdgeLabelView" guid="ABkFdLXMnUGf6d52LhkgvwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">HH2WAgAA0k2bTYjARMIr8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailMultiplicityLabel" type="EdgeLabelView" guid="6QA1ZDq+C0W2UMGjsp0qogAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.523598775598299</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">25</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gl2nXNPFBUKFkpD9Y+jkywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadPropertyLabel" type="EdgeLabelView" guid="9C5/GVzHS0aMsZ1Y7GZRuwAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">-0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epHead</XPD:ATTR>
+<XPD:REF name="Model">HH2WAgAA0k2bTYjARMIr8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailPropertyLabel" type="EdgeLabelView" guid="oImhcJZ/X064wgXtKgMGWgAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Alpha" type="real">0.785398163397448</XPD:ATTR>
+<XPD:ATTR name="Distance" type="real">40</XPD:ATTR>
+<XPD:ATTR name="EdgePosition" type="EdgePositionKind">epTail</XPD:ATTR>
+<XPD:REF name="Model">gl2nXNPFBUKFkpD9Y+jkywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="HeadQualifierCompartment" type="UMLQualifierCompartmentView" guid="Ctauxi+dwkC6Tu25w0/4RQAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">HH2WAgAA0k2bTYjARMIr8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="TailQualifierCompartment" type="UMLQualifierCompartmentView" guid="iqPBju4/tkSRJMOkIadgJAAA">
+<XPD:ATTR name="Visible" type="boolean">False</XPD:ATTR>
+<XPD:ATTR name="Left" type="integer">-1188</XPD:ATTR>
+<XPD:ATTR name="Top" type="integer">-1100</XPD:ATTR>
+<XPD:ATTR name="Width" type="integer">50</XPD:ATTR>
+<XPD:ATTR name="Height" type="integer">8</XPD:ATTR>
+<XPD:REF name="Model">gl2nXNPFBUKFkpD9Y+jkywAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:ATTR name="#OwnedElements" type="integer">11</XPD:ATTR>
+<XPD:OBJ name="OwnedElements[0]" type="UMLClass" guid="E1iu90tl5UOMzz4DqQdgKgAA">
+<XPD:ATTR name="Name" type="string">thememl</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">mhHfj6aZiUChhByPx5R1JwAA</XPD:REF>
+<XPD:REF name="Views[1]">F+df4ro24kugCVNjAI4JkAAA</XPD:REF>
+<XPD:REF name="Views[2]">3TTpSy5M+060wJn6+FGJHwAA</XPD:REF>
+<XPD:REF name="Views[3]">37T5NgO9l0eDz7mms8wc8QAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">wcsyP+nnQUKjH0wjScVReAAA</XPD:REF>
+<XPD:REF name="Associations[1]">YntvV5hUUUKJJTQuPjiKKwAA</XPD:REF>
+<XPD:REF name="Associations[2]">DHEqz/kumEqKpEuG6SZp0wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[1]" type="UMLClass" guid="bW6r62dSEEmci8YVu/j1+AAA">
+<XPD:ATTR name="Name" type="string">carbideuiPath</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">zd6x5YWqzEazqG7OYjf4/wAA</XPD:REF>
+<XPD:REF name="Views[1]">xqKFdQxjVkiB260Xy3hJngAA</XPD:REF>
+<XPD:REF name="Views[2]">u4CP0jn930GoXG8JvYZMDwAA</XPD:REF>
+<XPD:REF name="Views[3]">9dSAAZCioE2lQu+Hyq3a8QAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">6zS16THhTkGwS65tWjQZCAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[2]" type="UMLClass" guid="LCO1bffXG0OrOxRw0E8QrQAA">
+<XPD:ATTR name="Name" type="string">themeDir</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">NAew17kPWEus8PVpRLBxgwAA</XPD:REF>
+<XPD:REF name="Views[1]">J10h/JJFOkqlnMuNlomxfgAA</XPD:REF>
+<XPD:REF name="Views[2]">8kT61YNvQUqAEqoon8GJlgAA</XPD:REF>
+<XPD:REF name="Views[3]">QccIyLf0pkan4beJZF0xwgAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">/KYpV/ZNd0664wj7eL8/lwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLClass" guid="2bjs9/U4tkC8lb+E9SbivwAA">
+<XPD:ATTR name="Name" type="string">activeTheme</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">k+BoKCtq1kuPCID2EqWPRQAA</XPD:REF>
+<XPD:REF name="Views[1]">KAiz8RKnL0qcOnrl0aro1QAA</XPD:REF>
+<XPD:REF name="Views[2]">wd5a4GlZ70+Cokyt15d6DQAA</XPD:REF>
+<XPD:REF name="Views[3]">gaQqU+stC0SwxrmuQPA47AAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">3</XPD:ATTR>
+<XPD:REF name="Associations[0]">buExkO5cRkKq6ABkiq0yKAAA</XPD:REF>
+<XPD:REF name="Associations[1]">5vqtzQAgIk2Fz0Fh7XaBfQAA</XPD:REF>
+<XPD:REF name="Associations[2]">HH2WAgAA0k2bTYjARMIr8gAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLAssociation" guid="31v9Omcga0SIleb9L/1ClQAA">
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">UmtO+l5gk02eqTxal68NEgAA</XPD:REF>
+<XPD:REF name="Views[1]">JRZ8C1xd2EqgtNxwQp8nRQAA</XPD:REF>
+<XPD:REF name="Views[2]">jrPqKqz5AE6Akst2foJ6nAAA</XPD:REF>
+<XPD:REF name="Views[3]">FtvzpDgGNUSgrrsNCw75HwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="6zS16THhTkGwS65tWjQZCAAA">
+<XPD:REF name="Association">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+<XPD:REF name="Participant">bW6r62dSEEmci8YVu/j1+AAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">91T39LDFOUCfdgtQ8b0FBwAA</XPD:REF>
+<XPD:REF name="Views[1]">UxNdyZHbo0uFVzRrAJ0wJQAA</XPD:REF>
+<XPD:REF name="Views[2]">l6TAszl58ECFG/bqul3hTgAA</XPD:REF>
+<XPD:REF name="Views[3]">VwOsLa+GL0uYCo2aee42tQAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="wcsyP+nnQUKjH0wjScVReAAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">31v9Omcga0SIleb9L/1ClQAA</XPD:REF>
+<XPD:REF name="Participant">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">rgACMezpx06NC+uElqI8OAAA</XPD:REF>
+<XPD:REF name="Views[1]">bji12pdW0kyQut+E4yL1TQAA</XPD:REF>
+<XPD:REF name="Views[2]">AjeuIq1FqUutfBdh8TR67AAA</XPD:REF>
+<XPD:REF name="Views[3]">kNN5vQrcukewuz+MSve0fQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[5]" type="UMLAssociation" guid="OImmNP8TaU2uwE/LH3/DiAAA">
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">oDmUyp5ZukCAMQ30G3YWsgAA</XPD:REF>
+<XPD:REF name="Views[1]">hohK+vYmzE2c3CV5vDVYlgAA</XPD:REF>
+<XPD:REF name="Views[2]">Ke2HfdW0ukq0+nCL4ckZvwAA</XPD:REF>
+<XPD:REF name="Views[3]">VUrmg0rfqUqigRm6tJf3EwAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="/KYpV/ZNd0664wj7eL8/lwAA">
+<XPD:REF name="Association">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+<XPD:REF name="Participant">LCO1bffXG0OrOxRw0E8QrQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">Dn9xo4in2kScOlx5voNCnAAA</XPD:REF>
+<XPD:REF name="Views[1]">woDMTT0EXUKqDYyuxIfuFwAA</XPD:REF>
+<XPD:REF name="Views[2]">STejq31rzEaS1ZPocsSb8QAA</XPD:REF>
+<XPD:REF name="Views[3]">i9SHgNaJF0qEA9zd9TRoAAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="YntvV5hUUUKJJTQuPjiKKwAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">OImmNP8TaU2uwE/LH3/DiAAA</XPD:REF>
+<XPD:REF name="Participant">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">fQpewNdnSUyM1sB8t3JXHgAA</XPD:REF>
+<XPD:REF name="Views[1]">x9Nlzi/bBk6MYpa2pBJ09gAA</XPD:REF>
+<XPD:REF name="Views[2]">uIKzgAPzf0mGGMXcEwjCFAAA</XPD:REF>
+<XPD:REF name="Views[3]">E0Va2COtt0mAIi3iuoZ+GQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[6]" type="UMLAssociation" guid="cwzTm4JdpEaerFvN+5vV6QAA">
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">JIfYu1MCjUu32qryaGlFcgAA</XPD:REF>
+<XPD:REF name="Views[1]">wTTvCzCBp0CWh8y8fOjWlgAA</XPD:REF>
+<XPD:REF name="Views[2]">W3WXsmgrNUaFnzM6OKbh1wAA</XPD:REF>
+<XPD:REF name="Views[3]">7kk+toAuYUejpPPeJZcnxQAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="buExkO5cRkKq6ABkiq0yKAAA">
+<XPD:REF name="Association">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+<XPD:REF name="Participant">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">h8ktZnWArE2lUGGiikK6HgAA</XPD:REF>
+<XPD:REF name="Views[1]">HYtqXSYOykm9EHCY9FK34gAA</XPD:REF>
+<XPD:REF name="Views[2]">Ap86LOy7dk2sgzvamgQ5OAAA</XPD:REF>
+<XPD:REF name="Views[3]">+nF9DqCQ00GaV/MeLotB4wAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="DHEqz/kumEqKpEuG6SZp0wAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">cwzTm4JdpEaerFvN+5vV6QAA</XPD:REF>
+<XPD:REF name="Participant">E1iu90tl5UOMzz4DqQdgKgAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">CtFyPrHRFU220NwwMYJiNAAA</XPD:REF>
+<XPD:REF name="Views[1]">hSTeJtccQk6XhwANh6uvJAAA</XPD:REF>
+<XPD:REF name="Views[2]">gBUIg2VKoEG9JY+xmDX9rwAA</XPD:REF>
+<XPD:REF name="Views[3]">jnvwNeHBokiwX8NIOwEdPgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[7]" type="UMLClass" guid="PcWGUaK8Z0qAqZHa1Kx3UQAA">
+<XPD:ATTR name="Name" type="string">refSetting</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">kvcaM+qeN0Wl35tMVddpygAA</XPD:REF>
+<XPD:REF name="Views[1]">XCrsD/viGUK9QLWi6/a/iAAA</XPD:REF>
+<XPD:REF name="Views[2]">AWr9XT7TL0SToL/ztqwwPQAA</XPD:REF>
+<XPD:REF name="Views[3]">mAk4R+yKvUqjzliSa6VXMAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">nEZrS2XOiE6AMkRarVVpLgAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[8]" type="UMLAssociation" guid="en8FxQY7BE+v9p/cI6Vh9wAA">
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">goeiQAhMAU+BS72puYAnhAAA</XPD:REF>
+<XPD:REF name="Views[1]">hHNbId2yAUOOhXAX9Yl5SgAA</XPD:REF>
+<XPD:REF name="Views[2]">lk8fI34YekiLrfRNR0q0AwAA</XPD:REF>
+<XPD:REF name="Views[3]">4o7B6KUU3U2vZ6s2bK51PAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="nEZrS2XOiE6AMkRarVVpLgAA">
+<XPD:REF name="Association">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+<XPD:REF name="Participant">PcWGUaK8Z0qAqZHa1Kx3UQAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">T+nvbA/JJ0yRXtxY/LTCWAAA</XPD:REF>
+<XPD:REF name="Views[1]">xJMVyrXAEUisrVAF/uiLbQAA</XPD:REF>
+<XPD:REF name="Views[2]">34OrYUm6hkCjAfcxl5XmpgAA</XPD:REF>
+<XPD:REF name="Views[3]">GRTp68U9ekK2ElWFr9WiQwAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="5vqtzQAgIk2Fz0Fh7XaBfQAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">en8FxQY7BE+v9p/cI6Vh9wAA</XPD:REF>
+<XPD:REF name="Participant">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">k0kci9s8c0267NURI9vZqAAA</XPD:REF>
+<XPD:REF name="Views[1]">OBdTSTV+q02JS4nbKTN3zQAA</XPD:REF>
+<XPD:REF name="Views[2]">ZFFrz9pNxkSyAH9Z/XksWgAA</XPD:REF>
+<XPD:REF name="Views[3]">MrG1uu8oxkq+23hoqQu0xAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[9]" type="UMLClass" guid="3n6KakpGs0aeHYe1gxZ0PwAA">
+<XPD:ATTR name="Name" type="string">platformUID</XPD:ATTR>
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">7IwNs/XM5kq9sOavQnifWwAA</XPD:REF>
+<XPD:REF name="Views[1]">KF6DO0GUe0CRE/lr10Au4gAA</XPD:REF>
+<XPD:REF name="Views[2]">3KpQaF4nJEGxjJRHvTrFEgAA</XPD:REF>
+<XPD:REF name="Views[3]">a2ZZ7w/bh0SLYLZBDwm1xAAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">gl2nXNPFBUKFkpD9Y+jkywAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[10]" type="UMLAssociation" guid="WUcaNoS+W0ScfGgjVLs+nAAA">
+<XPD:REF name="Namespace">AXaa4fXnMkSQbYhO++BySwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">tDLH1i4k3UO0L1TdSkKZYwAA</XPD:REF>
+<XPD:REF name="Views[1]">AzklgW83WESiukDNEZieWgAA</XPD:REF>
+<XPD:REF name="Views[2]">1ooS1thFeUmH+yywkTVgbwAA</XPD:REF>
+<XPD:REF name="Views[3]">+fIpxqYW/EONaV06QMwsxAAA</XPD:REF>
+<XPD:ATTR name="#Connections" type="integer">2</XPD:ATTR>
+<XPD:OBJ name="Connections[0]" type="UMLAssociationEnd" guid="gl2nXNPFBUKFkpD9Y+jkywAA">
+<XPD:REF name="Association">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+<XPD:REF name="Participant">3n6KakpGs0aeHYe1gxZ0PwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">MB5y7axnz0axYeNDfNaumAAA</XPD:REF>
+<XPD:REF name="Views[1]">6QA1ZDq+C0W2UMGjsp0qogAA</XPD:REF>
+<XPD:REF name="Views[2]">oImhcJZ/X064wgXtKgMGWgAA</XPD:REF>
+<XPD:REF name="Views[3]">iqPBju4/tkSRJMOkIadgJAAA</XPD:REF>
+</XPD:OBJ>
+<XPD:OBJ name="Connections[1]" type="UMLAssociationEnd" guid="HH2WAgAA0k2bTYjARMIr8gAA">
+<XPD:ATTR name="Aggregation" type="UMLAggregationKind">akAggregate</XPD:ATTR>
+<XPD:REF name="Association">WUcaNoS+W0ScfGgjVLs+nAAA</XPD:REF>
+<XPD:REF name="Participant">2bjs9/U4tkC8lb+E9SbivwAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">4</XPD:ATTR>
+<XPD:REF name="Views[0]">E9dMmHeogUyoDU3wpcesqQAA</XPD:REF>
+<XPD:REF name="Views[1]">ABkFdLXMnUGf6d52LhkgvwAA</XPD:REF>
+<XPD:REF name="Views[2]">9C5/GVzHS0aMsZ1Y7GZRuwAA</XPD:REF>
+<XPD:REF name="Views[3]">Ctauxi+dwkC6Tu25w0/4RQAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[36]" type="UMLSubsystem" guid="qbPN/Ar/t0KiMLxOhrAKUAAA">
+<XPD:ATTR name="Name" type="string">hcr</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLClassDiagram" guid="pyIYOwYMDEeZrQT3ju6dFwAA">
+<XPD:ATTR name="Name" type="string">hcr</XPD:ATTR>
+<XPD:REF name="DiagramOwner">qbPN/Ar/t0KiMLxOhrAKUAAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLClassDiagramView" guid="KDf3v++RuE+5M1d95rYqvgAA">
+<XPD:REF name="Diagram">pyIYOwYMDEeZrQT3ju6dFwAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[37]" type="UMLInterface" guid="IONricIIR0WGo59WsXpFtgAA">
+<XPD:ATTR name="Name" type="string">implbase</XPD:ATTR>
+<XPD:REF name="Namespace">8/PDgZYaSkyhn9djg2OS7wAA</XPD:REF>
+<XPD:ATTR name="#Views" type="integer">6</XPD:ATTR>
+<XPD:REF name="Views[0]">4mngVqbP4Ea7+EC/9bKjCgAA</XPD:REF>
+<XPD:REF name="Views[1]">VWp/rJMg2kOLFXwFg0J96gAA</XPD:REF>
+<XPD:REF name="Views[2]">jKpvSZoHtkq5hgIRvjK8eAAA</XPD:REF>
+<XPD:REF name="Views[3]">nsTcPUP9yEKZ2Ue56O4iCAAA</XPD:REF>
+<XPD:REF name="Views[4]">2WZs30HgKkeocNW87z6sVQAA</XPD:REF>
+<XPD:REF name="Views[5]">ibZP/x+DQUur6Dm7HuS6kgAA</XPD:REF>
+<XPD:ATTR name="#Specializations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Specializations[0]">taqNNc4Me0uannQ7Vlc89gAA</XPD:REF>
+<XPD:ATTR name="#Associations" type="integer">1</XPD:ATTR>
+<XPD:REF name="Associations[0]">LIobfyFbwUOnOz751BxBWAAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[3]" type="UMLModel" guid="ZZnOc1BB802VNyN7Blj6agAA">
+<XPD:ATTR name="Name" type="string">Implementation Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">implementationModel</XPD:ATTR>
+<XPD:REF name="Namespace">7KBTiD3bXUedYhpH6MqM/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLComponentDiagram" guid="dPrKTvLEr0CWArbuShV1qgAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:REF name="DiagramOwner">ZZnOc1BB802VNyN7Blj6agAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLComponentDiagramView" guid="BI/yJxIkBUWU/to+75S6agAA">
+<XPD:REF name="Diagram">dPrKTvLEr0CWArbuShV1qgAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+<XPD:OBJ name="OwnedElements[4]" type="UMLModel" guid="B7rSNDDyBUqpmqGILzLvCgAA">
+<XPD:ATTR name="Name" type="string">Deployment Model</XPD:ATTR>
+<XPD:ATTR name="StereotypeProfile" type="string">UMLStandard</XPD:ATTR>
+<XPD:ATTR name="StereotypeName" type="string">deploymentModel</XPD:ATTR>
+<XPD:REF name="Namespace">7KBTiD3bXUedYhpH6MqM/gAA</XPD:REF>
+<XPD:ATTR name="#OwnedDiagrams" type="integer">1</XPD:ATTR>
+<XPD:OBJ name="OwnedDiagrams[0]" type="UMLDeploymentDiagram" guid="HsXxbkByQka1ntXTL8fe5wAA">
+<XPD:ATTR name="Name" type="string">Main</XPD:ATTR>
+<XPD:REF name="DiagramOwner">B7rSNDDyBUqpmqGILzLvCgAA</XPD:REF>
+<XPD:OBJ name="DiagramView" type="UMLDeploymentDiagramView" guid="G+ZLp/N7g0yaycYhXQe6vgAA">
+<XPD:REF name="Diagram">HsXxbkByQka1ntXTL8fe5wAA</XPD:REF>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:OBJ>
+</XPD:BODY>
+</XPD:PROJECT>
Binary file configurationengine/doc/plugins/ruleml-plugin/ruleml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/ruleml-plugin/ruleplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,163 @@
+User guide for Rule Plugin usage in ConE
+----------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use ConE Rule plugin. With rule plugin one may set rule configuration 
+for the values in the confml. So for ex. one may have a case where is one confml value is been setted
+and one may create a rule configuration that if this value is for ex. 'foo' then some other value is
+'bar'. Value may be required or configures. 
+
+
+Creating a rule configuration file
+''''''''''''''''''''''''''''''''''
+Create a new file a example.ruleml and set it's file encoding to UTF-8.
+Place the file in the impml folder in configuration project.
+The file is a XML base file. 
+First set the encoding tag 
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>* 
+
+and then create a root tag
+
+.. code-block:: xml
+
+  <ruleml xmlns="http://www.s60.com/xml/ruleml/1">*
+ 
+give a set of rules for ex. 
+ 
+.. code-block:: xml
+
+  <rule>mms.imagesize == 'large' configures pd.ref1 = True and pd.ref2 = True</rule>*
+ 
+and close the ruleml tag.
+
+One may say use several boolean operators for the configuration rule like for ex.
+ 
+.. code-block:: xml
+
+  and, or, ==, !=* 
+ 
+Like for ex.
+
+.. code-block:: xml
+
+  <rule>mms.imagesize == 'large' configures pd.ref1 = True and pd.ref2 = True</rule>*
+ 
+means that if reference link mms/imagesize  in some confml file is set to large then reference 
+link pd/ref1 value is true and pd/ref2 value is set to true also.
+
+**All in all one may create a dependency like project configuration with ruleml files.**  
+
+Ruleml version 2 adds support for calling `Python <http://www.python.org/doc/2.5/>`_ expressions from rules. Python expression are defined between ``{%`` and ``%}``:
+
+.. code-block:: xml
+
+  <rule>feat1.setting2 == True configures feat2.setting2 = {% ${feat3.setting2} %}</rule>
+
+Expression return a result, that can be used in rule e.g. to set a value to some setting in configuration. These expression can be used to create more complex logic into rules that is not possible with standard rule expressions. Inside eval expressions features and feature's values can be accessed by following syntax:
+
+Accesses to the value::
+
+  ${Feature.Setting}
+
+Accesses to the feature object::
+
+  @{Feature.Setting}
+
+Python functions or constants that can be accessed inside expressions can be defined by ``<eval_globals>`` elements:
+
+.. code-block:: xml
+
+  <eval_globals>
+  def my_function1(attribute):
+      return attribute + 1
+  </eval_globals>
+  
+  <eval_globals>CONST_1 = "my constant"</eval_globals>
+  
+  <eval_globals file=".scripts/evals_in_file.py"/>
+  
+Definitions can be inside <eval_globals> elements or definitions can be in separate file referenced with ``file`` attribute.
+The path specified in this attribute is relative to the RuleML implementation file. So, for example, if your implementation
+file's location is ``some/layer/implml/my_rules.ruleml``, the actual path specified in the above example would be
+``some/layer/implml/.scripts/evals_in_file.py``. It is recommended to place the scripts under a directory beginning
+with a dot, so that the plug-in loader does not attempt to load the .py file as an implementation (files and directories beginning
+with a dot are ignored in the implementation loading phase).
+
+Running
+'''''''''''''''''''''
+
+::
+
+  cone generate -p someproject.cpf -o c:/temp/coneoutput -i rulemlfile.ruleml
+
+Generates files out of configuration file and takes the implementation rulemlfile.ruleml in concern,
+and the output is to been set to -o given folder 
+
+for more example see the cone documentation
+
+Examples
+'''''''''
+
+
+**Ruleml version 1 file example**
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>imaker.imagetarget configures imakerapi.outputLocation = imaker.imagetarget</rule>
+  <rule>mms.imagesize == 'large' configures pd.ref1 = True and pd.ref2 = True</rule>
+  <rule>mms.imagesize == 'small' configures pd.ref1 = False and pd.ref2 = True</rule>
+  <rule>mms.imagesize == 'extrasmall' configures pd.ref1 = False and pd.ref2 = False</rule>
+  <rule>mms.imagesize == 'extralarge' configures pd.ref1 = True and pd.ref2 = False</rule>
+  </ruleml>
+
+**What do the example ruleml file means**
+
+The example file set the values upon the image size. First it sets the iMaker output
+location target and then it starts to set the mms message image size settings. So if for ex.
+*mms/imagesize* refence link value in confml file is set to *extralarge* then the value of
+*pd/ref1* is set to *true* and the value *pd/ref2* is set to false.
+
+
+**Ruleml version 2 file example**
+
+.. code-block:: xml
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>feat1.setting1 == 'somevalue' configures feat2.setting1 = {% len( ${feat3.setting1} ) %}</rule>
+  <rule>feat1.setting2 == True configures feat2.setting2 = {% my_function1( ${feat3.setting2} ) %}</rule>
+  <rule>feat1.setting3 == True configures feat2.setting3 = {% CONST_1 %}</rule>
+  <rule>{% my_function2( ${feat1.setting4} ) %} configures feat2.setting4 = False</rule>
+  <rule>{% @{feat1.setting5}.get_type() %} == 'int' configures feat2.setting5 = 'integer'</rule>
+  <rule>feat1.setting6 == True configures feat2.setting6 = {% '0x%08X' % ${feat2.setting6} %}</rule>
+  <eval_globals>
+  def my_function1(attribute):
+      return attribute + 1
+  def my_function2(attribute):
+      if attribute == 'abc':
+          return True
+      else:
+          return False
+  </eval_globals>
+  <eval_globals>
+  CONST_1 = "my constant"
+  </eval_globals>
+  <eval_globals file=".scripts/evals_in_file.py"/>
+  </ruleml>
+
+XSD
+'''''''''
+
+Ruleml version 1: :download:`ruleml.xsd </xsd/ruleml.xsd>`
+
+Ruleml version 2: :download:`ruleml2.xsd </xsd/ruleml2.xsd>`
+
+FAQ
+'''''''''
+This will be updated based on the questions.
Binary file configurationengine/doc/plugins/tag-fil.jpg has changed
Binary file configurationengine/doc/plugins/templateml-plugin/templateml.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/templateml-plugin/templateml_example0.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+    <output file="output_file1.txt" encoding="UTF-8" dir="output">
+       <template><xi:include href="template.txt" parse="text"/></template>
+    </output>
+    <output file="output_file2.txt" encoding="UTF-8">
+       <template>
+          This template uses custom filter to count the sum of 2 and 3:
+            2+3={{ 2|example_filter(3) }}
+        </template>
+    </output>
+    <filter name="example_filter">lambda a,b: a+b</filter>
+    <filter name="example_filter2"><xi:include href="example.filter" parse="text"/></filter>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/templateml-plugin/templateml_example1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+{% for feature in feat_list %}
+{{ feature._fqr }}: {{ feature._value }}
+{% endfor %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/templateml-plugin/templateml_example1_result.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+Feature1.FolderSetting: default_folder
+
+Feature1.RealSetting: 3.14
+
+Feature2.FileSetting: default_file.txt
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/templateml-plugin/templateml_example2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+{% if feat_tree.Feature1.StringSetting1 %}
+  feat_tree.Feature1.StringSetting1._value
+{% elif feat_tree.Feature1.StringSetting2 %}
+  feat_tree.Feature1.StringSetting2._value
+{% else %}
+  my default setting
+{% endif %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/templateml-plugin/templatemlplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,220 @@
+User guide for Template Configuration File Markup Language (TemplateML) Plugin
+------------------------------------------------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use and configure Template Configuration File Markup Language 
+(TemplateML) plugin fo ConE. TemplateML is one of the implementation mapping languages for
+Configuration Markup Language (ConfML). This plugin is used to generate arbitrary text file
+formats. It doesn't have a specific extension or encoding. Currently 
+this language uses `Jinja 2 template engine <http://jinja.pocoo.org/2/>`_ to generate 
+output files.
+
+Templates are based on Jinja syntax and semantics that are described in detail `Jinja 2 Template Designer Documentation <http://jinja.pocoo.org/2/documentation/templates>`_
+One important concept in Jinja is `template inheritance <http://jinja.pocoo.org/2/documentation/templates#template-inheritance>`_, which means that you can overwrite only specific blocks within a template, customizing it while also keeping the changes at a minimum.
+
+Templateml plugin supports also `XML Inclusions (XInclude) <http://www.w3.org/TR/xinclude/>`_ 
+that allows a mechanism for merging XML documents. By writing inclusion tags in a "main" 
+document it automatically includes other documents.
+
+TemplateML files are executed by default in **normal** :ref:`invocation phase <implml-common-invocation-phase>`.
+
+Template Configuration File ML
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The TemplateML syntax is a extension of Configuration markup language (confml). The term in confml for this extension 
+is implementation method language (implml), which in TemplateML case is a xml file. 
+
+All input values, excluding template and filter elements text content, can be given as ConfML refs.
+
+  * Namespace: ``http://www.s60.com/xml/templateml/1``
+  * File extension: ``templateml``
+
+.. note::
+
+   More information about :ref:`file extensions <implml-file-extensions>`. 
+
+TemplateML Elements
+...................
+
+The TemplateML model is drawn out as a uml model in below picture.
+
+  .. image:: templateml.jpg
+
+.. note::
+
+   TemplateML supports also common ImplML elements. More information about :ref:`ImplML elements <implml-common-elements>`. 
+
+
+templateml element
+**************************
+
+The root element of the templateml file is always templateml, which defines the xml namespace (xmlns) 
+to http://www.s60.com/xml/templateml/1 in the current version. 
+
+**templateml example**:
+
+.. code-block:: xml
+
+  <templateml xmlns="http://www.s60.com/xml/templateml/1">
+
+desc element
+**************************
+
+Description element's content is not used in output file generation, but it can be used to describe temlplateml file.
+
+**desc example**:
+
+.. code-block:: xml
+
+  <desc>Description field text</desc>
+
+output element
+**************************
+
+Output element describes how one output file is generated. Output has one mandatory attribute 'file' that defines filename for output file. If you want to generate output file to some other than default folder, it can be done by defining a output directory to 'dir' attribute. Default encoding for output file is 'UTF-8', if some other encoding is wanted, it can be defined by 'encoding' attribute.  This encoding should be one of the standard Python codecs encoding (see http://docs.python.org/library/codecs.html#standard-encodings).
+
+Template element is mandatory child element for output element. One output element can have only one template element.
+Output element can also contain optional filter elements that are specific just for this output file. Global filters that are common for all output files should be defined under root templateml element. 
+
+**output example**:
+
+.. code-block:: xml
+
+  <output file="my_output.txt" encoding="UTF-8" dir="output">
+    <template>Hello world!</template>
+    <filter name="filter1">lambda a,b: a+b</filter>
+    <filter name="filter2">lambda a,b: a*b</filter>
+  </output>
+
+For unicode transformation formats, control over the BOM is provided by the attribute ``bom``.
+This attribute defines whether the BOM is written to the output or not. If the attribute is not
+defined, the default behavior of the encoding is used (i.e. BOM is written for UTF-16, but not for UTF-16-BE,
+UTF-16-BE or UTF-8). For encodings where the BOM makes no sense (e.g. ASCII), the attribute does nothing.
+
+**Examples**:
+
+.. code-block:: xml
+
+    <output file="test.txt" encoding="UTF-8" bom="true">
+        <template>test</template>
+    <output>
+    
+    <output file="test.txt" encoding="UTF-8" bom="false">
+        <template>test</template>
+    <output>
+
+template element
+****************
+
+Template can be defined in template element or in external file. If both are defined file attribute overwrites. 
+
+**template example 1:**:
+
+.. code-block:: xml
+
+  <template>Some Jinja template goes here</template>
+
+Notice that if you want to define create xml output files and you don't want to encode special characters you can use CDATA section http://www.w3schools.com/xmL/xml_cdata.asp. 
+
+.. code-block:: xml
+  
+  <template>
+  <![CDATA[
+  <xml name="xml temp">Some Jinja xml template</xml>
+  ]]>
+  </template>
+  
+**template example 2:**:
+
+.. code-block:: xml
+
+  <template file="../../templates/template.txt"/>
+  <template file="${feat1.tempfile_setting}"/>
+
+With template's file attribute template is defined relatively to templateml file. 
+
+filter element
+**************************
+
+With filter element you can define custom filters. Custom filters are just regular Python functions that take the left side of the filter as first argument and the the arguments passed to the filter as extra arguments or keyword arguments. Filter element has mandatory 'name' attribute that defines the name of the filter. Name is used in template to refer to that filter. Filter can be defined in filter element or in external file. If both are defined file attribute overwrites. 
+
+`Jinja has built-in filters <http://jinja.pocoo.org/2/documentation/templates#builtin-filters>`_ (e.g. capitalize, replace, trim, urlize, format, escape) that can be utilized without any extra definitions templateml file.
+
+**filter example**:
+
+.. code-block:: xml
+
+  <filter name="minus">lambda a,b: a-b</filter>
+
+With filter's file attribute filter is defined relatively to templateml file. 
+
+Variables
++++++++++
+
+The TemplateML plugin passes variables to the templates you can mess around in the template. Every feature has 
+following attributes:
+
+ * _name
+ * _namespace
+ * _value
+ * _fqr 
+ * _type
+
+Currently TempleML plugin passes features in three different structure: feat_tree, feat_list and configuration.
+ 
+feat_tree
++++++++++
+
+Variable 'feat_tree' contains features in a tree structure. It allows easy access to features attributes, 
+when feature explicitly known: 
+
+.. literalinclude:: templateml_example2.txt
+   :language: xml
+
+feat_list
+++++++++++++++++++++++++++
+
+Variable 'feat_tree' contains features in an array and allows easy access to all features e.g. in loops:
+
+.. literalinclude:: templateml_example1.txt
+   :language: xml
+
+Generates to output file e.g following content:
+
+.. literalinclude:: templateml_example1_result.txt
+   :language: xml
+
+configuration
+++++++++++++++++++++++
+
+Configuration object that is defined ConE API can be accessed also inside template.
+
+.. code-block:: xml
+
+    <template>Configuration name: {{ configuration.get_path() }}
+    {% for feature in configuration.get_default_view().get_features('**') %}
+    {{ feature.fqr }}
+    {% endfor %}
+    </template>
+
+
+Examples
+'''''''''
+
+An example of templateml file, that generates two output files, utilizes XInclude and defines two custom filters:
+
+.. literalinclude:: templateml_example0.txt
+   :language: xml
+
+XSD
+'''
+
+Download: :download:`templateml.xsd </xsd/templateml.xsd>`
+
+
+FAQ
+'''''''''
+This will be updated based on the questions.
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/thememl-plugin/theme.thememl	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thememl xmlns="http://www.s60.com/xml/thememl/1">
+    <carbideuiPath>C:\Program Files\Nokia\Carbide.ui Theme Edition 3.4</carbideuiPath>
+    <themeDir>CVC_PreinstalledContent/CVC_PreInstalledThemesFolder</themeDir>
+    <activeTheme uid="0x101FD60A">
+		<refSetting>CVC_Theme_ref/CVC_DefaultTheme_ref</refSetting>
+    	<platformUID>KCRUidPersonalisation/KPslnActiveSkinUid</platformUID>
+    	<platformUID>KCRUidPersonalisation/KPslnActiveSkinUid1</platformUID>
+    </activeTheme>
+    <activeTheme uid="0x101FD60B">
+		<refSetting>CVC_Theme_ref/CVC_DefaultThemeMode2_ref</refSetting>
+    	<platformUID>KCRUidPersonalisation/KPslnActiveSkinUid2</platformUID>
+    	<platformUID>KCRUidPersonalisation/KPslnActiveSkinUid3</platformUID>
+    </activeTheme>
+
+</thememl>
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/plugins/thememl-plugin/themelplugin.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,99 @@
+User guide for Theme Plugin usage in ConE
+-----------------------------------------
+
+Introduction
+'''''''''''''
+This page describes how to use ConE Theme plugin. Theme plugin extracts the theme content from the
+.cpf file. It needs a .thememl file in the implml folder
+
+
+The thememl syntax is a extension of Configuration markup language (confml). The term in confml for this extension 
+is implementation method language (implml), which in thememl case is a xml file. 
+
+
+Theme elements
+''''''''''''''
+
+The root element of the theme file is always thememl, which defines the xml namespace (xmlns) 
+to http://www.s60.com/xml/thememl/1 in the current version. 
+
+Theme example
+^^^^^^^^^^^^^
+.. literalinclude:: theme.thememl
+   :language: xml
+
+
+
+
+carbideuiPath
+^^^^^^^^^^^^^^
+
+To create a the Theme plugin uses makepackage.bat file which is under the forder described in
+carbideuiPath tag. If none is setted the default is then C:\Program Files\Nokia\Carbide.ui Theme Edition 3.4 
+
+
+
+themeDir
+^^^^^^^^
+Theme plugin available themes from this directory setted as confml ref
+
+
+activeTheme 
+^^^^^^^^^^^
+
+One may describe a theme in this tag. You may have them as many as you want.
+It may hold one refSetting tag and several platformUID tags 
+
+**activeTheme attributes**
+
+Each flag attribute can have unique hexa values.
+
+  * uid 
+  
+
+refSetting 
+^^^^^^^^^^
+A ref confml setting key that describes the name of the .tpf file. Tpf file must always locate in the 
+content folder
+
+
+platformUID 
+^^^^^^^^^^^
+Is a ref in conml it may contain some value, but it will be replaced in the theme plugin to value
+given by the .pkg file and setted back to configuration. You may have more than one of these 
+
+
+Note 
+^^^^^
+The current implementation of the theme plugin relays the the .tpf file contain a .project file and 
+it contains themepackage.pkg file
+
+
+XSD
+'''
+
+Download: :download:`thememl.xsd </xsd/thememl.xsd>`
+
+
+FAQ
+'''
+
+Makepackage error
+'''''''''''''''''
+
+This problem is related to installation on Carbide.ui you can get it form
+here http://www.forum.nokia.com/info/sw.nokia.com/id/bb173537-4e67-496f-9967-50917d5cfc47/S60_Theme_Studio_for_Symbian_OS.html
+Install it. Goes by default to C:\Program Files\Nokia\Carbide.ui Theme Edition 3.4, but if you install it
+to a different location then you need to set right path to carbideuiPath tag. Chek that your system supports java
+programmin language. OPen command line editor and type java -version should be 1.5 or above 
+
+My theme is not created to image
+''''''''''''''''''''''''''''''''
+
+Change the .tpf file extension to zip and extract it to some folder.
+View the contents, there should be .project file and themepackage.pkg file, if not
+then ConE cannot create you a theme to an image. 
+
+ 
+
+
Binary file configurationengine/doc/plugins/thememl-plugin/thememl.jpg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/rule.rst	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,76 @@
+Rule
+====
+
+	A Configuration can contain rule's, which can be aplied to the :class:`~cone.public.api.Configuration` 
+	:class:`~cone.public.api.Feature`'s. In ConE a single rule will create an instance of :class:`~cone.public.plugin.Relation`. 
+	
+	The textual format of a rules is always of form:
+	::
+	
+	  <left side> relation_name <right side>.
+
+The rule dialect
+----------------
+	
+	The features are accessed in the left and right side of the rule with the default :class:`~cone.public.api.View` of the :class:`~cone.public.api.Configuration`. 
+	Basically ConE will get the default_view and use the :class:`~cone.public.api.ObjectContainer` member access to retrieve the feature.
+	There are few special characters that are converted to function calls in the rule transformation.
+	
+	* ``*`` => refers to all immediate childer of this node, which is transformed to method call :meth:`cone.public.api.ObjectContainer.__objects__`
+	* ``**`` => refers to all childer of this node, which is transformed to method call :meth:`cone.public.api.ObjectContainer.__traverse__`
+	
+	Both sides of the rule are something that the :class:`~cone.public.plugin.Relation` will somehow evaluate. How the left 
+	side and right side are evaluated, is basically specific to the implementation of the :meth:`~cone.public.plugin.Relation.execute` 
+	method of the :class:`~cone.public.plugin.Relation`. However certain basic evaluation rules apply to all :class:`~cone.public.plugin.Relation` objects.
+	
+	When a feature is referred, ConE will try to return the value of the feature. 
+	Then the Relation tries to evaluate if the given feature is bound and evaluates as True.
+	
+	So for example referring to a feature.
+	
+	``group.fea1`` is the same as writing ``group.fea1==True`` for a boolean feature.
+	``group.intfea1`` is the same as writing ``group.fea1!=0`` for a integer feature.
+	
+	If a feature is unbound, trying to access its value will raise UnboundError. 
+
+Boolean logic in rules
+----------------------
+	
+		Both left and right side of the rule can contain normal boolean algebra that is utilized in the evaluation. This uses 
+		default python syntax for boolean logic, with keywords *and*, *or*, *not*.
+
+Example of boolean logic
+^^^^^^^^^^^^^^^^^^^^^^^^  
+::
+	a.b and c.d=10 depends (not a.b.x=10 or a.b.x=0)
+
+
+
+
+Rules with different multiplicity
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+	The above mechanism enables that the rules can define relations with different multiplicity. 
+	
+	* one-to-one
+	
+		* e.g. A depends B
+	
+	* one-to-many
+	
+		* e.g. A depends B.*, which is basically the same as wrinting A depends (B.child1 and B.child2 and ..)
+		* e.g. A depends B and C
+	
+	* many-to-one
+	
+		* e.g. A.* depends B
+	
+	* many-to-many
+	
+		* e.g. A.* depends B.*
+
+Examples
+--------
+	
+	* A.B.C requires A.B.D
+	* fea.group.* requires fea.group
+	* wlan.setting maps voip.setting=10
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/XInclude.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+           xmlns:xi="http://www.w3.org/2001/XInclude"
+           targetNamespace="http://www.w3.org/2001/XInclude"
+           finalDefault="extension">
+
+  <xs:element name="include" type="xi:includeType" />
+
+  <xs:complexType name="includeType" mixed="true">
+    <xs:choice minOccurs='0' maxOccurs='unbounded' >
+      <xs:element ref='xi:fallback' />
+      <xs:any namespace='##other' processContents='lax' />
+      <xs:any namespace='##local' processContents='lax' />
+    </xs:choice>
+    <xs:attribute name="href" use="optional" type="xs:anyURI"/>
+    <xs:attribute name="parse" use="optional" default="xml"
+                  type="xi:parseType" />
+    <xs:attribute name="xpointer" use="optional" type="xs:string"/>
+    <xs:attribute name="encoding" use="optional" type="xs:string"/>
+    <xs:attribute name="accept" use="optional" type="xs:string"/>
+    <xs:attribute name="accept-language" use="optional" type="xs:string"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+  </xs:complexType>
+
+  <xs:simpleType name="parseType">
+    <xs:restriction base="xs:token">
+      <xs:enumeration value="xml"/>
+      <xs:enumeration value="text"/>
+    </xs:restriction>
+  </xs:simpleType>
+  
+  <xs:element name="fallback" type="xi:fallbackType" />
+
+  <xs:complexType name="fallbackType" mixed="true">
+    <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="xi:include"/>
+      <xs:any namespace="##other" processContents="lax"/>
+      <xs:any namespace="##local" processContents="lax"/>
+    </xs:choice>
+    <xs:anyAttribute namespace="##other" processContents="lax" />
+  </xs:complexType>
+
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/XMLSchema.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2358 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- DOCTYPE has been removed from this copy -->
+<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema" blockDefault="#all" elementFormDefault="qualified" version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="EN" xmlns:hfp="http://www.w3.org/2001/XMLSchema-hasFacetAndProperty">
+ <xs:annotation>
+  <xs:documentation>
+    Part 1 version: Id: structures.xsd,v 1.2 2004/01/15 11:34:25 ht Exp 
+    Part 2 version: Id: datatypes.xsd,v 1.3 2004/01/23 18:11:13 ht Exp 
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/2004/PER-xmlschema-1-20040318/structures.html">
+   The schema corresponding to this document is normative,
+   with respect to the syntactic constraints it expresses in the
+   XML Schema language.  The documentation (within &lt;documentation&gt; elements)
+   below, is not normative, but rather highlights important aspects of
+   the W3C Recommendation of which this is a part</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+   <xs:documentation>
+   The simpleType element and all of its members are defined
+      towards the end of this schema document</xs:documentation>
+ </xs:annotation>
+
+ <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd">
+   <xs:annotation>
+     <xs:documentation>
+       Get access to the xml: attribute groups for xml:lang
+       as declared on 'schema' and 'documentation' below
+     </xs:documentation>
+   </xs:annotation>
+ </xs:import>
+
+ <xs:complexType name="openAttrs">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by almost all schema types
+       to allow attributes from other namespaces to be
+       added to user schemas.
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:restriction base="xs:anyType">
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+     </xs:restriction>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="annotated">
+   <xs:annotation>
+     <xs:documentation>
+       This type is extended by all types which allow annotation
+       other than &lt;schema&gt; itself
+     </xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+   </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="schemaTop">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which occur freely at the top level of schemas.
+   All of their types are based on the "annotated" type by extension.</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:group ref="xs:redefinable"/>
+   <xs:element ref="xs:element"/>
+   <xs:element ref="xs:attribute"/>
+   <xs:element ref="xs:notation"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:group name="redefinable">
+  <xs:annotation>
+   <xs:documentation>
+   This group is for the
+   elements which can self-redefine (see &lt;redefine&gt; below).</xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:simpleType"/>
+   <xs:element ref="xs:complexType"/>
+   <xs:element ref="xs:group"/>
+   <xs:element ref="xs:attributeGroup"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="formChoice">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="qualified"/>
+   <xs:enumeration value="unqualified"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="reducedDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:simpleType name="derivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:reducedDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:simpleType name="typeDerivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:derivationControl">
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+  <xs:simpleType name="fullDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {extension, restriction, list, union}</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>    
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list itemType="xs:typeDerivationControl"/>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="schema" id="schema">
+  <xs:annotation>
+    <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-schema"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:sequence>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:include"/>
+       <xs:element ref="xs:import"/>
+       <xs:element ref="xs:redefine"/>
+       <xs:element ref="xs:annotation"/>
+      </xs:choice>
+      <xs:sequence minOccurs="0" maxOccurs="unbounded">
+       <xs:group ref="xs:schemaTop"/>
+       <xs:element ref="xs:annotation" minOccurs="0" maxOccurs="unbounded"/>
+      </xs:sequence>
+     </xs:sequence>
+     <xs:attribute name="targetNamespace" type="xs:anyURI"/>
+     <xs:attribute name="version" type="xs:token"/>
+     <xs:attribute name="finalDefault" type="xs:fullDerivationSet" use="optional" default=""/>
+     <xs:attribute name="blockDefault" type="xs:blockSet" use="optional" default=""/>
+     <xs:attribute name="attributeFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="elementFormDefault" type="xs:formChoice" use="optional" default="unqualified"/>
+     <xs:attribute name="id" type="xs:ID"/>
+     <xs:attribute ref="xml:lang"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+
+  <xs:key name="element">
+   <xs:selector xpath="xs:element"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="attribute">
+   <xs:selector xpath="xs:attribute"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="type">
+   <xs:selector xpath="xs:complexType|xs:simpleType"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="group">
+   <xs:selector xpath="xs:group"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="attributeGroup">
+   <xs:selector xpath="xs:attributeGroup"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+ 
+  <xs:key name="notation">
+   <xs:selector xpath="xs:notation"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+  <xs:key name="identityConstraint">
+   <xs:selector xpath=".//xs:key|.//xs:unique|.//xs:keyref"/>
+   <xs:field xpath="@name"/>
+  </xs:key>
+
+ </xs:element>
+
+ <xs:simpleType name="allNNI">
+  <xs:annotation><xs:documentation>
+   for maxOccurs</xs:documentation></xs:annotation>
+  <xs:union memberTypes="xs:nonNegativeInteger">
+   <xs:simpleType>
+    <xs:restriction base="xs:NMTOKEN">
+     <xs:enumeration value="unbounded"/>
+    </xs:restriction>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:attributeGroup name="occurs">
+  <xs:annotation><xs:documentation>
+   for all particles</xs:documentation></xs:annotation>
+  <xs:attribute name="minOccurs" type="xs:nonNegativeInteger" use="optional" default="1"/>
+  <xs:attribute name="maxOccurs" type="xs:allNNI" use="optional" default="1"/>
+ </xs:attributeGroup>
+
+ <xs:attributeGroup name="defRef">
+  <xs:annotation><xs:documentation>
+   for element, group and attributeGroup,
+   which both define and reference</xs:documentation></xs:annotation>
+  <xs:attribute name="name" type="xs:NCName"/>
+  <xs:attribute name="ref" type="xs:QName"/>
+ </xs:attributeGroup>
+
+ <xs:group name="typeDefParticle">
+  <xs:annotation>
+    <xs:documentation>
+   'complexType' uses this</xs:documentation></xs:annotation>
+  <xs:choice>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+  </xs:choice>
+ </xs:group>
+ 
+ 
+
+ <xs:group name="nestedParticle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:group name="particle">
+  <xs:choice>
+   <xs:element name="element" type="xs:localElement"/>
+   <xs:element name="group" type="xs:groupRef"/>
+   <xs:element ref="xs:all"/>
+   <xs:element ref="xs:choice"/>
+   <xs:element ref="xs:sequence"/>
+   <xs:element ref="xs:any"/>
+  </xs:choice>
+ </xs:group>
+ 
+ <xs:complexType name="attribute">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="use" use="optional" default="optional">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="prohibited"/>
+       <xs:enumeration value="optional"/>
+       <xs:enumeration value="required"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelAttribute">
+  <xs:complexContent>
+   <xs:restriction base="xs:attribute">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:element name="simpleType" minOccurs="0" type="xs:localSimpleType"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="use" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="attrDecls">
+  <xs:sequence>
+   <xs:choice minOccurs="0" maxOccurs="unbounded">
+    <xs:element name="attribute" type="xs:attribute"/>
+    <xs:element name="attributeGroup" type="xs:attributeGroupRef"/>
+   </xs:choice>
+   <xs:element ref="xs:anyAttribute" minOccurs="0"/>
+  </xs:sequence>
+ </xs:group>
+
+ <xs:element name="anyAttribute" type="xs:wildcard" id="anyAttribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-anyAttribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:group name="complexTypeModel">
+  <xs:choice>
+      <xs:element ref="xs:simpleContent"/>
+      <xs:element ref="xs:complexContent"/>
+      <xs:sequence>
+       <xs:annotation>
+        <xs:documentation>
+   This branch is short for
+   &lt;complexContent&gt;
+   &lt;restriction base="xs:anyType"&gt;
+   ...
+   &lt;/restriction&gt;
+   &lt;/complexContent&gt;</xs:documentation>
+       </xs:annotation>
+       <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+       <xs:group ref="xs:attrDecls"/>
+      </xs:sequence>
+  </xs:choice>
+ </xs:group>
+
+ <xs:complexType name="complexType" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:complexTypeModel"/>
+    <xs:attribute name="name" type="xs:NCName">
+     <xs:annotation>
+      <xs:documentation>
+      Will be restricted to required or forbidden</xs:documentation>
+     </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="mixed" type="xs:boolean" use="optional" default="false">
+     <xs:annotation>
+      <xs:documentation>
+      Not allowed if simpleContent child is chosen.
+      May be overriden by setting on complexContent child.</xs:documentation>
+    </xs:annotation>
+    </xs:attribute>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:derivationSet"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="localComplexType">
+  <xs:complexContent>
+   <xs:restriction base="xs:complexType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:complexTypeModel"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="block" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="restrictionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:group ref="xs:typeDefParticle"/>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="complexRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:typeDefParticle"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:complexType name="extensionType">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:group ref="xs:typeDefParticle" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="base" type="xs:QName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>       
+ </xs:complexType>
+
+ <xs:element name="complexContent" id="complexContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:complexRestrictionType"/>
+      <xs:element name="extension" type="xs:extensionType"/>
+     </xs:choice>     
+     <xs:attribute name="mixed" type="xs:boolean">
+      <xs:annotation>
+       <xs:documentation>
+       Overrides any setting on complexType parent.</xs:documentation>
+      </xs:annotation>
+    </xs:attribute>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="simpleRestrictionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:restrictionType">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:annotation>
+       <xs:documentation>This choice is added simply to
+                   make this a valid restriction per the REC</xs:documentation>
+      </xs:annotation>
+      <xs:group ref="xs:simpleRestrictionModel"/>
+     </xs:choice>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="simpleExtensionType">
+  <xs:complexContent>
+   <xs:restriction base="xs:extensionType">
+    <xs:sequence>
+     <xs:annotation>
+      <xs:documentation>
+      No typeDefParticle group reference</xs:documentation>
+     </xs:annotation>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="simpleContent" id="simpleContent">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-simpleContent"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:choice>
+      <xs:element name="restriction" type="xs:simpleRestrictionType"/>
+      <xs:element name="extension" type="xs:simpleExtensionType"/>
+     </xs:choice>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+ 
+ <xs:element name="complexType" type="xs:topLevelComplexType" id="complexType">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-complexType"/>
+  </xs:annotation>
+ </xs:element>
+
+
+  <xs:simpleType name="blockSet">
+   <xs:annotation>
+    <xs:documentation>
+    A utility type, not for public use</xs:documentation>
+    <xs:documentation>
+    #all or (possibly empty) subset of {substitution, extension,
+    restriction}</xs:documentation>
+   </xs:annotation>
+   <xs:union>
+    <xs:simpleType>    
+     <xs:restriction base="xs:token">
+      <xs:enumeration value="#all"/>
+     </xs:restriction>
+    </xs:simpleType>
+    <xs:simpleType>
+     <xs:list>
+      <xs:simpleType>
+       <xs:restriction base="xs:derivationControl">
+        <xs:enumeration value="extension"/>
+        <xs:enumeration value="restriction"/>
+        <xs:enumeration value="substitution"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:list>
+    </xs:simpleType>
+   </xs:union>  
+  </xs:simpleType>
+
+ <xs:complexType name="element" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   The element element can be used either
+   at the top level to define an element-type binding globally,
+   or within a content model to either reference a globally-defined
+   element or type or declare an element-type binding locally.
+   The ref form is not allowed at the top level.</xs:documentation>
+  </xs:annotation>
+
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attribute name="type" type="xs:QName"/>
+    <xs:attribute name="substitutionGroup" type="xs:QName"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+    <xs:attribute name="default" type="xs:string"/>
+    <xs:attribute name="fixed" type="xs:string"/>
+    <xs:attribute name="nillable" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="abstract" type="xs:boolean" use="optional" default="false"/>
+    <xs:attribute name="final" type="xs:derivationSet"/>
+    <xs:attribute name="block" type="xs:blockSet"/>
+    <xs:attribute name="form" type="xs:formChoice"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="topLevelElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="form" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="localElement">
+  <xs:complexContent>
+   <xs:restriction base="xs:element">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="substitutionGroup" use="prohibited"/>
+    <xs:attribute name="final" use="prohibited"/>
+    <xs:attribute name="abstract" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="element" type="xs:topLevelElement" id="element">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-element"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="group" abstract="true">
+  <xs:annotation>
+   <xs:documentation>
+   group type for explicit groups, named top-level groups and
+   group references</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:particle" minOccurs="0" maxOccurs="unbounded"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+    <xs:attributeGroup ref="xs:occurs"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="realGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0" maxOccurs="1">
+      <xs:element ref="xs:all"/>
+      <xs:element ref="xs:choice"/>
+      <xs:element ref="xs:sequence"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="namedGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="1" maxOccurs="1">
+      <xs:element name="all">
+       <xs:complexType>
+        <xs:complexContent>
+         <xs:restriction base="xs:all">
+          <xs:group ref="xs:allModel"/>
+          <xs:attribute name="minOccurs" use="prohibited"/>
+          <xs:attribute name="maxOccurs" use="prohibited"/>
+          <xs:anyAttribute namespace="##other" processContents="lax"/>
+         </xs:restriction>
+        </xs:complexContent>
+       </xs:complexType>
+      </xs:element>
+      <xs:element name="choice" type="xs:simpleExplicitGroup"/>
+      <xs:element name="sequence" type="xs:simpleExplicitGroup"/>
+     </xs:choice>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="groupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:realGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="explicitGroup">
+  <xs:annotation>
+   <xs:documentation>
+   group type for the three kinds of group</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:group">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="prohibited"/>
+    <xs:attribute name="ref" type="xs:QName" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="simpleExplicitGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:explicitGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:nestedParticle" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="prohibited"/>
+    <xs:attribute name="maxOccurs" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:group name="allModel">
+  <xs:sequence>
+      <xs:element ref="xs:annotation" minOccurs="0"/>
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:annotation>
+        <xs:documentation>This choice with min/max is here to
+                          avoid a pblm with the Elt:All/Choice/Seq
+                          Particle derivation constraint</xs:documentation>
+       </xs:annotation>
+       <xs:element name="element" type="xs:narrowMaxMin"/>
+      </xs:choice>
+     </xs:sequence>
+ </xs:group>
+ 
+ 
+ <xs:complexType name="narrowMaxMin">
+  <xs:annotation>
+   <xs:documentation>restricted max/min</xs:documentation>
+  </xs:annotation>
+  <xs:complexContent>
+   <xs:restriction base="xs:localElement">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:choice minOccurs="0">
+      <xs:element name="simpleType" type="xs:localSimpleType"/>
+      <xs:element name="complexType" type="xs:localComplexType"/>
+     </xs:choice>
+     <xs:group ref="xs:identityConstraint" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="minOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:nonNegativeInteger">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:attribute name="maxOccurs" use="optional" default="1">
+     <xs:simpleType>
+      <xs:restriction base="xs:allNNI">
+       <xs:enumeration value="0"/>
+       <xs:enumeration value="1"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:complexType name="all">
+   <xs:annotation>
+    <xs:documentation>
+   Only elements allowed inside</xs:documentation>
+   </xs:annotation>
+   <xs:complexContent>
+    <xs:restriction base="xs:explicitGroup">
+     <xs:group ref="xs:allModel"/>
+     <xs:attribute name="minOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:nonNegativeInteger">
+        <xs:enumeration value="0"/>
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:attribute name="maxOccurs" use="optional" default="1">
+      <xs:simpleType>
+       <xs:restriction base="xs:allNNI">
+        <xs:enumeration value="1"/>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+     <xs:anyAttribute namespace="##other" processContents="lax"/>
+    </xs:restriction>
+   </xs:complexContent>
+  </xs:complexType>
+
+ <xs:element name="all" id="all" type="xs:all">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-all"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="choice" type="xs:explicitGroup" id="choice">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-choice"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="sequence" type="xs:explicitGroup" id="sequence">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-sequence"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="group" type="xs:namedGroup" id="group">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-group"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="wildcard">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:attribute name="namespace" type="xs:namespaceList" use="optional" default="##any"/>
+    <xs:attribute name="processContents" use="optional" default="strict">
+     <xs:simpleType>
+      <xs:restriction base="xs:NMTOKEN">
+       <xs:enumeration value="skip"/>
+       <xs:enumeration value="lax"/>
+       <xs:enumeration value="strict"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="any" id="any">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-any"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:wildcard">
+     <xs:attributeGroup ref="xs:occurs"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+  <xs:annotation>
+   <xs:documentation>
+   simple type for the value of the 'namespace' attr of
+   'any' and 'anyAttribute'</xs:documentation>
+  </xs:annotation>
+  <xs:annotation>
+   <xs:documentation>
+   Value is
+              ##any      - - any non-conflicting WFXML/attribute at all
+
+              ##other    - - any non-conflicting WFXML/attribute from
+                              namespace other than targetNS
+
+              ##local    - - any unqualified non-conflicting WFXML/attribute 
+
+              one or     - - any non-conflicting WFXML/attribute from
+              more URI        the listed namespaces
+              references
+              (space separated)
+
+    ##targetNamespace or ##local may appear in the above list, to
+        refer to the targetNamespace of the enclosing
+        schema or an absent targetNamespace respectively</xs:documentation>
+  </xs:annotation>
+
+ <xs:simpleType name="namespaceList">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="##any"/>
+     <xs:enumeration value="##other"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:union memberTypes="xs:anyURI">
+       <xs:simpleType>
+        <xs:restriction base="xs:token">
+         <xs:enumeration value="##targetNamespace"/>
+         <xs:enumeration value="##local"/>
+        </xs:restriction>
+       </xs:simpleType>
+      </xs:union>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+ <xs:element name="attribute" type="xs:topLevelAttribute" id="attribute">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attribute"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:complexType name="attributeGroup" abstract="true">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:group ref="xs:attrDecls"/>
+    <xs:attributeGroup ref="xs:defRef"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ 
+ <xs:complexType name="namedAttributeGroup">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+     <xs:group ref="xs:attrDecls"/>
+    </xs:sequence>
+    <xs:attribute name="name" use="required" type="xs:NCName"/>
+    <xs:attribute name="ref" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:complexType name="attributeGroupRef">
+  <xs:complexContent>
+   <xs:restriction base="xs:attributeGroup">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="ref" use="required" type="xs:QName"/>
+    <xs:attribute name="name" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:element name="attributeGroup" type="xs:namedAttributeGroup" id="attributeGroup">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-attributeGroup"/>
+  </xs:annotation>
+ </xs:element>
+
+ <xs:element name="include" id="include">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-include"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="redefine" id="redefine">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-redefine"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:openAttrs">
+     <xs:choice minOccurs="0" maxOccurs="unbounded">
+      <xs:element ref="xs:annotation"/>
+      <xs:group ref="xs:redefinable"/>
+     </xs:choice>
+     <xs:attribute name="schemaLocation" type="xs:anyURI" use="required"/>
+     <xs:attribute name="id" type="xs:ID"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="import" id="import">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-import"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="namespace" type="xs:anyURI"/>
+     <xs:attribute name="schemaLocation" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="selector" id="selector">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-selector"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in selectors</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the following EBNF:
+          Selector    ::=    Path ( '|' Path )*  
+          Path    ::=    ('.//')? Step ( '/' Step )*  
+          Step    ::=    '.' | NameTest  
+          NameTest    ::=    QName | '*' | NCName ':' '*'  
+                           child:: is also allowed
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*(\|(\.//)?(((child::)?((\i\c*:)?(\i\c*|\*)))|\.)(/(((child::)?((\i\c*:)?(\i\c*|\*)))|\.))*)*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="field" id="field">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-field"/>
+  </xs:annotation>
+  <xs:complexType>
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+     <xs:attribute name="xpath" use="required">
+      <xs:simpleType>
+       <xs:annotation>
+        <xs:documentation>A subset of XPath expressions for use
+in fields</xs:documentation>
+        <xs:documentation>A utility type, not for public
+use</xs:documentation>
+       </xs:annotation>
+       <xs:restriction base="xs:token">
+        <xs:annotation>
+         <xs:documentation>The following pattern is intended to allow XPath
+                           expressions per the same EBNF as for selector,
+                           with the following change:
+          Path    ::=    ('.//')? ( Step '/' )* ( Step | '@' NameTest ) 
+         </xs:documentation>
+        </xs:annotation>
+        <xs:pattern value="(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*))))(\|(\.//)?((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)/)*((((child::)?((\i\c*:)?(\i\c*|\*)))|\.)|((attribute::|@)((\i\c*:)?(\i\c*|\*)))))*">
+        </xs:pattern>
+       </xs:restriction>
+      </xs:simpleType>
+     </xs:attribute>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:complexType name="keybase">
+  <xs:complexContent>
+   <xs:extension base="xs:annotated">
+    <xs:sequence>
+     <xs:element ref="xs:selector"/>
+     <xs:element ref="xs:field" minOccurs="1" maxOccurs="unbounded"/>
+    </xs:sequence>
+    <xs:attribute name="name" type="xs:NCName" use="required"/>
+   </xs:extension>
+  </xs:complexContent>
+ </xs:complexType>
+
+ <xs:group name="identityConstraint">
+  <xs:annotation>
+   <xs:documentation>The three kinds of identity constraints, all with
+                     type of or derived from 'keybase'.
+   </xs:documentation>
+  </xs:annotation>
+  <xs:choice>
+   <xs:element ref="xs:unique"/>
+   <xs:element ref="xs:key"/>
+   <xs:element ref="xs:keyref"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:element name="unique" type="xs:keybase" id="unique">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-unique"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="key" type="xs:keybase" id="key">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-key"/>
+  </xs:annotation>
+ </xs:element>
+ <xs:element name="keyref" id="keyref">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-keyref"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:keybase">
+     <xs:attribute name="refer" type="xs:QName" use="required"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:element name="notation" id="notation">
+  <xs:annotation>
+   <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-notation"/>
+  </xs:annotation>
+  <xs:complexType>
+   <xs:complexContent>
+    <xs:extension base="xs:annotated">
+     <xs:attribute name="name" type="xs:NCName" use="required"/>
+     <xs:attribute name="public" type="xs:public"/>
+     <xs:attribute name="system" type="xs:anyURI"/>
+    </xs:extension>
+   </xs:complexContent>
+  </xs:complexType>
+ </xs:element>
+
+ <xs:simpleType name="public">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+   <xs:documentation>
+   A public identifier, per ISO 8879</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:token"/>
+ </xs:simpleType>
+
+ <xs:element name="appinfo" id="appinfo">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-appinfo"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="documentation" id="documentation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-documentation"/>
+   </xs:annotation>
+   <xs:complexType mixed="true">
+    <xs:sequence minOccurs="0" maxOccurs="unbounded">
+     <xs:any processContents="lax"/>
+    </xs:sequence>
+    <xs:attribute name="source" type="xs:anyURI"/>
+    <xs:attribute ref="xml:lang"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:element name="annotation" id="annotation">
+   <xs:annotation>
+     <xs:documentation source="http://www.w3.org/TR/xmlschema-1/#element-annotation"/>
+   </xs:annotation>
+   <xs:complexType>
+    <xs:complexContent>
+     <xs:extension base="xs:openAttrs">
+      <xs:choice minOccurs="0" maxOccurs="unbounded">
+       <xs:element ref="xs:appinfo"/>
+       <xs:element ref="xs:documentation"/>
+      </xs:choice>
+      <xs:attribute name="id" type="xs:ID"/>
+     </xs:extension>
+    </xs:complexContent>
+   </xs:complexType>
+ </xs:element>
+
+ <xs:annotation>
+  <xs:documentation>
+   notations for use within XML Schema schemas</xs:documentation>
+ </xs:annotation>
+
+ <xs:notation name="XMLSchemaStructures" public="structures" system="http://www.w3.org/2000/08/XMLSchema.xsd"/>
+ <xs:notation name="XML" public="REC-xml-19980210" system="http://www.w3.org/TR/1998/REC-xml-19980210"/>
+  
+ <xs:complexType name="anyType" mixed="true">
+  <xs:annotation>
+   <xs:documentation>
+   Not the real urType, but as close an approximation as we can
+   get in the XML representation</xs:documentation>
+  </xs:annotation>
+  <xs:sequence>
+   <xs:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
+  </xs:sequence>
+  <xs:anyAttribute processContents="lax"/>
+ </xs:complexType>
+
+  <xs:annotation>
+    <xs:documentation>
+      First the built-in primitive datatypes.  These definitions are for
+      information only, the real built-in definitions are magic.
+    </xs:documentation>
+
+    <xs:documentation>
+      For each built-in datatype in this schema (both primitive and
+      derived) can be uniquely addressed via a URI constructed
+      as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype
+
+      For example, to address the int datatype, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int
+
+      Additionally, each facet definition element can be uniquely
+      addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the facet
+
+      For example, to address the maxInclusive facet, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#maxInclusive
+
+      Additionally, each facet usage in a built-in datatype definition
+      can be uniquely addressed via a URI constructed as follows:
+        1) the base URI is the URI of the XML Schema namespace
+        2) the fragment identifier is the name of the datatype, followed
+           by a period (".") followed by the name of the facet
+
+      For example, to address the usage of the maxInclusive facet in
+      the definition of int, the URI is:
+
+        http://www.w3.org/2001/XMLSchema#int.maxInclusive
+
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="string" id="string">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#string"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="preserve" id="string.preserve"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="boolean" id="boolean">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#boolean"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="boolean.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="float" id="float">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#float"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="float.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="double" id="double">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#double"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="double.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="decimal" id="decimal">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="totalDigits"/>
+        <hfp:hasFacet name="fractionDigits"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="total"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="true"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#decimal"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="decimal.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="duration" id="duration">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#duration"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="duration.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="dateTime" id="dateTime">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#dateTime"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="dateTime.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="time" id="time">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#time"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="time.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="date" id="date">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#date"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="date.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYearMonth" id="gYearMonth">
+   <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gYearMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="gYearMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gYear" id="gYear">
+    <xs:annotation>
+    <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gYear"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="gYear.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonthDay" id="gMonthDay">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+       <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gMonthDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse" fixed="true" id="gMonthDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="gDay" id="gDay">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gDay"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse" fixed="true" id="gDay.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="gMonth" id="gMonth">
+    <xs:annotation>
+  <xs:appinfo>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="maxInclusive"/>
+        <hfp:hasFacet name="maxExclusive"/>
+        <hfp:hasFacet name="minInclusive"/>
+        <hfp:hasFacet name="minExclusive"/>
+        <hfp:hasProperty name="ordered" value="partial"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#gMonth"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+         <xs:whiteSpace value="collapse" fixed="true" id="gMonth.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="hexBinary" id="hexBinary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="hexBinary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+ <xs:simpleType name="base64Binary" id="base64Binary">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#base64Binary"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="base64Binary.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+   <xs:simpleType name="anyURI" id="anyURI">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#anyURI"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="anyURI.whiteSpace"/>
+    </xs:restriction>
+   </xs:simpleType>
+
+  <xs:simpleType name="QName" id="QName">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#QName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="QName.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="NOTATION" id="NOTATION">
+    <xs:annotation>
+        <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NOTATION"/>
+      <xs:documentation>
+        NOTATION cannot be used directly in a schema; rather a type
+        must be derived from it by specifying at least one enumeration
+        facet whose value is the name of a NOTATION declared in the
+        schema.
+      </xs:documentation>
+    </xs:annotation>
+    <xs:restriction base="xs:anySimpleType">
+      <xs:whiteSpace value="collapse" fixed="true" id="NOTATION.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:annotation>
+    <xs:documentation>
+      Now the derived primitive types
+    </xs:documentation>
+  </xs:annotation>
+
+  <xs:simpleType name="normalizedString" id="normalizedString">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#normalizedString"/>
+    </xs:annotation>
+    <xs:restriction base="xs:string">
+      <xs:whiteSpace value="replace" id="normalizedString.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="token" id="token">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#token"/>
+    </xs:annotation>
+    <xs:restriction base="xs:normalizedString">
+      <xs:whiteSpace value="collapse" id="token.whiteSpace"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="language" id="language">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#language"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="[a-zA-Z]{1,8}(-[a-zA-Z0-9]{1,8})*" id="language.pattern">
+        <xs:annotation>
+          <xs:documentation source="http://www.ietf.org/rfc/rfc3066.txt">
+            pattern specifies the content of section 2.12 of XML 1.0e2
+            and RFC 3066 (Revised version of RFC 1766).
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="IDREFS" id="IDREFS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#IDREFS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:IDREF"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="IDREFS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="ENTITIES" id="ENTITIES">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#ENTITIES"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:ENTITY"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="ENTITIES.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKEN" id="NMTOKEN">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NMTOKEN"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\c+" id="NMTOKEN.pattern">
+        <xs:annotation>
+          <xs:documentation source="http://www.w3.org/TR/REC-xml#NT-Nmtoken">
+            pattern matches production 7 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NMTOKENS" id="NMTOKENS">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasFacet name="length"/>
+        <hfp:hasFacet name="minLength"/>
+        <hfp:hasFacet name="maxLength"/>
+        <hfp:hasFacet name="enumeration"/>
+        <hfp:hasFacet name="whiteSpace"/>
+        <hfp:hasFacet name="pattern"/>
+        <hfp:hasProperty name="ordered" value="false"/>
+        <hfp:hasProperty name="bounded" value="false"/>
+        <hfp:hasProperty name="cardinality" value="countably infinite"/>
+        <hfp:hasProperty name="numeric" value="false"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NMTOKENS"/>
+    </xs:annotation>
+    <xs:restriction>
+      <xs:simpleType>
+        <xs:list itemType="xs:NMTOKEN"/>
+      </xs:simpleType>
+        <xs:minLength value="1" id="NMTOKENS.minLength"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="Name" id="Name">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#Name"/>
+    </xs:annotation>
+    <xs:restriction base="xs:token">
+      <xs:pattern value="\i\c*" id="Name.pattern">
+        <xs:annotation>
+          <xs:documentation source="http://www.w3.org/TR/REC-xml#NT-Name">
+            pattern matches production 5 from the XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="NCName" id="NCName">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#NCName"/>
+    </xs:annotation>
+    <xs:restriction base="xs:Name">
+      <xs:pattern value="[\i-[:]][\c-[:]]*" id="NCName.pattern">
+        <xs:annotation>
+          <xs:documentation source="http://www.w3.org/TR/REC-xml-names/#NT-NCName">
+            pattern matches production 4 from the Namespaces in XML spec
+          </xs:documentation>
+        </xs:annotation>
+      </xs:pattern>
+    </xs:restriction>
+  </xs:simpleType>
+
+   <xs:simpleType name="ID" id="ID">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#ID"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="IDREF" id="IDREF">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#IDREF"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+   <xs:simpleType name="ENTITY" id="ENTITY">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#ENTITY"/>
+    </xs:annotation>
+    <xs:restriction base="xs:NCName"/>
+   </xs:simpleType>
+
+  <xs:simpleType name="integer" id="integer">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#integer"/>
+    </xs:annotation>
+    <xs:restriction base="xs:decimal">
+      <xs:fractionDigits value="0" fixed="true" id="integer.fractionDigits"/>
+      <xs:pattern value="[\-+]?[0-9]+"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonPositiveInteger" id="nonPositiveInteger">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#nonPositiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:maxInclusive value="0" id="nonPositiveInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="negativeInteger" id="negativeInteger">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#negativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonPositiveInteger">
+      <xs:maxInclusive value="-1" id="negativeInteger.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="long" id="long">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#long"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="-9223372036854775808" id="long.minInclusive"/>
+      <xs:maxInclusive value="9223372036854775807" id="long.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="int" id="int">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#int"/>
+    </xs:annotation>
+    <xs:restriction base="xs:long">
+      <xs:minInclusive value="-2147483648" id="int.minInclusive"/>
+      <xs:maxInclusive value="2147483647" id="int.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="short" id="short">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#short"/>
+    </xs:annotation>
+    <xs:restriction base="xs:int">
+      <xs:minInclusive value="-32768" id="short.minInclusive"/>
+      <xs:maxInclusive value="32767" id="short.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="byte" id="byte">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#byte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:short">
+      <xs:minInclusive value="-128" id="byte.minInclusive"/>
+      <xs:maxInclusive value="127" id="byte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="nonNegativeInteger" id="nonNegativeInteger">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#nonNegativeInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:integer">
+      <xs:minInclusive value="0" id="nonNegativeInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedLong" id="unsignedLong">
+    <xs:annotation>
+      <xs:appinfo>
+        <hfp:hasProperty name="bounded" value="true"/>
+        <hfp:hasProperty name="cardinality" value="finite"/>
+      </xs:appinfo>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#unsignedLong"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:maxInclusive value="18446744073709551615" id="unsignedLong.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedInt" id="unsignedInt">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#unsignedInt"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedLong">
+      <xs:maxInclusive value="4294967295" id="unsignedInt.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedShort" id="unsignedShort">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#unsignedShort"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedInt">
+      <xs:maxInclusive value="65535" id="unsignedShort.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="unsignedByte" id="unsignedByte">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#unsignedByte"/>
+    </xs:annotation>
+    <xs:restriction base="xs:unsignedShort">
+      <xs:maxInclusive value="255" id="unsignedByte.maxInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+  <xs:simpleType name="positiveInteger" id="positiveInteger">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#positiveInteger"/>
+    </xs:annotation>
+    <xs:restriction base="xs:nonNegativeInteger">
+      <xs:minInclusive value="1" id="positiveInteger.minInclusive"/>
+    </xs:restriction>
+  </xs:simpleType>
+
+ <xs:simpleType name="derivationControl">
+  <xs:annotation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:restriction base="xs:NMTOKEN">
+   <xs:enumeration value="substitution"/>
+   <xs:enumeration value="extension"/>
+   <xs:enumeration value="restriction"/>
+   <xs:enumeration value="list"/>
+   <xs:enumeration value="union"/>
+  </xs:restriction>
+ </xs:simpleType>
+
+ <xs:group name="simpleDerivation">
+  <xs:choice>
+    <xs:element ref="xs:restriction"/>
+    <xs:element ref="xs:list"/>
+    <xs:element ref="xs:union"/>
+  </xs:choice>
+ </xs:group>
+
+ <xs:simpleType name="simpleDerivationSet">
+  <xs:annotation>
+   <xs:documentation>
+   #all or (possibly empty) subset of {restriction, union, list}
+   </xs:documentation>
+   <xs:documentation>
+   A utility type, not for public use</xs:documentation>
+  </xs:annotation>
+  <xs:union>
+   <xs:simpleType>
+    <xs:restriction base="xs:token">
+     <xs:enumeration value="#all"/>
+    </xs:restriction>
+   </xs:simpleType>
+   <xs:simpleType>
+    <xs:list>
+     <xs:simpleType>
+      <xs:restriction base="xs:derivationControl">
+       <xs:enumeration value="list"/>
+       <xs:enumeration value="union"/>
+       <xs:enumeration value="restriction"/>
+      </xs:restriction>
+     </xs:simpleType>
+    </xs:list>
+   </xs:simpleType>
+  </xs:union>
+ </xs:simpleType>
+
+  <xs:complexType name="simpleType" abstract="true">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:group ref="xs:simpleDerivation"/>
+        <xs:attribute name="final" type="xs:simpleDerivationSet"/>
+        <xs:attribute name="name" type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Can be restricted to required or forbidden
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="topLevelSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="required" type="xs:NCName">
+          <xs:annotation>
+            <xs:documentation>
+              Required at the top level
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="localSimpleType">
+    <xs:complexContent>
+      <xs:restriction base="xs:simpleType">
+        <xs:sequence>
+          <xs:element ref="xs:annotation" minOccurs="0"/>
+          <xs:group ref="xs:simpleDerivation"/>
+        </xs:sequence>
+        <xs:attribute name="name" use="prohibited">
+          <xs:annotation>
+            <xs:documentation>
+              Forbidden when nested
+            </xs:documentation>
+          </xs:annotation>
+        </xs:attribute>
+        <xs:attribute name="final" use="prohibited"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="simpleType" type="xs:topLevelSimpleType" id="simpleType">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-simpleType"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:group name="facets">
+   <xs:annotation>
+    <xs:documentation>
+       We should use a substitution group for facets, but
+       that's ruled out because it would allow users to
+       add their own, which we're not ready for yet.
+    </xs:documentation>
+   </xs:annotation>
+   <xs:choice>
+    <xs:element ref="xs:minExclusive"/>
+    <xs:element ref="xs:minInclusive"/>
+    <xs:element ref="xs:maxExclusive"/>
+    <xs:element ref="xs:maxInclusive"/>
+    <xs:element ref="xs:totalDigits"/>
+    <xs:element ref="xs:fractionDigits"/>
+    <xs:element ref="xs:length"/>
+    <xs:element ref="xs:minLength"/>
+    <xs:element ref="xs:maxLength"/>
+    <xs:element ref="xs:enumeration"/>
+    <xs:element ref="xs:whiteSpace"/>
+    <xs:element ref="xs:pattern"/>
+   </xs:choice>
+  </xs:group>
+
+  <xs:group name="simpleRestrictionModel">
+   <xs:sequence>
+    <xs:element name="simpleType" type="xs:localSimpleType" minOccurs="0"/>
+    <xs:group ref="xs:facets" minOccurs="0" maxOccurs="unbounded"/>
+   </xs:sequence>
+  </xs:group>
+
+  <xs:element name="restriction" id="restriction">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-restriction">
+          base attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+         <xs:group ref="xs:simpleRestrictionModel"/>
+         <xs:attribute name="base" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="list" id="list">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-list">
+          itemType attribute and simpleType child are mutually
+          exclusive, but one or other is required
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="itemType" type="xs:QName" use="optional"/>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="union" id="union">
+   <xs:complexType>
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-union">
+          memberTypes attribute must be non-empty or there must be
+          at least one simpleType child
+        </xs:documentation>
+      </xs:annotation>
+      <xs:complexContent>
+        <xs:extension base="xs:annotated">
+          <xs:sequence>
+            <xs:element name="simpleType" type="xs:localSimpleType" minOccurs="0" maxOccurs="unbounded"/>
+          </xs:sequence>
+          <xs:attribute name="memberTypes" use="optional">
+            <xs:simpleType>
+              <xs:list itemType="xs:QName"/>
+            </xs:simpleType>
+          </xs:attribute>
+        </xs:extension>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:complexType name="facet">
+    <xs:complexContent>
+      <xs:extension base="xs:annotated">
+        <xs:attribute name="value" use="required"/>
+        <xs:attribute name="fixed" type="xs:boolean" use="optional" default="false"/>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+ <xs:complexType name="noFixedFacet">
+  <xs:complexContent>
+   <xs:restriction base="xs:facet">
+    <xs:sequence>
+     <xs:element ref="xs:annotation" minOccurs="0"/>
+    </xs:sequence>
+    <xs:attribute name="fixed" use="prohibited"/>
+    <xs:anyAttribute namespace="##other" processContents="lax"/>
+   </xs:restriction>
+  </xs:complexContent>
+ </xs:complexType>
+
+  <xs:element name="minExclusive" id="minExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-minExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minInclusive" id="minInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-minInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="maxExclusive" id="maxExclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-maxExclusive"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxInclusive" id="maxInclusive" type="xs:facet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-maxInclusive"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:complexType name="numFacet">
+    <xs:complexContent>
+      <xs:restriction base="xs:facet">
+       <xs:sequence>
+         <xs:element ref="xs:annotation" minOccurs="0"/>
+       </xs:sequence>
+       <xs:attribute name="value" type="xs:nonNegativeInteger" use="required"/>
+       <xs:anyAttribute namespace="##other" processContents="lax"/>
+      </xs:restriction>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="totalDigits" id="totalDigits">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-totalDigits"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:numFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:positiveInteger" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="fractionDigits" id="fractionDigits" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-fractionDigits"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="length" id="length" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-length"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="minLength" id="minLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-minLength"/>
+    </xs:annotation>
+  </xs:element>
+  <xs:element name="maxLength" id="maxLength" type="xs:numFacet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-maxLength"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="enumeration" id="enumeration" type="xs:noFixedFacet">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-enumeration"/>
+    </xs:annotation>
+  </xs:element>
+
+  <xs:element name="whiteSpace" id="whiteSpace">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-whiteSpace"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:facet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" use="required">
+            <xs:simpleType>
+              <xs:restriction base="xs:NMTOKEN">
+                <xs:enumeration value="preserve"/>
+                <xs:enumeration value="replace"/>
+                <xs:enumeration value="collapse"/>
+              </xs:restriction>
+            </xs:simpleType>
+          </xs:attribute>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+
+  <xs:element name="pattern" id="pattern">
+    <xs:annotation>
+      <xs:documentation source="http://www.w3.org/TR/xmlschema-2/#element-pattern"/>
+    </xs:annotation>
+    <xs:complexType>
+      <xs:complexContent>
+        <xs:restriction base="xs:noFixedFacet">
+          <xs:sequence>
+            <xs:element ref="xs:annotation" minOccurs="0"/>
+          </xs:sequence>
+          <xs:attribute name="value" type="xs:string" use="required"/>
+         <xs:anyAttribute namespace="##other" processContents="lax"/>
+        </xs:restriction>
+      </xs:complexContent>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/confml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="utf-8"?>
+	<!--
+		Scheme according to 0.83 2.6.2008 Draft s60configurationml.doc 11.08.
+		2008 initial version hajduivo 2008-08-14 hajduivo update: xlink
+		added,but generated xml files contains wrong prefix at xlink
+		attributes 2008-08-15 hajduivo update: XInclude added
+	-->
+	<!--
+		DOCTYPE schema [ <!ENTITY ncname "[^:\I][^:\C]*"> <!ENTITY qname
+		"(&ncname;:)?&ncname;"> <!ENTITY aname "@&qname;"> <!ENTITY pos_t
+		"\[\d+\]"> <!ENTITY attr_t "\[&aname;=('|&quot;)(.)*('|&quot;)\]">
+		<!ENTITY name_t "\[(&qname;|\.)=('|&quot;)(.)*('|&quot;)\]"> <!ENTITY
+		cond "(&attr_t;|&name_t;)?(&pos_t;)?| (&pos_t;)?(&attr_t;|&name_t;)?">
+		<!ENTITY step "(&qname;|\*)(&cond;)?"> <!ENTITY pi
+		"processing-instruction\ ((('|&quot;)&qname;('|&quot;))?\)"> <!ENTITY
+		id "id\((('|&quot;)&ncname;('|&quot;))?\)"> <!ENTITY comm
+		"comment\(\)"> <!ENTITY text "text\(\)"> <!ENTITY nspace
+		"namespace::&ncname;"> <!ENTITY last
+		"&step;|&aname;|&nspace;|(&comm;(&pos_t;)?)|&text;(&pos_t;)?|&pi;(&pos_t;)?">
+		] <xs:import id="xi" namespace="http://www.w3.org/2001/xinclude"
+		schemaLocation="XInclude.xsd"/>
+	-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:tns="http://www.s60.com/xml/confml/1" xmlns:xlink="http://www.w3.org/1999/xlink"
+	xmlns:xi="http://www.w3.org/2001/XInclude" targetNamespace="http://www.s60.com/xml/confml/1"
+	elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:import id="xlink" namespace="http://www.w3.org/1999/xlink"
+		schemaLocation="xlink.xsd" />
+	<xs:import id="xs" namespace="http://www.w3.org/2001/XMLSchema"
+		schemaLocation="XMLSchema.xsd" />
+	<xs:import namespace="http://www.w3.org/2001/XInclude"
+		schemaLocation="XInclude.xsd" />
+	<xs:import namespace="http://www.s60.com/xml/confml/2"
+		schemaLocation="confml2.xsd" />
+		
+	<!-- Fixed Elements -->
+	<xs:element name="configuration" type="tns:configurationType" />
+	<xs:element name="meta" type="tns:metaType" />
+	<xs:element name="desc" type="tns:descType" />
+	<xs:element name="icon" type="tns:iconType" />
+	<xs:element name="view" type="tns:viewType" />
+	<xs:element name="group" type="tns:groupType" />
+	<xs:element name="feature" type="tns:featureType" />
+	<xs:element name="setting" type="tns:settingType" />
+	<xs:element name="data" type="tns:dataType" />
+	<xs:element name="rfs" type="tns:rfsType" />
+	<xs:element name="link" type="tns:linkType" />
+	<xs:element name="option" type="tns:optionType" />
+	<xs:element name="property" type="tns:propertyType" />
+	<xs:complexType name="configurationType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:meta" />
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:view" />
+			<xs:element ref="tns:feature" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:data" />
+			<xs:element ref="tns:rfs" />
+			<xs:element ref="tns:configuration" />
+			<xs:element ref="xi:include"/>
+		</xs:choice>
+		<xs:attribute name="version" type="xs:NMTOKEN" />
+		<xs:attribute name="name" type="xs:string" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="metaType">
+		<xs:all>
+			<xs:element name="id" type="tns:idType" minOccurs="0" />
+			<xs:element name="date" type="tns:dateType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="owner" type="tns:ownerType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="editor" type="tns:editorType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="product" type="tns:productType"
+				maxOccurs="1" minOccurs="0" />
+			<xs:element name="status" type="tns:statusType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="platform" type="tns:platformType"
+				maxOccurs="1" minOccurs="0" />
+			<xs:element name="version" minOccurs="0" type="tns:versionType" />
+			<xs:element name="release" minOccurs="0" type="tns:releaseType" />
+			<xs:element name="customer" minOccurs="0" type="tns:customerType" />
+			<xs:element name="desc" minOccurs="0" type="tns:descType" />
+			<xs:element name="icon" minOccurs="0" type="tns:iconType" />
+			<xs:element ref="tns:link" maxOccurs="1" minOccurs="0"></xs:element>
+		</xs:all>
+	</xs:complexType>
+	<xs:complexType name="descType" mixed="true">
+		<xs:attribute ref="xlink:href" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="iconType">
+		<xs:attribute ref="xlink:href" use="optional" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="linkType">
+		<xs:attribute ref="xlink:href" use="optional" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="propertyType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:NMTOKEN" use="optional"></xs:attribute>
+		<xs:attribute name="value" type="xs:string"></xs:attribute>
+		<xs:attribute name="unit" type="xs:token"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="settingType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:option" />
+			<xs:element ref="tns:property" />
+			<xs:element ref="tns:setting" />
+			<xs:element ref="xs:minInclusive"></xs:element>
+			<xs:element ref="xs:maxInclusive"></xs:element>
+			<xs:element ref="xs:minExclusive"></xs:element>
+			<xs:element ref="xs:maxExclusive"></xs:element>
+			<xs:element ref="xs:pattern"></xs:element>
+			<xs:element ref="xs:length"></xs:element>
+			<xs:element ref="xs:minLength"></xs:element>
+			<xs:element ref="xs:maxLength"></xs:element>
+			<xs:element ref="xs:totalDigits"></xs:element>
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="relevant" type="xs:token" default="true"></xs:attribute>
+		<xs:attribute name="constraint" type="xs:token" default="true">
+		</xs:attribute>
+		<xs:attribute name="readOnly" type="xs:NMTOKEN" default="true">
+		</xs:attribute>
+		<xs:attribute name="name" type="xs:string"></xs:attribute>
+		<xs:attribute name="type" type="tns:typeType" use="optional"></xs:attribute>
+		<xs:attribute name="ref" type="xs:string" use="optional"></xs:attribute>
+		<!--
+			TODO inconsistent defaults: for generic settings this does not have a
+			sense
+		-->
+		<xs:attribute name="minOccurs" type="xs:nonNegativeInteger"
+			default="0"></xs:attribute>
+		<xs:attribute name="maxOccurs" type="xs:allNNI" default="unbounded"></xs:attribute>
+		<xs:attribute name="mapKey" type="xs:string"></xs:attribute>
+		<xs:attribute name="mapValue" type="xs:string"></xs:attribute>
+		<xs:attribute name="required" type="xs:boolean" default="false"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="featureType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:setting"></xs:element>
+		</xs:choice>
+		<xs:attribute name="name" type="xs:string" />
+		<xs:attribute name="relevant" type="xs:string"></xs:attribute>
+		<xs:attribute name="ref" type="xs:NMTOKEN" use="required" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="optionType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:token" use="optional"></xs:attribute>
+		<xs:attribute name="value" type="xs:string" use="optional"></xs:attribute>
+		<xs:attribute name="relevant" type="xs:token" default="true"></xs:attribute>
+		<xs:attribute name="map" type="xs:string"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="groupType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:group" />
+			<xs:element ref="tns:setting" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="viewType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:meta" />
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:group"></xs:element>
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:token" use="optional"></xs:attribute>
+	</xs:complexType>
+	<xs:simpleType name="idType">
+		<xs:restriction base="xs:NMTOKEN"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="dateType">
+		<xs:restriction base="xs:date"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="ownerType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="editorType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="productType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="statusType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="platformType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="versionType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="releaseType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="customerType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+<!-- <xs:attribute name="id" type="xs:NMTOKEN" />-->
+	<!--
+		<xs:attribute name="href" type="xs:anyURI" /> <xs:attribute
+		name="title" type="xs:string" />
+	-->
+	<xs:attributeGroup name="CommonAttrs">
+		<xs:attribute name="id" type="xs:ID"></xs:attribute>
+	</xs:attributeGroup>
+	<xs:complexType name="dataType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" minOccurs="0"
+				maxOccurs="unbounded"></xs:any>
+		</xs:sequence>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="extensionPolicy" type="xs:NMTOKEN"
+			default="replace">
+		</xs:attribute>
+		<xs:attribute name="template" type="xs:NMTOKEN" default="false"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="rfsType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" minOccurs="0"
+				maxOccurs="unbounded"></xs:any>
+		</xs:sequence>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:simpleType name="typeType">
+		<xs:restriction base="xs:string">
+			<xs:enumeration id="int" value="int"></xs:enumeration>
+			<xs:enumeration value="boolean"></xs:enumeration>
+			<xs:enumeration value="real"></xs:enumeration>
+			<xs:enumeration value="string"></xs:enumeration>
+			<xs:enumeration value="file"></xs:enumeration>
+			<xs:enumeration value="folder"></xs:enumeration>
+			<xs:enumeration value="sequence"></xs:enumeration>
+			<xs:enumeration value="selection"></xs:enumeration>
+			<xs:enumeration value="multiSelection"></xs:enumeration>
+			<xs:enumeration value="date"></xs:enumeration>
+			<xs:enumeration value="time"></xs:enumeration>
+			<xs:enumeration value="dateTime"></xs:enumeration>
+			<xs:enumeration value="duration"></xs:enumeration>
+		</xs:restriction>
+	</xs:simpleType>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/confml2.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,274 @@
+<?xml version="1.0" encoding="utf-8"?>
+	<!--
+		Scheme according to 0.84 2.6.2008 Draft s60configurationml.doc 11.08.
+		2008 initial version hajduivo 2008-08-14 hajduivo update: xlink
+		added,but generated xml files contains wrong prefix at xlink
+		attributes 2008-08-15 hajduivo update: XInclude added
+	-->
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:tns="http://www.s60.com/xml/confml/2" xmlns:xlink="http://www.w3.org/1999/xlink"
+	xmlns:xi="http://www.w3.org/2001/XInclude" targetNamespace="http://www.s60.com/xml/confml/2"
+	elementFormDefault="qualified" attributeFormDefault="unqualified">
+	<xs:import id="xlink" namespace="http://www.w3.org/1999/xlink"
+		schemaLocation="xlink.xsd" />
+	<xs:import id="xs" namespace="http://www.w3.org/2001/XMLSchema"
+		schemaLocation="XMLSchema.xsd" />
+	<xs:import namespace="http://www.w3.org/2001/XInclude"
+		schemaLocation="XInclude.xsd" />
+		
+	<!-- Fixed Elements -->
+	<xs:element name="configuration" type="tns:configurationType" />
+	<xs:element name="meta" type="tns:metaType" />
+	<xs:element name="desc" type="tns:descType" />
+	<xs:element name="icon" type="tns:iconType" />
+	<xs:element name="view" type="tns:viewType" />
+	<xs:element name="group" type="tns:groupType" />
+	<xs:element name="feature" type="tns:featureType" />
+	<xs:element name="setting" type="tns:settingType" />
+	<xs:element name="data" type="tns:dataType" />
+	<xs:element name="rfs" type="tns:rfsType" />
+	<xs:element name="link" type="tns:linkType" />
+	<xs:element name="option" type="tns:optionType" />
+	<xs:element name="property" type="tns:propertyType" />
+	<xs:element name="localPath" type="tns:localTargetPathType"/>
+	<xs:element name="targetPath" type="tns:localTargetPathType"/>
+	<xs:complexType name="configurationType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:meta" />
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:view" />
+			<xs:element ref="tns:feature" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:data" />
+			<xs:element ref="tns:rfs" />
+			<xs:element	ref="tns:configuration" />
+			<xs:element ref="xi:include"/>
+		</xs:choice>
+		<xs:attribute name="version" type="xs:NMTOKEN" />
+		<xs:attribute name="name" type="xs:string" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="metaType">
+		<xs:all>
+			<xs:element name="id" type="tns:idType" minOccurs="0" />
+			<xs:element name="date" type="tns:dateType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="owner" type="tns:ownerType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="editor" type="tns:editorType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="product" type="tns:productType"
+				maxOccurs="1" minOccurs="0" />
+			<xs:element name="status" type="tns:statusType" maxOccurs="1"
+				minOccurs="0" />
+			<xs:element name="platform" type="tns:platformType"
+				maxOccurs="1" minOccurs="0" />
+			<xs:element name="version" minOccurs="0" type="tns:versionType" />
+			<xs:element name="release" minOccurs="0" type="tns:releaseType" />
+			<xs:element name="customer" minOccurs="0" type="tns:customerType" />
+			<xs:element name="origin" minOccurs="0" type="tns:customerType" />
+			<xs:element name="target" minOccurs="0" type="tns:customerType" />
+			<xs:element name="desc" minOccurs="0" type="tns:descType" />
+			<xs:element name="icon" minOccurs="0" type="tns:iconType" />
+			<xs:element ref="tns:link" maxOccurs="1" minOccurs="0"></xs:element>
+		</xs:all>
+	</xs:complexType>
+	<xs:complexType name="descType" mixed="true">
+		<xs:attribute ref="xlink:href" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="iconType">
+		<xs:attribute ref="xlink:href" use="optional" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="linkType">
+		<xs:attribute ref="xlink:href" use="optional" />
+		<xs:attribute ref="xlink:title" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="propertyType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:NMTOKEN" use="optional"></xs:attribute>
+		<xs:attribute name="value" type="xs:string"></xs:attribute>
+		<xs:attribute name="unit" type="xs:token"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="settingType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:option" />
+			<xs:element ref="tns:property" />
+			<xs:element ref="tns:setting" />
+			<xs:element ref="tns:localPath" />
+			<xs:element ref="tns:targetPath" />
+			<xs:element ref="xs:minInclusive"></xs:element>
+			<xs:element ref="xs:maxInclusive"></xs:element>
+			<xs:element ref="xs:minExclusive"></xs:element>
+			<xs:element ref="xs:maxExclusive"></xs:element>
+			<xs:element ref="xs:pattern"></xs:element>
+			<xs:element ref="xs:length"></xs:element>
+			<xs:element ref="xs:minLength"></xs:element>
+			<xs:element ref="xs:maxLength"></xs:element>
+			<xs:element ref="xs:totalDigits"></xs:element>
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="relevant" type="xs:token" default="true"></xs:attribute>
+		<xs:attribute name="constraint" type="xs:token" default="true">
+		</xs:attribute>
+		<xs:attribute name="readOnly" type="xs:NMTOKEN" default="true">
+		</xs:attribute>
+		<xs:attribute name="name" type="xs:string"></xs:attribute>
+		<xs:attribute name="type" type="tns:typeType" use="optional"></xs:attribute>
+		<xs:attribute name="ref" type="xs:string" use="optional"></xs:attribute>
+		<!--
+			TODO inconsistent defaults: for generic settings this does not have a
+			sense
+		-->
+		<xs:attribute name="minOccurs" type="xs:nonNegativeInteger"
+			default="0"></xs:attribute>
+		<xs:attribute name="maxOccurs" type="xs:allNNI" default="unbounded"></xs:attribute>
+		<xs:attribute name="mapKey" type="xs:string"></xs:attribute>
+		<xs:attribute name="mapValue" type="xs:string"></xs:attribute>
+		<xs:attribute name="required" type="xs:boolean" default="false"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="featureType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:setting"></xs:element>
+		</xs:choice>
+		<xs:attribute name="name" type="xs:string" />
+		<xs:attribute name="relevant" type="xs:string"></xs:attribute>
+		<xs:attribute name="ref" type="xs:NMTOKEN" use="required" />
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:complexType name="optionType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:token" use="optional"></xs:attribute>
+		<xs:attribute name="value" type="xs:string" use="optional"></xs:attribute>
+		<xs:attribute name="relevant" type="xs:token" default="true"></xs:attribute>
+		<xs:attribute name="map" type="xs:string"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="groupType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:group" />
+			<xs:element ref="tns:setting" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:string" use="required"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="viewType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:meta" />
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+			<xs:element ref="tns:group"></xs:element>
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="name" type="xs:token" use="optional"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="localTargetPathType">
+		<xs:choice minOccurs="0" maxOccurs="unbounded">
+			<xs:element ref="tns:desc" />
+			<xs:element ref="tns:icon" />
+			<xs:element ref="tns:link" />
+		</xs:choice>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="constraint" type="xs:token"/>
+		<xs:attribute name="readOnly" type="xs:NMTOKEN"/>
+		<xs:attribute name="required" type="xs:NMTOKEN"/>
+		<xs:attribute name="map" type="xs:string"></xs:attribute>
+	</xs:complexType>
+	<xs:simpleType name="idType">
+		<xs:restriction base="xs:NMTOKEN"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="dateType">
+		<xs:restriction base="xs:date"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="ownerType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="editorType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="productType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="statusType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="platformType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="versionType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="releaseType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+	<xs:simpleType name="customerType">
+		<xs:restriction base="xs:string"></xs:restriction>
+	</xs:simpleType>
+<!-- <xs:attribute name="id" type="xs:NMTOKEN" />-->
+	<!--
+		<xs:attribute name="href" type="xs:anyURI" /> <xs:attribute
+		name="title" type="xs:string" />
+	-->
+	<xs:attributeGroup name="CommonAttrs">
+		<xs:attribute name="id" type="xs:ID"></xs:attribute>
+	</xs:attributeGroup>
+	<xs:complexType name="dataType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" minOccurs="0"
+				maxOccurs="unbounded"></xs:any>
+		</xs:sequence>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+		<xs:attribute name="extensionPolicy" type="xs:NMTOKEN"
+			default="replace">
+		</xs:attribute>
+		<xs:attribute name="template" type="xs:NMTOKEN" default="false"></xs:attribute>
+	</xs:complexType>
+	<xs:complexType name="rfsType">
+		<xs:sequence>
+			<xs:any namespace="##any" processContents="skip" minOccurs="0"
+				maxOccurs="unbounded"></xs:any>
+		</xs:sequence>
+		<xs:attributeGroup ref="tns:CommonAttrs"></xs:attributeGroup>
+	</xs:complexType>
+	<xs:simpleType name="typeType">
+		<xs:restriction base="xs:string">
+			<xs:enumeration id="int" value="int"></xs:enumeration>
+			<xs:enumeration value="boolean"></xs:enumeration>
+			<xs:enumeration value="real"></xs:enumeration>
+			<xs:enumeration value="string"></xs:enumeration>
+			<xs:enumeration value="file"></xs:enumeration>
+			<xs:enumeration value="folder"></xs:enumeration>
+			<xs:enumeration value="sequence"></xs:enumeration>
+			<xs:enumeration value="selection"></xs:enumeration>
+			<xs:enumeration value="multiSelection"></xs:enumeration>
+			<xs:enumeration value="date"></xs:enumeration>
+			<xs:enumeration value="time"></xs:enumeration>
+			<xs:enumeration value="dateTime"></xs:enumeration>
+			<xs:enumeration value="duration"></xs:enumeration>
+		</xs:restriction>
+	</xs:simpleType>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/contentml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/content/1" 
+	xmlns:content="http://www.s60.com/xml/content/1" 
+	elementFormDefault="qualified">
+	
+	<xs:complexType name="tagType">
+		<xs:attribute name="name" type="xs:string"/>
+		<xs:attribute name="value" type="xs:string"/>
+	</xs:complexType>
+	
+	<xs:complexType name="includeType">
+		<xs:attribute name="files" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="pattern" type="xs:string"/>
+	</xs:complexType>
+
+	
+	<xs:complexType name="outputType">
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="flatten" type="xs:string"/>
+	</xs:complexType>
+	
+	<xs:complexType name="excludeType">
+		<xs:attribute name="files" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="pattern" type="xs:string"/>
+	</xs:complexType>
+
+	
+		
+	<xs:complexType name="inputType">
+		<xs:sequence>
+			<xs:element name="include" type="content:includeType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:element name="exclude" type="content:excludeType"
+				minOccurs="0" maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attribute name="file" type="xs:string"></xs:attribute>
+	</xs:complexType>
+
+
+	<xs:complexType name="contentRootType">
+        <xs:sequence>
+			<xs:element name="desc" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="tag" type="content:tagType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="output" type="content:outputType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="input" type="content:inputType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+	
+	<xs:element name="content" type="content:contentRootType"/>
+		
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/contentml2.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/content/2" 
+	xmlns:content2="http://www.s60.com/xml/content/2" 
+	elementFormDefault="qualified">
+
+	
+	<xs:complexType name="tagType">
+		<xs:attribute name="name" type="xs:string"/>
+		<xs:attribute name="value" type="xs:string"/>
+	</xs:complexType>
+	
+	<xs:complexType name="includeType">
+		<xs:attribute name="files" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="pattern" type="xs:string"/>
+	</xs:complexType>
+
+	<xs:complexType name="excludeType">
+		<xs:attribute name="files" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="pattern" type="xs:string"/>
+	</xs:complexType>
+	
+		
+	<xs:complexType name="inputType">
+		<xs:sequence>
+			<xs:element name="include" type="content2:includeType"
+				minOccurs="0" maxOccurs="unbounded" />
+			<xs:element name="exclude" type="content2:excludeType"
+				minOccurs="0" maxOccurs="unbounded" />
+		</xs:sequence>
+		<xs:attribute name="file" type="xs:string"></xs:attribute>
+	</xs:complexType>
+
+
+	<xs:complexType name="outputType">
+        <xs:sequence>
+            <xs:element name="input" type="content2:inputType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+		<xs:attribute name="file" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="flatten" type="xs:string"/>
+	</xs:complexType>
+	
+	
+	<xs:complexType name="contentRootType">
+        <xs:sequence>
+			<xs:element name="tag" type="content2:tagType" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="output" type="content2:outputType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="desc" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+	
+	<xs:element name="content" type="content2:contentRootType"/>
+		
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/crml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.s60.com/xml/cenrep/1" xmlns:cenrep="http://www.s60.com/xml/cenrep/1">
+  <xs:element name="repository">
+    <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+        <xs:element minOccurs="0" maxOccurs="2" ref="cenrep:access" />
+      	<xs:element minOccurs="0" maxOccurs="1" ref="cenrep:desc" />
+      	<xs:element minOccurs="0" maxOccurs="unbounded" ref="cenrep:key" />
+      	<xs:element minOccurs="0" maxOccurs="unbounded" ref="cenrep:keyRange" />
+      </xs:choice>
+      <xs:attribute name="backup" type="xs:boolean"/>
+      <xs:attribute name="rfs" type="xs:boolean"/>
+      <xs:attribute name="initialialisationFileVersion" type="xs:integer"/>
+      <xs:attribute name="owner" type="xs:string"/>
+      <xs:attribute name="uidName" type="xs:string"/>
+      <xs:attribute name="uidValue" type="xs:string"/>
+      <xs:attribute name="version" type="xs:decimal" use="optional"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="desc" type="xs:string"/>
+  <xs:element name="key">
+    <xs:complexType>
+            <xs:choice minOccurs="0" maxOccurs="unbounded">
+            	<xs:element minOccurs="0" maxOccurs="2"
+            		ref="cenrep:access" />
+            	<xs:element minOccurs="0" maxOccurs="unbounded"
+            		ref="cenrep:value" />
+            	<xs:element minOccurs="0" maxOccurs="unbounded"
+            		ref="cenrep:bit" />
+            	<xs:element ref="cenrep:desc" minOccurs="0" maxOccurs="1"></xs:element>
+            </xs:choice>
+            
+      <xs:attribute name="backup" type="xs:boolean"/>
+      <xs:attribute name="int" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="readOnly" type="xs:boolean"/>
+      <xs:attribute name="ref" type="xs:string"/>
+      <xs:attribute name="type" type="cenrep:typeType"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="value">
+    <xs:complexType mixed="true">
+      <xs:attribute name="desc" />
+      <xs:attribute name="value" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="bit">
+    <xs:complexType>
+      <xs:simpleContent>
+        <xs:extension base="xs:integer">
+          <xs:attribute name="ref" type="xs:string"/>
+          <xs:attribute name="value" type="xs:boolean"/>
+        </xs:extension>
+      </xs:simpleContent>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="keyRange">
+    <xs:complexType>
+      <xs:sequence>
+      	<xs:element minOccurs="0" maxOccurs="unbounded"
+      		ref="cenrep:access" />
+      	<xs:element ref="cenrep:desc" minOccurs="0" maxOccurs="1"></xs:element>
+      </xs:sequence>
+      <xs:attribute name="backup" type="xs:boolean"/>
+      <xs:attribute name="countInt" type="xs:int"/>
+      <xs:attribute name="firstIndex" type="xs:int"/>
+      <xs:attribute name="firstInt" type="xs:string"/>
+      <xs:attribute name="indexBits" type="xs:string"/>
+      <xs:attribute name="int" type="xs:int"/>
+      <xs:attribute name="lastInt" type="xs:string"/>
+      <xs:attribute name="name" type="xs:string"/>
+      <xs:attribute name="ref" type="xs:string"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="access">
+    <xs:complexType>
+    	<xs:choice>
+    		<xs:element ref="cenrep:desc" minOccurs="0" maxOccurs="1"></xs:element>
+    	</xs:choice>
+    	<xs:attribute name="capabilities" type="xs:string" />
+    	<xs:attribute name="sid" type="xs:string" />
+    	<xs:attribute name="type" type="xs:NMTOKEN" />
+    </xs:complexType>
+  </xs:element>
+  <xs:simpleType name="typeType">
+		<xs:restriction base="xs:string">
+			<xs:enumeration id="int" value="int"></xs:enumeration>
+			<xs:enumeration value="binary"></xs:enumeration>
+			<xs:enumeration value="real"></xs:enumeration>
+			<xs:enumeration value="string"></xs:enumeration>
+			<xs:enumeration value="string8"></xs:enumeration>
+		</xs:restriction>
+	</xs:simpleType>
+
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/gcfml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://www.s60.com/xml/genconfml/1" xmlns:gcfml="http://www.s60.com/xml/genconfml/1" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+  <xs:import namespace="http://www.w3.org/1999/XSL/Transform"/>
+  <xs:element name="file">
+    <xs:complexType>
+    	<xs:choice minOccurs="0" maxOccurs="unbounded">
+        	<xs:element minOccurs="1" maxOccurs="unbounded" ref="gcfml:setting" />
+        	<xs:any namespace="http://www.w3.org/1999/XSL/Transform" processContents="skip"/>
+      	</xs:choice>
+      	<xs:attribute name="target" type="xs:string" use="optional"/>
+      	<xs:attribute name="name" type="xs:string" use="required"/>
+    </xs:complexType>
+  </xs:element>
+  <xs:element name="setting">
+    <xs:complexType>
+      <xs:attribute name="ref" type="xs:string" use="required"/>
+    </xs:complexType>
+  </xs:element>
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/hcrml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
+    targetNamespace="http://www.symbianfoundation.org/xml/hcrml/1"
+    xmlns:hcr="http://www.symbianfoundation.org/xml/hcrml/1"
+    elementFormDefault="qualified">
+ 
+    <xs:simpleType name="uidType">
+        <xs:union>
+            <xs:simpleType>
+                <xs:restriction base="xs:nonNegativeInteger"/>
+            </xs:simpleType>
+            <xs:simpleType>
+                <xs:restriction base="xs:string">
+                    <xs:pattern value="0x[0-9a-fA-F]{1,8}"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:union>
+    </xs:simpleType>
+    
+    <xs:simpleType name="flagValueType">
+        <xs:restriction base="xs:string">
+            <xs:pattern value="[0-1]{1}"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="settingTypeType">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="int32"/>
+            <xs:enumeration value="int16"/>
+            <xs:enumeration value="int8"/>
+            <xs:enumeration value="bool"/>
+            <xs:enumeration value="uint32"/>
+            <xs:enumeration value="uint16"/>
+            <xs:enumeration value="uint8"/>
+            <xs:enumeration value="linaddr"/>
+            <xs:enumeration value="bindata"/>
+            <xs:enumeration value="text8"/>
+            <xs:enumeration value="arrayint32"/>
+            <xs:enumeration value="arrayuint32"/>
+            <xs:enumeration value="int64"/>
+            <xs:enumeration value="uint64"/>
+        </xs:restriction>
+    </xs:simpleType>
+    
+    <xs:simpleType name="outputTypeType">
+        <xs:restriction base="xs:string">
+            <xs:enumeration value="hcr"/>
+            <xs:enumeration value="header"/>
+        </xs:restriction>
+    </xs:simpleType>
+ 
+    <xs:complexType name="settingFlagsType">
+        <xs:attribute name="Uninitialised"  type="hcr:flagValueType"/>
+        <xs:attribute name="Modifiable"     type="hcr:flagValueType"/>
+        <xs:attribute name="Persistent"     type="hcr:flagValueType"/>
+    </xs:complexType>
+ 
+    <xs:complexType name="settingType">
+        <xs:sequence>
+            <xs:element name="flags" type="hcr:settingFlagsType" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+        <xs:attribute name="ref"        type="xs:string"            use="required"/>
+        <xs:attribute name="name"       type="xs:string"            use="required"/>
+        <xs:attribute name="type"       type="hcr:settingTypeType"  use="required"/>
+        <xs:attribute name="id"         type="hcr:uidType"          use="required"/>
+        <xs:attribute name="comment"    type="xs:string"/>
+    </xs:complexType>
+    
+    <xs:complexType name="categoryType">
+        <xs:sequence>
+            <xs:element name="setting" type="hcr:settingType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="name"   type="xs:string"    use="required"/>
+        <xs:attribute name="uid"    type="hcr:uidType"  use="required"/>
+    </xs:complexType>
+    
+    <xs:complexType name="includetype">
+        <xs:attribute name="ref" type="xs:string" use="required"/>
+    </xs:complexType>
+    
+    <xs:complexType name="outputType">
+        <xs:choice>
+            <xs:element name="category" type="hcr:categoryType" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="include" type="hcr:includetype" minOccurs="1" maxOccurs="unbounded"/>
+        </xs:choice>
+        <xs:attribute name="file" type="xs:string" use="required"/>
+        <xs:attribute name="type" type="hcr:outputTypeType" use="required"/>
+        <xs:attribute name="version" type="xs:nonNegativeInteger"/>
+        <xs:attribute name="readOnly" type="hcr:flagValueType"/>
+    </xs:complexType>
+    
+    <xs:complexType name="hcrRootType">
+        <xs:choice>
+            <xs:element name="output" type="hcr:outputType" minOccurs="1" maxOccurs="1"/>
+            <xs:element name="category" type="hcr:categoryType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:choice>
+    </xs:complexType>
+    
+    <xs:element name="hcr" type="hcr:hcrRootType"/>
+
+</xs:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/ibyml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/iby/1" 
+	xmlns:iby="http://www.s60.com/xml/iby/1" 
+	elementFormDefault="qualified">
+	
+    <xs:complexType name="entryType">
+		<xs:attribute name="value"        type="xs:string"            use="required"/>
+    </xs:complexType>
+	
+	
+    <xs:complexType name="ibyfileRootType">
+        <xs:sequence>
+            <xs:element name="entry" type="iby:entryType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="name"       type="xs:string"/>
+		<xs:attribute name="rom_image"       type="xs:string"/>
+    </xs:complexType>
+		
+    <xs:element name="ibyfile" type="iby:ibyfileRootType"/>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/imageml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,48 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/imageml/1" 
+	xmlns:image="http://www.s60.com/xml/imageml/1" 
+	elementFormDefault="qualified">
+
+	
+    <xs:complexType name="includeType">
+        <xs:attribute name="pattern"        type="xs:string"            use="required"/>
+    </xs:complexType>
+
+	 <xs:complexType name="excludeType">
+        <xs:attribute name="pattern"        type="xs:string"            use="required"/>
+    </xs:complexType>
+	
+    <xs:complexType name="inputType">
+        <xs:sequence>
+            <xs:element name="include" type="image:includeType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="exclude" type="image:excludeType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+
+		<xs:attribute name="dir"        type="xs:string"            use="required"/>
+        <xs:attribute name="depth"       type="xs:string"/>
+    </xs:complexType>
+	
+	
+	
+    <xs:complexType name="outputType">
+        <xs:sequence>
+            <xs:element name="input" type="image:inputType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+        <xs:attribute name="file"        type="xs:string"            use="required"/>
+        <xs:attribute name="tool"       type="xs:string"/>
+		<xs:attribute name="tooldir"       type="xs:string"/>
+		<xs:attribute name="compress"       type="xs:string"/>
+		<xs:attribute name="palette"       type="xs:string"/>
+    </xs:complexType>
+
+		
+    <xs:complexType name="imagemlRootType">
+        <xs:sequence>
+            <xs:element name="output" type="image:outputType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+    
+    <xs:element name="imageml" type="image:imagemlRootType"/>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/projectml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,60 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/convertprojectml/1" 
+	xmlns:project="http://www.s60.com/xml/convertprojectml/1" 
+	elementFormDefault="qualified">
+	
+    <xs:complexType name="targetProjectType">
+		<xs:attribute name="path"        type="xs:string"/>
+		<xs:attribute name="name"        type="xs:string"/>
+    </xs:complexType>
+
+	
+		
+    <xs:complexType name="filterType">
+		<xs:attribute name="action"        type="xs:string"/>
+		<xs:attribute name="data"        type="xs:string"/>
+    </xs:complexType>
+	
+    <xs:complexType name="folderType">
+        <xs:sequence>
+            <xs:element name="filter" type="project:filterType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+		<xs:attribute name="path"        type="xs:string"/>
+    </xs:complexType>
+
+    <xs:complexType name="ruleType">
+		<xs:attribute name="type"        type="xs:string"/>
+		<xs:attribute name="data"        type="xs:string"/>
+    </xs:complexType>
+
+	
+    <xs:complexType name="fileType">
+        <xs:sequence>
+            <xs:element name="filter" type="project:filterType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+		<xs:attribute name="type"        type="xs:string"/>
+		<xs:attribute name="path"        type="xs:string"/>
+		<xs:attribute name="name"        type="xs:string"/>
+    </xs:complexType>
+		
+    <xs:complexType name="layerType">
+        <xs:sequence>
+			<xs:element name="rule" type="project:ruleType" minOccurs="0" maxOccurs="unbounded"/>
+            <xs:element name="folder" type="project:folderType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="file" type="project:fileType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+		<xs:attribute name="path"        type="xs:string"/>
+    </xs:complexType>
+	
+	
+    <xs:complexType name="convertprojectmlRootType">
+        <xs:sequence>
+            <xs:element name="targetProject" type="project:targetProjectType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="layer" type="project:layerType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+		
+    <xs:element name="convertprojectml" type="project:convertprojectmlRootType"/>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/ruleml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/ruleml/1" 
+	xmlns:rule="http://www.s60.com/xml/ruleml/1" 
+	elementFormDefault="qualified">
+
+    <xs:complexType name="ruleType"/>
+	
+    <xs:complexType name="rulemlRootType">
+        <xs:sequence>
+            <xs:element name="rule" type="rule:ruleType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/ruleml2.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.s60.com/xml/ruleml/2" xmlns:xs="http://www.s60.com/xml/ruleml/2" elementFormDefault="qualified">
+	<xs:element name="ruleml">
+		<xs:attribute name="xmlns" type="xs:string"/>
+		<xs:element name="rule">
+    </xs:element>
+    </xs:element>
+    <xs:element name="eval_globals">
+        <xs:attribute name="xmlns" type="xs:string"/>
+        <xs:attribute name="file" type="xs:string"/>
+    </xs:element>
+</schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/templateml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema"
+	xmlns:xi="http://www.w3.org/2001/XInclude"
+	xmlns:templ="http://www.s60.com/xml/templateml/1"
+	targetNamespace="http://www.s60.com/xml/templateml/1"
+	elementFormDefault="qualified">
+
+	 <xs:import namespace="http://www.w3.org/2001/XInclude" schemaLocation="http://www.w3.org/2001/XInclude.xsd"/> 
+
+			
+	<xs:complexType name="templateType" mixed="true">
+		<xs:sequence>
+			<xs:element ref="xi:include" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>	
+	</xs:complexType>
+
+		
+	<xs:complexType name="outputType">
+		<xs:sequence>
+			<xs:element name="template" type="templ:templateType" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="file" type="xs:string"/>
+		<xs:attribute name="dir" type="xs:string"/>
+		<xs:attribute name="encoding" type="xs:string"/>
+        <xs:attribute name="bom" type="xs:string" optional="true"/>
+	</xs:complexType>
+	
+	<xs:complexType name="filterType" mixed="true">
+		<xs:sequence>
+			<xs:element ref="xi:include" minOccurs="0" maxOccurs="unbounded"/>
+		</xs:sequence>
+		<xs:attribute name="name" type="xs:string"/>
+	</xs:complexType>
+	
+	<xs:complexType name="templatemlRootType">
+        <xs:sequence>
+			<xs:element name="desc" type="xs:string" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="output" type="templ:outputType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="filter" type="templ:filterType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+	
+	<xs:element name="templateml" type="templ:templatemlRootType"/>
+		
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/thememl.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<xs:schema 
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" 
+	targetNamespace="http://www.s60.com/xml/thememl/1" 
+	xmlns:theme="http://www.s60.com/xml/thememl/1" 
+	elementFormDefault="qualified">
+
+	<xs:complexType name="carbideuiPathType"/>
+
+	<xs:complexType name="themeDirType"/>
+
+	<xs:complexType name="refSettingType"/>
+
+	<xs:complexType name="platformUIDType"/>
+	
+    <xs:complexType name="activeThemeType">
+        <xs:sequence>
+            <xs:element name="refSetting" type="theme:refSettingType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="platformUID" type="theme:platformUIDType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>  
+        <xs:attribute name="uid"        type="xs:string"            use="required"/>
+    </xs:complexType>
+
+	<xs:complexType name="thememlRootType">
+        <xs:sequence>
+            <xs:element name="activeTheme" type="theme:activeThemeType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="carbideuiPath" type="theme:carbideuiPathType" minOccurs="0" maxOccurs="unbounded"/>
+			<xs:element name="themeDir" type="theme:themeDirType" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+    </xs:complexType>
+
+	<xs:element name="thememl" type="theme:thememlRootType"/>
+
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/xlink.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- $Date: 2008/08/14 07:59:30 $ -->
+	<!--
+		Copyright (c) 2002 World Wide Web Consortium, (Massachusetts Institute
+		of Technology, Institut National de Recherche en Informatique et en
+		Automatique, Keio University). All Rights Reserved. This document is
+		distributed under the W3C's Software Intellectual Property License.
+		This document is distributed in the hope that it will be useful, but
+		WITHOUT ANY WARRANTY; without even the implied warranty of
+		MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See W3C License
+		http://www.w3.org/Consortium/Legal/ for more details.
+	-->
+<xs:schema targetNamespace="http://www.w3.org/1999/xlink"
+	xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
+	attributeFormDefault="unqualified" version="$Date: 2008/08/14 07:59:30 $">
+	<xs:annotation>
+		<xs:documentation source="http://www.w3.org/TR/2000/REC-xlink-20010627"
+			xml:lang="en"> Note this schema is NOT a normative schema - - It contains
+			attribute types derived from all the attribute definitions found in
+			the XLink Recommendation available at
+			http://www.w3.org/TR/2001/REC-xlink-20010627 Section 4.1
+			(http://www.w3.org/TR/2001/REC-xlink-20010627/#N1238) provides a
+			summary of the element types on which the global attributes are
+			allowed, with an indication of whether a value is required or
+			optional. </xs:documentation>
+	</xs:annotation>
+	<xs:attribute name="type">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2000/REC-xlink-20010627/#link-types"
+				xml:lang="en"> The XLink Element Type Attribute. Note: xml:lang is not
+				required if the value of the type attribute is "title", but provides
+				much of the motivation for title elements in addition to attributes.
+				A W3C XML Schema definition of the xml:lang attribute can be found
+				at: http://www.w3.org/2001/xml.xsd </xs:documentation>
+		</xs:annotation>
+		<xs:simpleType>
+			<xs:restriction base="xs:string">
+				<xs:enumeration value="simple" />
+				<xs:enumeration value="extended" />
+				<xs:enumeration value="locator" />
+				<xs:enumeration value="arc" />
+				<xs:enumeration value="resource" />
+				<xs:enumeration value="title" />
+				<xs:enumeration value="none" />
+			</xs:restriction>
+		</xs:simpleType>
+	</xs:attribute>
+	<xs:attribute name="href" type="xs:anyURI">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2000/REC-xlink-20010627/#link-locators"
+				xml:lang="en"> The Locator Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="arcrole" type="xs:anyURI">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#link-semantics"
+				xml:lang="en"> The Arcrole Semantic Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="role" type="xs:anyURI">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#link-semantics"
+				xml:lang="en"> The Role Semantic Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="title" type="xs:string">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#link-semantics"
+				xml:lang="en"> The Title Semantic Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="show">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#show-att"
+				xml:lang="en"> The Show Behavior Attribute. </xs:documentation>
+		</xs:annotation>
+		<xs:simpleType>
+			<xs:restriction base="xs:string">
+				<xs:enumeration value="new" />
+				<xs:enumeration value="replace" />
+				<xs:enumeration value="embed" />
+				<xs:enumeration value="other" />
+				<xs:enumeration value="none" />
+			</xs:restriction>
+		</xs:simpleType>
+	</xs:attribute>
+	<xs:attribute name="actuate">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#actuate-att"
+				xml:lang="en"> The Actuate Behavior Attribute. </xs:documentation>
+		</xs:annotation>
+		<xs:simpleType>
+			<xs:restriction base="xs:string">
+				<xs:enumeration value="onLoad" />
+				<xs:enumeration value="onRequest" />
+				<xs:enumeration value="other" />
+				<xs:enumeration value="none" />
+			</xs:restriction>
+		</xs:simpleType>
+	</xs:attribute>
+	<xs:attribute name="label" type="xs:NCName">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#traversal-atts"
+				xml:lang="en"> The Label Traversal Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="from" type="xs:NCName">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#traversal-atts"
+				xml:lang="en"> The From Traversal Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+	<xs:attribute name="to" type="xs:NCName">
+		<xs:annotation>
+			<xs:documentation
+				source="http://www.w3.org/TR/2001/REC-xlink-20010627/#traversal-atts"
+				xml:lang="en"> The To Traversal Attribute. </xs:documentation>
+		</xs:annotation>
+	</xs:attribute>
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/doc/xsd/xml.xsd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,145 @@
+<?xml version="1.0"?>
+<xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace" xmlns:xs="http://www.w3.org/2001/XMLSchema" xml:lang="en">
+
+ <xs:annotation>
+  <xs:documentation>
+   See http://www.w3.org/XML/1998/namespace.html and
+   http://www.w3.org/TR/REC-xml for information about this namespace.
+
+    This schema document describes the XML namespace, in a form
+    suitable for import by other schema documents.  
+
+    Note that local names in this namespace are intended to be defined
+    only by the World Wide Web Consortium or its subgroups.  The
+    following names are currently defined in this namespace and should
+    not be used with conflicting semantics by any Working Group,
+    specification, or document instance:
+
+    base (as an attribute name): denotes an attribute whose value
+         provides a URI to be used as the base for interpreting any
+         relative URIs in the scope of the element on which it
+         appears; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML Base specification.
+
+    id   (as an attribute name): denotes an attribute whose value
+         should be interpreted as if declared to be of type ID.
+         This name is reserved by virtue of its definition in the
+         xml:id specification.
+
+    lang (as an attribute name): denotes an attribute whose value
+         is a language code for the natural language of the content of
+         any element; its value is inherited.  This name is reserved
+         by virtue of its definition in the XML specification.
+  
+    space (as an attribute name): denotes an attribute whose
+         value is a keyword indicating what whitespace processing
+         discipline is intended for the content of the element; its
+         value is inherited.  This name is reserved by virtue of its
+         definition in the XML specification.
+
+    Father (in any context at all): denotes Jon Bosak, the chair of 
+         the original XML Working Group.  This name is reserved by 
+         the following decision of the W3C XML Plenary and 
+         XML Coordination groups:
+
+             In appreciation for his vision, leadership and dedication
+             the W3C XML Plenary on this 10th day of February, 2000
+             reserves for Jon Bosak in perpetuity the XML name
+             xml:Father
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>This schema defines attributes and an attribute group
+        suitable for use by
+        schemas wishing to allow xml:base, xml:lang, xml:space or xml:id
+        attributes on elements they define.
+
+        To enable this, such a schema must import this schema
+        for the XML namespace, e.g. as follows:
+        &lt;schema . . .&gt;
+         . . .
+         &lt;import namespace="http://www.w3.org/XML/1998/namespace"
+                    schemaLocation="http://www.w3.org/2001/xml.xsd"/&gt;
+
+        Subsequently, qualified reference to any of the attributes
+        or the group defined below will have the desired effect, e.g.
+
+        &lt;type . . .&gt;
+         . . .
+         &lt;attributeGroup ref="xml:specialAttrs"/&gt;
+ 
+         will define a type which will schema-validate an instance
+         element with any of those attributes</xs:documentation>
+ </xs:annotation>
+
+ <xs:annotation>
+  <xs:documentation>In keeping with the XML Schema WG's standard versioning
+   policy, this schema document will persist at
+   http://www.w3.org/2007/08/xml.xsd.
+   At the date of issue it can also be found at
+   http://www.w3.org/2001/xml.xsd.
+   The schema document at that URI may however change in the future,
+   in order to remain compatible with the latest version of XML Schema
+   itself, or with the XML namespace itself.  In other words, if the XML
+   Schema or XML namespaces change, the version of this document at
+   http://www.w3.org/2001/xml.xsd will change
+   accordingly; the version at
+   http://www.w3.org/2007/08/xml.xsd will not change.
+  </xs:documentation>
+ </xs:annotation>
+
+ <xs:attribute name="lang">
+  <xs:annotation>
+   <xs:documentation>Attempting to install the relevant ISO 2- and 3-letter
+         codes as the enumerated possible values is probably never
+         going to be a realistic possibility.  See
+         RFC 3066 at http://www.ietf.org/rfc/rfc3066.txt and the IANA registry
+         at http://www.iana.org/assignments/lang-tag-apps.htm for
+         further information.
+
+         The union allows for the 'un-declaration' of xml:lang with
+         the empty string.</xs:documentation>
+  </xs:annotation>
+  <xs:simpleType>
+   <xs:union memberTypes="xs:language">
+    <xs:simpleType>    
+     <xs:restriction base="xs:string">
+      <xs:enumeration value=""/>
+     </xs:restriction>
+    </xs:simpleType>
+   </xs:union>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="space">
+  <xs:simpleType>
+   <xs:restriction base="xs:NCName">
+    <xs:enumeration value="default"/>
+    <xs:enumeration value="preserve"/>
+   </xs:restriction>
+  </xs:simpleType>
+ </xs:attribute>
+
+ <xs:attribute name="base" type="xs:anyURI">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xmlbase/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+ 
+ <xs:attribute name="id" type="xs:ID">
+  <xs:annotation>
+   <xs:documentation>See http://www.w3.org/TR/xml-id/ for
+                     information about this attribute.</xs:documentation>
+  </xs:annotation>
+ </xs:attribute>
+
+ <xs:attributeGroup name="specialAttrs">
+  <xs:attribute ref="xml:base"/>
+  <xs:attribute ref="xml:lang"/>
+  <xs:attribute ref="xml:space"/>
+  <xs:attribute ref="xml:id"/>
+ </xs:attributeGroup>
+
+</xs:schema>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/export_bat.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant export-bat -Dbuild.bat_export_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/generatedoc-build.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<!--****************************************************************************
+ * ConE document generation
+ * This ant build.xml will generate all ConE related documents
+ ****************************************************************************-->
+ 
+<project name="ConE generatedoc" default="doc-all">
+	<!-- import common properties for this plugin -->
+	<property file="common.properties"/>
+	<property file="install.properties"/>
+    
+	<target name="doc-all" depends="epydoc, sphinx"/>
+    
+	<target name="init-generatedoc">
+	  <mkdir dir="${document.output}"/>
+	  <mkdir dir="${document.output}/epydoc"/>
+	</target>
+      
+	<target name="epydoc" depends="init-generatedoc">
+		<exec executable="cmd">
+            <arg line='/c "epydoc source/cone -o ${document.output}/epydoc --exclude tests"'/>
+		</exec>
+	</target>
+
+	<target name="sphinx" depends="init-generatedoc">
+        <exec executable="cmd">
+            <arg line='/c "sphinx-build -b html ./doc ${document.output}"'/>
+		</exec>
+	</target>
+  	
+</project>
+     
+     
+     
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/install.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant install -Dbuild.cone_install_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/linux.properties	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+os.linux.userbin = /home/hudson/bin
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/pack.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant pack -Dbuild.cone_pack_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/pack_bat.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant pack-bat -Dbuild.bat_pack_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/pack_dualversion.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant pack-dualversion -Dbuild.cone_pack_path=%1 -Dbuild.dualversioninstall.path1=%2 -Dbuild.dualversioninstall.path2=%3 -Dbuild.plugin_package="%4"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/run_bat.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+call ant run-bat -Dbuild.base_path=%1 -Dbuild.plugin_package="%2"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,85 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+
+:: ============================================================================
+::  Name        : cone.cmd
+::  Part of     : ConE
+::  Description : ConE tool wrapper for Windows
+::  Version     : %version: 1 %
+::
+:: ============================================================================
+
+
+
+@echo off
+setlocal
+
+set CONE_CMDARG=%*
+set CONE_BASEDIR=%~dp0
+set PYTHONCASEOK=1
+
+@rem Check that Python is available
+call python -h >nul 2>&1
+if %errorlevel% neq 0 (
+echo Python is required to run ConE!
+exit /b 1
+)
+
+@REM Find out Python version
+set VERFILE=%TEMP%\cone_version_check.tmp
+python -c "import sys; print sys.version[:3]" > %VERFILE%
+set varNUM=0
+for /f "tokens=*" %%T in (%VERFILE%) do call :varSET %%T
+if exist %VERFILE% del %VERFILE% 
+
+
+@REM Set the used base directory based on the version
+if %VER1%==2.5 (
+set CONE_BASEDIR=%CONE_BASEDIR%cone\2.5\
+goto EndVersionCheck
+)
+if %VER1%==2.6 (
+set CONE_BASEDIR=%CONE_BASEDIR%cone\2.6\
+goto EndVersionCheck
+)
+echo You are using an unsupported Python version (%VER1%)
+echo ConE requires Python 2.5 or 2.6
+exit /b 1
+)
+:EndVersionCheck
+
+@rem Check that this ConE installation supports the Python version
+if not exist "%CONE_BASEDIR%" (
+echo Python version %VER1% is not supported by this ConE installation
+exit /b 1
+)
+
+
+@rem Set environment variables and run cone_tool.py
+set CONE_LIBDIR=%CONE_BASEDIR%\lib
+set CONE_SCRIPTDIR=%CONE_BASEDIR%\scripts
+set PATH=%CONE_SCRIPTDIR%;%PATH%
+set PYTHONPATH=%CONE_LIBDIR%;%PYTHONPATH%
+call python "%CONE_SCRIPTDIR%\cone_tool.py" %CONE_CMDARG%
+exit /b %ERRORLEVEL%
+
+endlocal
+
+:VarSET
+set /a varNUM=%varNUM%+1
+set VER%varNUM%=%1
+
+:: END OF cone.cmd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone.prj	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,44 @@
+[Project ID]
+Signature=UE Proj: v.1
+[Project Information]
+Create Tagfile=0
+Filter=
+Include Sub Directories=1
+Project Start=D8070B0001000A000C001B00320000004E
+Project Tagfile=
+Project Wordfile=
+Relative to Project File=1
+Use Relative Directory=1
+Working Time=427910
+[Files]
+0=C:\Users\svn\isource\cone\trunk\source\
+[Group Filter]
+.\abstract\=*.py
+.\cone\=*.py
+.\storage\=*.py
+C:\Users\svn\isource\cone\trunk\source\=*.py
+C:\Users\svn\isource\newcone\source\=*.py
+[Folders]
+.\cone\ - tests=1
+C:\Users\svn\isource\cone\trunk\source\=1
+C:\Users\svn\isource\cone\trunk\source\ - cone=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - core=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - storage=1
+C:\Users\svn\isource\cone\trunk\source\ - storage=1
+C:\Users\svn\isource\cone\trunk\source\ - storage - tests=1
+C:\Users\svn\isource\newcone\source\=1
+C:\Users\svn\isource\newcone\source\ - cone=1
+C:\Users\svn\isource\newcone\source\ - cone - storage - tests=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - confml=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - storage - tests=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - confml - tests=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - core - tests=1
+C:\Users\svn\isource\cone\trunk\source\ - cone - tests=1
+[Open Files]
+Active File Display Mode=3
+Active File Index=0
+Open File Line0=0
+Open File Pos0=0
+Open File Window Pos0=2,3,-1,-1,-4,-23,22,22,948,436
+Open File0=C:\USERS\svn\isource\cone\trunk\source\set_env_to_test.cmd
+Open File1=
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone.sh	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,83 @@
+#!/bin/bash
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#  ConE tool wrapper for Unix
+
+# Check that Python is available
+# ------------------------------
+python --version &> /dev/null
+if [ $? -ne 0 ]
+then
+    echo "Python is required to run ConE!"
+    exit 1
+fi
+
+
+# Determine the path where ConE is installed
+# ------------------------------------------
+
+# Try to derefence a symlink
+SCRIPT_FILE=`readlink $0`
+if [ "$SCRIPT_FILE" = "" ]
+then
+    # Not a symlink, the first command line parameter can be used
+    SCRIPT_FILE=$0
+fi
+CONE_BASEDIR=`dirname "$SCRIPT_FILE"`/cone
+
+
+# Find out the Python version
+# ---------------------------
+PYTHON_VERSION=`python -c "import sys; print sys.version[:3]"`
+#echo "Python version: $PYTHON_VERSION"
+
+
+# Set the correct lib and scripts directories
+# to use based on the Python version
+# -------------------------------------------
+case $PYTHON_VERSION in
+"2.5")
+    CONE_BASEDIR="$CONE_BASEDIR/2.5"
+    ;;
+"2.6")
+    CONE_BASEDIR="$CONE_BASEDIR/2.6"
+    ;;
+*)
+    echo "You are using an unsupported Python version ($PYTHON_VERSION)"
+    echo "ConE requires Python 2.5 or 2.6"
+    exit 1
+    ;;
+esac
+
+#echo "CONE_BASEDIR: $CONE_BASEDIR"
+
+
+# Check that this ConE installation supports the Python version
+# -------------------------------------------------------------
+if [ ! -e "$CONE_BASEDIR" ]
+then
+    echo "Python version $PYTHON_VERSION is not supported by this ConE installation"
+    exit 1
+fi
+
+
+# Override PYTHONPATH so that the libraries in
+# the standalone installation are used
+# --------------------------------------------
+export PYTHONPATH="$CONE_BASEDIR/lib:$PYTHONPATH"
+
+# Run cone_tool.py
+# ----------------
+python $CONE_BASEDIR/scripts/cone_tool.py $@
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = "1.1.5"
+_svnrevision = ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/all.doxygen	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1294 @@
+# Doxyfile 1.5.3
+
+# This file describes the settings to be used by the documentation system
+# doxygen (www.doxygen.org) for a project
+#
+# All text after a hash (#) is considered a comment and will be ignored
+# The format is:
+#       TAG = value [value, ...]
+# For lists items can also be appended using:
+#       TAG += value [value, ...]
+# Values that contain spaces should be placed between quotes (" ")
+
+#---------------------------------------------------------------------------
+# Project related configuration options
+#---------------------------------------------------------------------------
+
+# This tag specifies the encoding used for all characters in the config file that 
+# follow. The default is UTF-8 which is also the encoding used for all text before 
+# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into 
+# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of 
+# possible encodings.
+
+DOXYFILE_ENCODING      = UTF-8
+
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded 
+# by quotes) that should identify the project.
+
+PROJECT_NAME           = cone
+
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. 
+# This could be handy for archiving the generated documentation or 
+# if some version control system is used.
+
+PROJECT_NUMBER         = 
+
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) 
+# base path where the generated documentation will be put. 
+# If a relative path is entered, it will be relative to the location 
+# where doxygen was started. If left blank the current directory will be used.
+
+OUTPUT_DIRECTORY       = doxygen_output
+
+# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create 
+# 4096 sub-directories (in 2 levels) under the output directory of each output 
+# format and will distribute the generated files over these directories. 
+# Enabling this option can be useful when feeding doxygen a huge amount of 
+# source files, where putting all generated files in the same directory would 
+# otherwise cause performance problems for the file system.
+
+CREATE_SUBDIRS         = YES
+
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all 
+# documentation generated by doxygen is written. Doxygen will use this 
+# information to generate all constant output in the proper language. 
+# The default language is English, other supported languages are: 
+# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, 
+# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, 
+# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, 
+# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, 
+# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
+
+OUTPUT_LANGUAGE        = English
+
+# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will 
+# include brief member descriptions after the members that are listed in 
+# the file and class documentation (similar to JavaDoc). 
+# Set to NO to disable this.
+
+BRIEF_MEMBER_DESC      = YES
+
+# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend 
+# the brief description of a member or function before the detailed description. 
+# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the 
+# brief descriptions will be completely suppressed.
+
+REPEAT_BRIEF           = YES
+
+# This tag implements a quasi-intelligent brief description abbreviator 
+# that is used to form the text in various listings. Each string 
+# in this list, if found as the leading text of the brief description, will be 
+# stripped from the text and the result after processing the whole list, is 
+# used as the annotated text. Otherwise, the brief description is used as-is. 
+# If left blank, the following values are used ("$name" is automatically 
+# replaced with the name of the entity): "The $name class" "The $name widget" 
+# "The $name file" "is" "provides" "specifies" "contains" 
+# "represents" "a" "an" "the"
+
+ABBREVIATE_BRIEF       = 
+
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then 
+# Doxygen will generate a detailed section even if there is only a brief 
+# description.
+
+ALWAYS_DETAILED_SEC    = NO
+
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all 
+# inherited members of a class in the documentation of that class as if those 
+# members were ordinary class members. Constructors, destructors and assignment 
+# operators of the base classes will not be shown.
+
+INLINE_INHERITED_MEMB  = NO
+
+# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full 
+# path before files name in the file list and in the header files. If set 
+# to NO the shortest path that makes the file name unique will be used.
+
+FULL_PATH_NAMES        = YES
+
+# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag 
+# can be used to strip a user-defined part of the path. Stripping is 
+# only done if one of the specified strings matches the left-hand part of 
+# the path. The tag can be used to show relative paths in the file list. 
+# If left blank the directory from which doxygen is run is used as the 
+# path to strip.
+
+STRIP_FROM_PATH        = 
+
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of 
+# the path mentioned in the documentation of a class, which tells 
+# the reader which header file to include in order to use a class. 
+# If left blank only the name of the header file containing the class 
+# definition is used. Otherwise one should specify the include paths that 
+# are normally passed to the compiler using the -I flag.
+
+STRIP_FROM_INC_PATH    = 
+
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter 
+# (but less readable) file names. This can be useful is your file systems 
+# doesn't support long names like on DOS, Mac, or CD-ROM.
+
+SHORT_NAMES            = NO
+
+# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen 
+# will interpret the first line (until the first dot) of a JavaDoc-style 
+# comment as the brief description. If set to NO, the JavaDoc 
+# comments will behave just like regular Qt-style comments 
+# (thus requiring an explicit @brief command for a brief description.)
+
+JAVADOC_AUTOBRIEF      = NO
+
+# If the QT_AUTOBRIEF tag is set to YES then Doxygen will 
+# interpret the first line (until the first dot) of a Qt-style 
+# comment as the brief description. If set to NO, the comments 
+# will behave just like regular Qt-style comments (thus requiring 
+# an explicit \brief command for a brief description.)
+
+QT_AUTOBRIEF           = NO
+
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen 
+# treat a multi-line C++ special comment block (i.e. a block of //! or /// 
+# comments) as a brief description. This used to be the default behaviour. 
+# The new default is to treat a multi-line C++ comment block as a detailed 
+# description. Set this tag to YES if you prefer the old behaviour instead.
+
+MULTILINE_CPP_IS_BRIEF = NO
+
+# If the DETAILS_AT_TOP tag is set to YES then Doxygen 
+# will output the detailed description near the top, like JavaDoc.
+# If set to NO, the detailed description appears after the member 
+# documentation.
+
+DETAILS_AT_TOP         = NO
+
+# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented 
+# member inherits the documentation from any documented member that it 
+# re-implements.
+
+INHERIT_DOCS           = YES
+
+# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce 
+# a new page for each member. If set to NO, the documentation of a member will 
+# be part of the file/class/namespace that contains it.
+
+SEPARATE_MEMBER_PAGES  = NO
+
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. 
+# Doxygen uses this value to replace tabs by spaces in code fragments.
+
+TAB_SIZE               = 8
+
+# This tag can be used to specify a number of aliases that acts 
+# as commands in the documentation. An alias has the form "name=value". 
+# For example adding "sideeffect=\par Side Effects:\n" will allow you to 
+# put the command \sideeffect (or @sideeffect) in the documentation, which 
+# will result in a user-defined paragraph with heading "Side Effects:". 
+# You can put \n's in the value part of an alias to insert newlines.
+
+ALIASES                = 
+
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C 
+# sources only. Doxygen will then generate output that is more tailored for C. 
+# For instance, some of the names that are used will be different. The list 
+# of all members will be omitted, etc.
+
+OPTIMIZE_OUTPUT_FOR_C  = NO
+
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java 
+# sources only. Doxygen will then generate output that is more tailored for Java. 
+# For instance, namespaces will be presented as packages, qualified scopes 
+# will look different, etc.
+
+OPTIMIZE_OUTPUT_JAVA   = NO
+
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to 
+# include (a tag file for) the STL sources as input, then you should 
+# set this tag to YES in order to let doxygen match functions declarations and 
+# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. 
+# func(std::string) {}). This also make the inheritance and collaboration 
+# diagrams that involve STL classes more complete and accurate.
+
+BUILTIN_STL_SUPPORT    = NO
+
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
+# enable parsing support.
+
+CPP_CLI_SUPPORT        = NO
+
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC 
+# tag is set to YES, then doxygen will reuse the documentation of the first 
+# member in the group (if any) for the other members of the group. By default 
+# all members of a group must be documented explicitly.
+
+DISTRIBUTE_GROUP_DOC   = NO
+
+# Set the SUBGROUPING tag to YES (the default) to allow class member groups of 
+# the same type (for instance a group of public functions) to be put as a 
+# subgroup of that type (e.g. under the Public Functions section). Set it to 
+# NO to prevent subgrouping. Alternatively, this can be done per class using 
+# the \nosubgrouping command.
+
+SUBGROUPING            = YES
+
+#---------------------------------------------------------------------------
+# Build related configuration options
+#---------------------------------------------------------------------------
+
+# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in 
+# documentation are documented, even if no documentation was available. 
+# Private class members and static file members will be hidden unless 
+# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
+
+EXTRACT_ALL            = NO
+
+# If the EXTRACT_PRIVATE tag is set to YES all private members of a class 
+# will be included in the documentation.
+
+EXTRACT_PRIVATE        = NO
+
+# If the EXTRACT_STATIC tag is set to YES all static members of a file 
+# will be included in the documentation.
+
+EXTRACT_STATIC         = NO
+
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) 
+# defined locally in source files will be included in the documentation. 
+# If set to NO only classes defined in header files are included.
+
+EXTRACT_LOCAL_CLASSES  = YES
+
+# This flag is only useful for Objective-C code. When set to YES local 
+# methods, which are defined in the implementation section but not in 
+# the interface are included in the documentation. 
+# If set to NO (the default) only methods in the interface are included.
+
+EXTRACT_LOCAL_METHODS  = NO
+
+# If this flag is set to YES, the members of anonymous namespaces will be extracted 
+# and appear in the documentation as a namespace called 'anonymous_namespace{file}', 
+# where file will be replaced with the base name of the file that contains the anonymous 
+# namespace. By default anonymous namespace are hidden.
+
+EXTRACT_ANON_NSPACES   = NO
+
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all 
+# undocumented members of documented classes, files or namespaces. 
+# If set to NO (the default) these members will be included in the 
+# various overviews, but no documentation section is generated. 
+# This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_MEMBERS     = NO
+
+# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all 
+# undocumented classes that are normally visible in the class hierarchy. 
+# If set to NO (the default) these classes will be included in the various 
+# overviews. This option has no effect if EXTRACT_ALL is enabled.
+
+HIDE_UNDOC_CLASSES     = NO
+
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all 
+# friend (class|struct|union) declarations. 
+# If set to NO (the default) these declarations will be included in the 
+# documentation.
+
+HIDE_FRIEND_COMPOUNDS  = NO
+
+# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any 
+# documentation blocks found inside the body of a function. 
+# If set to NO (the default) these blocks will be appended to the 
+# function's detailed documentation block.
+
+HIDE_IN_BODY_DOCS      = NO
+
+# The INTERNAL_DOCS tag determines if documentation 
+# that is typed after a \internal command is included. If the tag is set 
+# to NO (the default) then the documentation will be excluded. 
+# Set it to YES to include the internal documentation.
+
+INTERNAL_DOCS          = NO
+
+# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate 
+# file names in lower-case letters. If set to YES upper-case letters are also 
+# allowed. This is useful if you have classes or files whose names only differ 
+# in case and if your file system supports case sensitive file names. Windows 
+# and Mac users are advised to set this option to NO.
+
+CASE_SENSE_NAMES       = NO
+
+# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen 
+# will show members with their full class and namespace scopes in the 
+# documentation. If set to YES the scope will be hidden.
+
+HIDE_SCOPE_NAMES       = NO
+
+# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen 
+# will put a list of the files that are included by a file in the documentation 
+# of that file.
+
+SHOW_INCLUDE_FILES     = YES
+
+# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] 
+# is inserted in the documentation for inline members.
+
+INLINE_INFO            = YES
+
+# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen 
+# will sort the (detailed) documentation of file and class members 
+# alphabetically by member name. If set to NO the members will appear in 
+# declaration order.
+
+SORT_MEMBER_DOCS       = YES
+
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the 
+# brief documentation of file, namespace and class members alphabetically 
+# by member name. If set to NO (the default) the members will appear in 
+# declaration order.
+
+SORT_BRIEF_DOCS        = NO
+
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be 
+# sorted by fully-qualified names, including namespaces. If set to 
+# NO (the default), the class list will be sorted only by class name, 
+# not including the namespace part. 
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
+# Note: This option applies only to the class list, not to the 
+# alphabetical list.
+
+SORT_BY_SCOPE_NAME     = NO
+
+# The GENERATE_TODOLIST tag can be used to enable (YES) or 
+# disable (NO) the todo list. This list is created by putting \todo 
+# commands in the documentation.
+
+GENERATE_TODOLIST      = YES
+
+# The GENERATE_TESTLIST tag can be used to enable (YES) or 
+# disable (NO) the test list. This list is created by putting \test 
+# commands in the documentation.
+
+GENERATE_TESTLIST      = YES
+
+# The GENERATE_BUGLIST tag can be used to enable (YES) or 
+# disable (NO) the bug list. This list is created by putting \bug 
+# commands in the documentation.
+
+GENERATE_BUGLIST       = YES
+
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or 
+# disable (NO) the deprecated list. This list is created by putting 
+# \deprecated commands in the documentation.
+
+GENERATE_DEPRECATEDLIST= YES
+
+# The ENABLED_SECTIONS tag can be used to enable conditional 
+# documentation sections, marked by \if sectionname ... \endif.
+
+ENABLED_SECTIONS       = 
+
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines 
+# the initial value of a variable or define consists of for it to appear in 
+# the documentation. If the initializer consists of more lines than specified 
+# here it will be hidden. Use a value of 0 to hide initializers completely. 
+# The appearance of the initializer of individual variables and defines in the 
+# documentation can be controlled using \showinitializer or \hideinitializer 
+# command in the documentation regardless of this setting.
+
+MAX_INITIALIZER_LINES  = 30
+
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated 
+# at the bottom of the documentation of classes and structs. If set to YES the 
+# list will mention the files that were used to generate the documentation.
+
+SHOW_USED_FILES        = YES
+
+# If the sources in your project are distributed over multiple directories 
+# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy 
+# in the documentation. The default is NO.
+
+SHOW_DIRECTORIES       = NO
+
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that 
+# doxygen should invoke to get the current version for each file (typically from the 
+# version control system). Doxygen will invoke the program by executing (via 
+# popen()) the command <command> <input-file>, where <command> is the value of 
+# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file 
+# provided by doxygen. Whatever the program writes to standard output 
+# is used as the file version. See the manual for examples.
+
+FILE_VERSION_FILTER    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to warning and progress messages
+#---------------------------------------------------------------------------
+
+# The QUIET tag can be used to turn on/off the messages that are generated 
+# by doxygen. Possible values are YES and NO. If left blank NO is used.
+
+QUIET                  = NO
+
+# The WARNINGS tag can be used to turn on/off the warning messages that are 
+# generated by doxygen. Possible values are YES and NO. If left blank 
+# NO is used.
+
+WARNINGS               = YES
+
+# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings 
+# for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
+# automatically be disabled.
+
+WARN_IF_UNDOCUMENTED   = YES
+
+# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for 
+# potential errors in the documentation, such as not documenting some 
+# parameters in a documented function, or documenting parameters that 
+# don't exist or using markup commands wrongly.
+
+WARN_IF_DOC_ERROR      = YES
+
+# This WARN_NO_PARAMDOC option can be abled to get warnings for 
+# functions that are documented, but have no documentation for their parameters 
+# or return value. If set to NO (the default) doxygen will only warn about 
+# wrong or incomplete parameter documentation, but not about the absence of 
+# documentation.
+
+WARN_NO_PARAMDOC       = NO
+
+# The WARN_FORMAT tag determines the format of the warning messages that 
+# doxygen can produce. The string should contain the $file, $line, and $text 
+# tags, which will be replaced by the file and line number from which the 
+# warning originated and the warning text. Optionally the format may contain 
+# $version, which will be replaced by the version of the file (if it could 
+# be obtained via FILE_VERSION_FILTER)
+
+WARN_FORMAT            = "$file:$line: $text"
+
+# The WARN_LOGFILE tag can be used to specify a file to which warning 
+# and error messages should be written. If left blank the output is written 
+# to stderr.
+
+WARN_LOGFILE           = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the input files
+#---------------------------------------------------------------------------
+
+# The INPUT tag can be used to specify the files and/or directories that contain 
+# documented source files. You may enter file names like "myfile.cpp" or 
+# directories like "/usr/src/myproject". Separate the files or directories 
+# with spaces.
+
+INPUT                  = 
+
+# This tag can be used to specify the character encoding of the source files that 
+# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default 
+# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. 
+# See http://www.gnu.org/software/libiconv for the list of possible encodings.
+
+INPUT_ENCODING         = UTF-8
+
+# If the value of the INPUT tag contains directories, you can use the 
+# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank the following patterns are tested: 
+# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx 
+# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py
+
+FILE_PATTERNS          = *.py
+
+# The RECURSIVE tag can be used to turn specify whether or not subdirectories 
+# should be searched for input files as well. Possible values are YES and NO. 
+# If left blank NO is used.
+
+RECURSIVE              = YES
+
+# The EXCLUDE tag can be used to specify files and/or directories that should 
+# excluded from the INPUT source files. This way you can easily exclude a 
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
+
+EXCLUDE                = 
+
+# The EXCLUDE_SYMLINKS tag can be used select whether or not files or 
+# directories that are symbolic links (a Unix filesystem feature) are excluded 
+# from the input.
+
+EXCLUDE_SYMLINKS       = NO
+
+# If the value of the INPUT tag contains directories, you can use the 
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude 
+# certain files from those directories. Note that the wildcards are matched 
+# against the file with absolute path, so to exclude all test directories 
+# for example use the pattern */test/*
+
+EXCLUDE_PATTERNS       = *.pyc
+
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names 
+# (namespaces, classes, functions, etc.) that should be excluded from the output. 
+# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, 
+# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test
+
+EXCLUDE_SYMBOLS        = 
+
+# The EXAMPLE_PATH tag can be used to specify one or more files or 
+# directories that contain example code fragments that are included (see 
+# the \include command).
+
+EXAMPLE_PATH           = 
+
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the 
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp 
+# and *.h) to filter out the source-files in the directories. If left 
+# blank all files are included.
+
+EXAMPLE_PATTERNS       = 
+
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be 
+# searched for input files to be used with the \include or \dontinclude 
+# commands irrespective of the value of the RECURSIVE tag. 
+# Possible values are YES and NO. If left blank NO is used.
+
+EXAMPLE_RECURSIVE      = NO
+
+# The IMAGE_PATH tag can be used to specify one or more files or 
+# directories that contain image that are included in the documentation (see 
+# the \image command).
+
+IMAGE_PATH             = 
+
+# The INPUT_FILTER tag can be used to specify a program that doxygen should 
+# invoke to filter for each input file. Doxygen will invoke the filter program 
+# by executing (via popen()) the command <filter> <input-file>, where <filter> 
+# is the value of the INPUT_FILTER tag, and <input-file> is the name of an 
+# input file. Doxygen will then use the output that the filter program writes 
+# to standard output.  If FILTER_PATTERNS is specified, this tag will be 
+# ignored.
+
+INPUT_FILTER           = 
+
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern 
+# basis.  Doxygen will compare the file name with each pattern and apply the 
+# filter if there is a match.  The filters are a list of the form: 
+# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further 
+# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER 
+# is applied to all files.
+
+FILTER_PATTERNS        = 
+
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using 
+# INPUT_FILTER) will be used to filter the input files when producing source 
+# files to browse (i.e. when SOURCE_BROWSER is set to YES).
+
+FILTER_SOURCE_FILES    = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to source browsing
+#---------------------------------------------------------------------------
+
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will 
+# be generated. Documented entities will be cross-referenced with these sources. 
+# Note: To get rid of all source code in the generated output, make sure also 
+# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH 
+# then you must also enable this option. If you don't then doxygen will produce 
+# a warning and turn it on anyway
+
+SOURCE_BROWSER         = YES
+
+# Setting the INLINE_SOURCES tag to YES will include the body 
+# of functions and classes directly in the documentation.
+
+INLINE_SOURCES         = NO
+
+# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct 
+# doxygen to hide any special comment blocks from generated source code 
+# fragments. Normal C and C++ comments will always remain visible.
+
+STRIP_CODE_COMMENTS    = YES
+
+# If the REFERENCED_BY_RELATION tag is set to YES (the default) 
+# then for each documented function all documented 
+# functions referencing it will be listed.
+
+REFERENCED_BY_RELATION = YES
+
+# If the REFERENCES_RELATION tag is set to YES (the default) 
+# then for each documented function all documented entities 
+# called/used by that function will be listed.
+
+REFERENCES_RELATION    = YES
+
+# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)
+# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from
+# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will
+# link to the source code.  Otherwise they will link to the documentstion.
+
+REFERENCES_LINK_SOURCE = YES
+
+# If the USE_HTAGS tag is set to YES then the references to source code 
+# will point to the HTML generated by the htags(1) tool instead of doxygen 
+# built-in source browser. The htags tool is part of GNU's global source 
+# tagging system (see http://www.gnu.org/software/global/global.html). You 
+# will need version 4.8.6 or higher.
+
+USE_HTAGS              = NO
+
+# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen 
+# will generate a verbatim copy of the header file for each class for 
+# which an include is specified. Set to NO to disable this.
+
+VERBATIM_HEADERS       = YES
+
+#---------------------------------------------------------------------------
+# configuration options related to the alphabetical class index
+#---------------------------------------------------------------------------
+
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index 
+# of all compounds will be generated. Enable this if the project 
+# contains a lot of classes, structs, unions or interfaces.
+
+ALPHABETICAL_INDEX     = NO
+
+# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then 
+# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns 
+# in which this list will be split (can be a number in the range [1..20])
+
+COLS_IN_ALPHA_INDEX    = 5
+
+# In case all classes in a project start with a common prefix, all 
+# classes will be put under the same header in the alphabetical index. 
+# The IGNORE_PREFIX tag can be used to specify one or more prefixes that 
+# should be ignored while generating the index headers.
+
+IGNORE_PREFIX          = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the HTML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_HTML tag is set to YES (the default) Doxygen will 
+# generate HTML output.
+
+GENERATE_HTML          = YES
+
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `html' will be used as the default path.
+
+HTML_OUTPUT            = html
+
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for 
+# each generated HTML page (for example: .htm,.php,.asp). If it is left blank 
+# doxygen will generate files with .html extension.
+
+HTML_FILE_EXTENSION    = .html
+
+# The HTML_HEADER tag can be used to specify a personal HTML header for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard header.
+
+HTML_HEADER            = 
+
+# The HTML_FOOTER tag can be used to specify a personal HTML footer for 
+# each generated HTML page. If it is left blank doxygen will generate a 
+# standard footer.
+
+HTML_FOOTER            = 
+
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading 
+# style sheet that is used by each HTML page. It can be used to 
+# fine-tune the look of the HTML output. If the tag is left blank doxygen 
+# will generate a default style sheet. Note that doxygen will try to copy 
+# the style sheet file to the HTML output directory, so don't put your own 
+# stylesheet in the HTML output directory as well, or it will be erased!
+
+HTML_STYLESHEET        = 
+
+# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, 
+# files or namespaces will be aligned in HTML using tables. If set to 
+# NO a bullet list will be used.
+
+HTML_ALIGN_MEMBERS     = YES
+
+# If the GENERATE_HTMLHELP tag is set to YES, additional index files 
+# will be generated that can be used as input for tools like the 
+# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) 
+# of the generated HTML documentation.
+
+GENERATE_HTMLHELP      = NO
+
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML 
+# documentation will contain sections that can be hidden and shown after the 
+# page has loaded. For this to work a browser that supports 
+# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox 
+# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).
+
+HTML_DYNAMIC_SECTIONS  = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can 
+# be used to specify the file name of the resulting .chm file. You 
+# can add a path in front of the file if the result should not be 
+# written to the html output directory.
+
+CHM_FILE               = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can 
+# be used to specify the location (absolute path including file name) of 
+# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run 
+# the HTML help compiler on the generated index.hhp.
+
+HHC_LOCATION           = 
+
+# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag 
+# controls if a separate .chi index file is generated (YES) or that 
+# it should be included in the master .chm file (NO).
+
+GENERATE_CHI           = NO
+
+# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag 
+# controls whether a binary table of contents is generated (YES) or a 
+# normal table of contents (NO) in the .chm file.
+
+BINARY_TOC             = NO
+
+# The TOC_EXPAND flag can be set to YES to add extra items for group members 
+# to the contents of the HTML help documentation and to the tree view.
+
+TOC_EXPAND             = NO
+
+# The DISABLE_INDEX tag can be used to turn on/off the condensed index at 
+# top of each HTML page. The value NO (the default) enables the index and 
+# the value YES disables it.
+
+DISABLE_INDEX          = NO
+
+# This tag can be used to set the number of enum values (range [1..20]) 
+# that doxygen will group on one line in the generated HTML documentation.
+
+ENUM_VALUES_PER_LINE   = 4
+
+# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
+# generated containing a tree-like index structure (just like the one that 
+# is generated for HTML Help). For this to work a browser that supports 
+# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, 
+# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are 
+# probably better off using the HTML help feature.
+
+GENERATE_TREEVIEW      = YES
+
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be 
+# used to set the initial width (in pixels) of the frame in which the tree 
+# is shown.
+
+TREEVIEW_WIDTH         = 250
+
+#---------------------------------------------------------------------------
+# configuration options related to the LaTeX output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will 
+# generate Latex output.
+
+GENERATE_LATEX         = NO
+
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `latex' will be used as the default path.
+
+LATEX_OUTPUT           = latex
+
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be 
+# invoked. If left blank `latex' will be used as the default command name.
+
+LATEX_CMD_NAME         = latex
+
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to 
+# generate index for LaTeX. If left blank `makeindex' will be used as the 
+# default command name.
+
+MAKEINDEX_CMD_NAME     = makeindex
+
+# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact 
+# LaTeX documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_LATEX          = NO
+
+# The PAPER_TYPE tag can be used to set the paper type that is used 
+# by the printer. Possible values are: a4, a4wide, letter, legal and 
+# executive. If left blank a4wide will be used.
+
+PAPER_TYPE             = a4wide
+
+# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX 
+# packages that should be included in the LaTeX output.
+
+EXTRA_PACKAGES         = 
+
+# The LATEX_HEADER tag can be used to specify a personal LaTeX header for 
+# the generated latex document. The header should contain everything until 
+# the first chapter. If it is left blank doxygen will generate a 
+# standard header. Notice: only use this tag if you know what you are doing!
+
+LATEX_HEADER           = 
+
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated 
+# is prepared for conversion to pdf (using ps2pdf). The pdf file will 
+# contain links (just like the HTML output) instead of page references 
+# This makes the output suitable for online browsing using a pdf viewer.
+
+PDF_HYPERLINKS         = NO
+
+# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of 
+# plain latex in the generated Makefile. Set this option to YES to get a 
+# higher quality PDF documentation.
+
+USE_PDFLATEX           = NO
+
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. 
+# command to the generated LaTeX files. This will instruct LaTeX to keep 
+# running if errors occur, instead of asking the user for help. 
+# This option is also used when generating formulas in HTML.
+
+LATEX_BATCHMODE        = NO
+
+# If LATEX_HIDE_INDICES is set to YES then doxygen will not 
+# include the index chapters (such as File Index, Compound Index, etc.) 
+# in the output.
+
+LATEX_HIDE_INDICES     = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the RTF output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output 
+# The RTF output is optimized for Word 97 and may not look very pretty with 
+# other RTF readers or editors.
+
+GENERATE_RTF           = NO
+
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `rtf' will be used as the default path.
+
+RTF_OUTPUT             = rtf
+
+# If the COMPACT_RTF tag is set to YES Doxygen generates more compact 
+# RTF documents. This may be useful for small projects and may help to 
+# save some trees in general.
+
+COMPACT_RTF            = NO
+
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated 
+# will contain hyperlink fields. The RTF file will 
+# contain links (just like the HTML output) instead of page references. 
+# This makes the output suitable for online browsing using WORD or other 
+# programs which support those fields. 
+# Note: wordpad (write) and others do not support links.
+
+RTF_HYPERLINKS         = NO
+
+# Load stylesheet definitions from file. Syntax is similar to doxygen's 
+# config file, i.e. a series of assignments. You only have to provide 
+# replacements, missing definitions are set to their default value.
+
+RTF_STYLESHEET_FILE    = 
+
+# Set optional variables used in the generation of an rtf document. 
+# Syntax is similar to doxygen's config file.
+
+RTF_EXTENSIONS_FILE    = 
+
+#---------------------------------------------------------------------------
+# configuration options related to the man page output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_MAN tag is set to YES (the default) Doxygen will 
+# generate man pages
+
+GENERATE_MAN           = NO
+
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `man' will be used as the default path.
+
+MAN_OUTPUT             = man
+
+# The MAN_EXTENSION tag determines the extension that is added to 
+# the generated man pages (default is the subroutine's section .3)
+
+MAN_EXTENSION          = .3
+
+# If the MAN_LINKS tag is set to YES and Doxygen generates man output, 
+# then it will generate one additional man file for each entity 
+# documented in the real man page(s). These additional files 
+# only source the real man page, but without them the man command 
+# would be unable to find the correct page. The default is NO.
+
+MAN_LINKS              = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the XML output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_XML tag is set to YES Doxygen will 
+# generate an XML file that captures the structure of 
+# the code including all documentation.
+
+GENERATE_XML           = NO
+
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. 
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be 
+# put in front of it. If left blank `xml' will be used as the default path.
+
+XML_OUTPUT             = xml
+
+# The XML_SCHEMA tag can be used to specify an XML schema, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_SCHEMA             = 
+
+# The XML_DTD tag can be used to specify an XML DTD, 
+# which can be used by a validating XML parser to check the 
+# syntax of the XML files.
+
+XML_DTD                = 
+
+# If the XML_PROGRAMLISTING tag is set to YES Doxygen will 
+# dump the program listings (including syntax highlighting 
+# and cross-referencing information) to the XML output. Note that 
+# enabling this will significantly increase the size of the XML output.
+
+XML_PROGRAMLISTING     = YES
+
+#---------------------------------------------------------------------------
+# configuration options for the AutoGen Definitions output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will 
+# generate an AutoGen Definitions (see autogen.sf.net) file 
+# that captures the structure of the code including all 
+# documentation. Note that this feature is still experimental 
+# and incomplete at the moment.
+
+GENERATE_AUTOGEN_DEF   = NO
+
+#---------------------------------------------------------------------------
+# configuration options related to the Perl module output
+#---------------------------------------------------------------------------
+
+# If the GENERATE_PERLMOD tag is set to YES Doxygen will 
+# generate a Perl module file that captures the structure of 
+# the code including all documentation. Note that this 
+# feature is still experimental and incomplete at the 
+# moment.
+
+GENERATE_PERLMOD       = NO
+
+# If the PERLMOD_LATEX tag is set to YES Doxygen will generate 
+# the necessary Makefile rules, Perl scripts and LaTeX code to be able 
+# to generate PDF and DVI output from the Perl module output.
+
+PERLMOD_LATEX          = NO
+
+# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be 
+# nicely formatted so it can be parsed by a human reader.  This is useful 
+# if you want to understand what is going on.  On the other hand, if this 
+# tag is set to NO the size of the Perl module output will be much smaller 
+# and Perl will parse it just the same.
+
+PERLMOD_PRETTY         = YES
+
+# The names of the make variables in the generated doxyrules.make file 
+# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. 
+# This is useful so different doxyrules.make files included by the same 
+# Makefile don't overwrite each other's variables.
+
+PERLMOD_MAKEVAR_PREFIX = 
+
+#---------------------------------------------------------------------------
+# Configuration options related to the preprocessor   
+#---------------------------------------------------------------------------
+
+# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will 
+# evaluate all C-preprocessor directives found in the sources and include 
+# files.
+
+ENABLE_PREPROCESSING   = YES
+
+# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro 
+# names in the source code. If set to NO (the default) only conditional 
+# compilation will be performed. Macro expansion can be done in a controlled 
+# way by setting EXPAND_ONLY_PREDEF to YES.
+
+MACRO_EXPANSION        = NO
+
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES 
+# then the macro expansion is limited to the macros specified with the 
+# PREDEFINED and EXPAND_AS_DEFINED tags.
+
+EXPAND_ONLY_PREDEF     = NO
+
+# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files 
+# in the INCLUDE_PATH (see below) will be search if a #include is found.
+
+SEARCH_INCLUDES        = YES
+
+# The INCLUDE_PATH tag can be used to specify one or more directories that 
+# contain include files that are not input files but should be processed by 
+# the preprocessor.
+
+INCLUDE_PATH           = 
+
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard 
+# patterns (like *.h and *.hpp) to filter out the header-files in the 
+# directories. If left blank, the patterns specified with FILE_PATTERNS will 
+# be used.
+
+INCLUDE_FILE_PATTERNS  = 
+
+# The PREDEFINED tag can be used to specify one or more macro names that 
+# are defined before the preprocessor is started (similar to the -D option of 
+# gcc). The argument of the tag is a list of macros of the form: name 
+# or name=definition (no spaces). If the definition and the = are 
+# omitted =1 is assumed. To prevent a macro definition from being 
+# undefined via #undef or recursively expanded use the := operator 
+# instead of the = operator.
+
+PREDEFINED             = 
+
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then 
+# this tag can be used to specify a list of macro names that should be expanded. 
+# The macro definition that is found in the sources will be used. 
+# Use the PREDEFINED tag if you want to use a different macro definition.
+
+EXPAND_AS_DEFINED      = 
+
+# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then 
+# doxygen's preprocessor will remove all function-like macros that are alone 
+# on a line, have an all uppercase name, and do not end with a semicolon. Such 
+# function macros are typically used for boiler-plate code, and will confuse 
+# the parser if not removed.
+
+SKIP_FUNCTION_MACROS   = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to external references   
+#---------------------------------------------------------------------------
+
+# The TAGFILES option can be used to specify one or more tagfiles. 
+# Optionally an initial location of the external documentation 
+# can be added for each tagfile. The format of a tag file without 
+# this location is as follows: 
+#   TAGFILES = file1 file2 ... 
+# Adding location for the tag files is done as follows: 
+#   TAGFILES = file1=loc1 "file2 = loc2" ... 
+# where "loc1" and "loc2" can be relative or absolute paths or 
+# URLs. If a location is present for each tag, the installdox tool 
+# does not have to be run to correct the links.
+# Note that each tag file must have a unique name
+# (where the name does NOT include the path)
+# If a tag file is not located in the directory in which doxygen 
+# is run, you must also specify the path to the tagfile here.
+
+TAGFILES               = 
+
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create 
+# a tag file that is based on the input files it reads.
+
+GENERATE_TAGFILE       = 
+
+# If the ALLEXTERNALS tag is set to YES all external classes will be listed 
+# in the class index. If set to NO only the inherited external classes 
+# will be listed.
+
+ALLEXTERNALS           = NO
+
+# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed 
+# in the modules index. If set to NO, only the current project's groups will 
+# be listed.
+
+EXTERNAL_GROUPS        = YES
+
+# The PERL_PATH should be the absolute path and name of the perl script 
+# interpreter (i.e. the result of `which perl').
+
+PERL_PATH              = /usr/bin/perl
+
+#---------------------------------------------------------------------------
+# Configuration options related to the dot tool   
+#---------------------------------------------------------------------------
+
+# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will 
+# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base 
+# or super classes. Setting the tag to NO turns the diagrams off. Note that 
+# this option is superseded by the HAVE_DOT option below. This is only a 
+# fallback. It is recommended to install and use dot, since it yields more 
+# powerful graphs.
+
+CLASS_DIAGRAMS         = YES
+
+# You can define message sequence charts within doxygen comments using the \msc 
+# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to 
+# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to 
+# specify the directory where the mscgen tool resides. If left empty the tool is assumed to 
+# be found in the default search path.
+
+MSCGEN_PATH            = 
+
+# If set to YES, the inheritance and collaboration graphs will hide 
+# inheritance and usage relations if the target is undocumented 
+# or is not a class.
+
+HIDE_UNDOC_RELATIONS   = YES
+
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is 
+# available from the path. This tool is part of Graphviz, a graph visualization 
+# toolkit from AT&T and Lucent Bell Labs. The other options in this section 
+# have no effect if this option is set to NO (the default)
+
+HAVE_DOT               = NO
+
+# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect inheritance relations. Setting this tag to YES will force the 
+# the CLASS_DIAGRAMS tag to NO.
+
+CLASS_GRAPH            = YES
+
+# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for each documented class showing the direct and 
+# indirect implementation dependencies (inheritance, containment, and 
+# class references variables) of the class with other documented classes.
+
+COLLABORATION_GRAPH    = YES
+
+# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen 
+# will generate a graph for groups, showing the direct groups dependencies
+
+GROUP_GRAPHS           = YES
+
+# If the UML_LOOK tag is set to YES doxygen will generate inheritance and 
+# collaboration diagrams in a style similar to the OMG's Unified Modeling 
+# Language.
+
+UML_LOOK               = YES
+
+# If set to YES, the inheritance and collaboration graphs will show the 
+# relations between templates and their instances.
+
+TEMPLATE_RELATIONS     = NO
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT 
+# tags are set to YES then doxygen will generate a graph for each documented 
+# file showing the direct and indirect include dependencies of the file with 
+# other documented files.
+
+INCLUDE_GRAPH          = YES
+
+# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and 
+# HAVE_DOT tags are set to YES then doxygen will generate a graph for each 
+# documented header file showing the documented files that directly or 
+# indirectly include this file.
+
+INCLUDED_BY_GRAPH      = YES
+
+# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a call dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable call graphs for selected 
+# functions only using the \callgraph command.
+
+CALL_GRAPH             = NO
+
+# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will 
+# generate a caller dependency graph for every global function or class method. 
+# Note that enabling this option will significantly increase the time of a run. 
+# So in most cases it will be better to enable caller graphs for selected 
+# functions only using the \callergraph command.
+
+CALLER_GRAPH           = NO
+
+# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen 
+# will graphical hierarchy of all classes instead of a textual one.
+
+GRAPHICAL_HIERARCHY    = YES
+
+# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES 
+# then doxygen will show the dependencies a directory has on other directories 
+# in a graphical way. The dependency relations are determined by the #include
+# relations between the files in the directories.
+
+DIRECTORY_GRAPH        = YES
+
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images 
+# generated by dot. Possible values are png, jpg, or gif
+# If left blank png will be used.
+
+DOT_IMAGE_FORMAT       = png
+
+# The tag DOT_PATH can be used to specify the path where the dot tool can be 
+# found. If left blank, it is assumed the dot tool can be found in the path.
+
+DOT_PATH               = 
+
+# The DOTFILE_DIRS tag can be used to specify one or more directories that 
+# contain dot files that are included in the documentation (see the 
+# \dotfile command).
+
+DOTFILE_DIRS           = 
+
+# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of 
+# nodes that will be shown in the graph. If the number of nodes in a graph 
+# becomes larger than this value, doxygen will truncate the graph, which is 
+# visualized by representing a node as a red box. Note that doxygen if the number 
+# of direct children of the root node in a graph is already larger than 
+# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note 
+# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
+
+DOT_GRAPH_MAX_NODES    = 50
+
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the 
+# graphs generated by dot. A depth value of 3 means that only nodes reachable 
+# from the root by following a path via at most 3 edges will be shown. Nodes 
+# that lay further from the root node will be omitted. Note that setting this 
+# option to 1 or 2 may greatly reduce the computation time needed for large 
+# code bases. Also note that the size of a graph can be further restricted by 
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
+
+MAX_DOT_GRAPH_DEPTH    = 0
+
+# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent 
+# background. This is disabled by default, which results in a white background. 
+# Warning: Depending on the platform used, enabling this option may lead to 
+# badly anti-aliased labels on the edges of a graph (i.e. they become hard to 
+# read).
+
+DOT_TRANSPARENT        = NO
+
+# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output 
+# files in one run (i.e. multiple -o and -T options on the command line). This 
+# makes dot run faster, but since only newer versions of dot (>1.8.10) 
+# support this, this feature is disabled by default.
+
+DOT_MULTI_TARGETS      = NO
+
+# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will 
+# generate a legend page explaining the meaning of the various boxes and 
+# arrows in the dot generated graphs.
+
+GENERATE_LEGEND        = YES
+
+# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will 
+# remove the intermediate dot files that are used to generate 
+# the various graphs.
+
+DOT_CLEANUP            = YES
+
+#---------------------------------------------------------------------------
+# Configuration::additions related to the search engine   
+#---------------------------------------------------------------------------
+
+# The SEARCHENGINE tag specifies whether or not a search engine should be 
+# used. If set to NO the values of all tags below this one will be ignored.
+
+SEARCHENGINE           = NO
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import os
+import sys
+
+__all__ = ["model"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,87 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+
+"""
+Methods for Mapping Carbon model to other data model objects 
+"""
+from cone.public import api, exceptions, container, utils
+from cone.public.mapping import BaseMapper
+from cone.carbon import model
+
+""" Carbon to confml model mapping is done in Carbon2confml """
+from cone.confml import model as confmlmodel
+
+class Carbon2confml(object):
+    """
+    Carbon2confml class maps Carbon model object to confml model objects.  
+    """
+    def __init__(self):
+        self.MAPPING_TABLE = {model.CarbonConfiguration : self.configuration,
+                              model.FeatureList : self.configuration,
+                              model.CarbonFeature: self.setting,
+                              model.CarbonSetting: self.setting,
+                              model.CarbonIntSetting: self.setting,
+                              model.CarbonBooleanSetting: self.setting,
+                              model.CarbonStringSetting: self.setting,
+                              model.CarbonSelectionSetting: self.setting}
+        pass
+
+    def map_object(self, object):
+        """
+        Return a confml model object from Carbon object
+        """
+        try:
+            return self.MAPPING_TABLE[object.__class__](object)
+        except KeyError:
+            return object
+
+    def configuration(self, object):
+        """
+        Map a CarbonConfiguration object to a ConfmlConfiguration
+        """
+        mapdict = object._dict()
+        mapobj = confmlmodel.ConfmlConfiguration(**mapdict)
+        return mapobj
+
+    def setting(self, object):
+        """
+        Map a CarbonSetting object to a ConfmlSetting
+        """
+        mapdict = object._dict()
+        if object.__class__ == model.CarbonFeature:
+            mapobj = api.Feature(**mapdict)
+        elif object.__class__ == model.CarbonIntSetting:
+            mapobj = confmlmodel.ConfmlIntSetting(**mapdict)
+        elif object.__class__ == model.CarbonBooleanSetting:
+            mapobj = confmlmodel.ConfmlBooleanSetting(**mapdict)
+        elif object.__class__ == model.CarbonSelectionSetting:
+            mapobj = confmlmodel.ConfmlSelectionSetting(**mapdict)
+        elif object.__class__ == model.CarbonStringSetting:
+            mapobj = confmlmodel.ConfmlSetting(**mapdict)
+        elif object.__class__ == model.CarbonSetting:
+            mapobj = confmlmodel.ConfmlSetting(**mapdict)
+        else:
+            raise exceptions.IncorrectClassError('Cannot find a mapping object for this class %s!' % object.__class__)
+        return mapobj
+
+MAPPERS =  \
+{ 'confml' : Carbon2confml,
+  'carbon' : BaseMapper
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,182 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+
+import posixpath
+import datetime
+
+
+"""
+Base class for Carbon specific elements.
+Attributes:
+"""
+from cone.public import api, exceptions, container, utils
+from cone.confml import model as confmlmodel
+
+class ResourceList(object):
+    def __init__(self):
+        self.resources = {}
+
+    def add_resource(self,resource):
+        self.resources[resource.get_path()] = resource
+
+    def get_resource(self,path):
+        return self.resources[path]
+
+    def remove_resource(self,path):
+        del self.resources[path]
+
+    def list_resources(self):
+        return self.resources.keys()
+
+    def __len__(self):
+        return len(self.resources)
+
+    def __getitem__(self, key):
+        return self.resources[key]
+
+    def __setitem__(self, key, value):
+        self.resources[key] = value
+
+    def __delitem__( self, key):
+        del self.resources[key]
+
+    def __iter__(self):
+        return iter(self.resources.values())
+
+
+class ConfigurationResource(object):
+    FILE_EXTENSION = '/root.confml'
+    def __init__(self, **kwargs):
+        self.name          = kwargs.get('configuration_name', None)
+        self.path          = kwargs.get('path', None)
+        self.parent_config = kwargs.get('parent_config', None)
+        self.version       = kwargs.get('version_identifier', None)
+
+    def get_path(self):
+        path = utils.resourceref.remove_begin_slash(self.path)
+        path = utils.resourceref.remove_end_slash(path)
+        return path + self.FILE_EXTENSION
+
+    def __str__(self):
+        return "%s = %s : %s:%s" % (self.get_path(),self.path,self.name, self.version)
+
+class FeatureListResource(object):
+    CONFML_EXTENSION = '.confml'
+    CARBON_EXTENSION = '.featurelist'
+    def __init__(self, **kwargs):
+        self.path                   = kwargs.get('path', None)
+        self.version_title          = kwargs.get('version_title', None)
+        self.type                   = kwargs.get('type', None)
+        self.list_id                = kwargs.get('list_id', None)
+        self.expanded               = kwargs.get('expanded', None)
+        self.list_version_id        = kwargs.get('list_version_id', None)
+        self.version_identifier     = kwargs.get('version_identifier', None)
+        self.is_latest_version      = kwargs.get('is_latest_version', None)
+        self.can_be_released        = kwargs.get('can_be_released', None)
+        self.has_external_relations = kwargs.get('has_external_relations', None)
+
+    def get_path(self):
+        path = utils.resourceref.remove_begin_slash(self.version_title)
+        path = utils.resourceref.remove_end_slash(path)
+        return path + self.CONFML_EXTENSION
+
+    def get_carbon_path(self):
+        path = utils.resourceref.remove_begin_slash(self.version_title)
+        path = utils.resourceref.remove_end_slash(path)
+        return path + self.CARBON_EXTENSION
+
+    def __str__(self):
+        return "%s = %s : %s" % (self.get_path(),self.path,self.version_title)
+
+class CarbonElement(object):
+    pass
+
+    def _get_mapper(self,modelname):
+        """
+        Return a instance of appropriate mapper for given model.
+        """
+        mapmodule = __import__('cone.carbon.mapping')
+        return mapmodule.carbon.mapping.MAPPERS[modelname]()
+
+
+class CarbonConfiguration(CarbonElement, confmlmodel.ConfmlConfiguration):
+    def __init__(self, ref='', **kwargs):
+        super(CarbonConfiguration, self).__init__(ref, **kwargs)
+        if self.meta == None:
+            self.meta = {}
+        
+        self.name                       = kwargs.get('name') or utils.resourceref.remove_ext(utils.resourceref.psplit_ref(self.path)[-1])
+        self.meta.add('type',kwargs.get('type', 'configurationroot'))
+        self._version_identifier        = kwargs.get('version_identifier', None)
+
+    @property
+    def version_identifier(self):
+        if self._version_identifier == None:
+            dt = datetime.datetime.today()
+            self._version_identifier = "%dwk%02d" % dt.isocalendar()[0:2]
+        return self._version_identifier
+
+    @property
+    def type(self):
+        if self.meta and self.meta.get('type'):
+            return self.meta['type']
+        else:
+            return 'configurationroot'
+    
+class FeatureList(CarbonConfiguration):
+    def __init__(self, ref='', **kwargs):
+        if not kwargs.get('path'):
+            kwargs['path']          = str(kwargs.get('name', '')+'.confml')
+        kwargs['type'] = 'featurelist'
+        super(FeatureList, self).__init__(ref, **kwargs)
+        self.name                = kwargs.get('name', '')
+        self._version_identifier = kwargs.get('version_identifier', 'WORKING')
+
+class CarbonFeature(CarbonElement, confmlmodel.ConfmlSetting):
+    def __init__(self, ref,**kwargs):
+        ref = utils.resourceref.to_dottedref(ref)
+        super(CarbonFeature,self).__init__(ref,**kwargs)
+        
+
+class CarbonSetting(CarbonFeature, confmlmodel.ConfmlSetting):
+    pass
+
+class CarbonIntSetting(CarbonFeature, confmlmodel.ConfmlIntSetting):
+    pass
+
+class CarbonBooleanSetting(CarbonFeature, confmlmodel.ConfmlBooleanSetting):
+    pass
+
+class CarbonSelectionSetting(CarbonFeature, confmlmodel.ConfmlSelectionSetting):
+    pass
+
+class CarbonStringSetting(CarbonFeature, confmlmodel.ConfmlSetting):
+    def __init__(self, ref,**kwargs):
+        super(CarbonStringSetting,self).__init__(ref,**kwargs)
+        self.type = 'string'
+
+    pass
+
+def get_mapper(modelname):
+    """
+    Return a instance of appropriate mapper for given model.
+    """
+    mapmodule = __import__('cone.carbon.mapping')
+    return mapmodule.carbon.mapping.MAPPERS[modelname]()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/persistentjson.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,609 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+import re
+import logging
+import simplejson
+
+""" cone specific imports """
+from cone.public import persistence, exceptions, api, utils, container
+from cone.carbon import model
+
+MODEL                    = model
+
+def dumps(obj, indent=True):
+    """ Make sure that the object is mapped to an object in this model """
+    mobj = obj._get_mapper('carbon').map_object(obj)
+    writer = get_writer_for_class(mobj.__class__.__name__)
+    dict = writer.dumps(mobj)
+    # Return the data as dict, as it is urlencoded by client
+    return dict
+
+def loads(jsonstr):
+    return CarbonReader().loads(jsonstr)
+
+
+class CarbonResourceMapper(object):
+    def __init__(self):
+        self.CARBON_RESOURCE_TYPE_MAP = {'configurationroot' : self.map_carbon_configurationroot,
+                             'configurationlayer' : self.map_carbon_configurationlayer,
+                             'featurelist' : self.map_carbon_featurelist}
+        self.CONFML_RESOURCE_TYPE_MAP = {'configurationroot' : self.map_confml_configurationroot,
+                             'configurationlayer' : self.map_confml_configurationlayer,
+                             'featurelist' : self.map_confml_featurelist}
+
+    def map_carbon_resource(self, resourcepath):
+        for resourceext in self.CARBON_RESOURCE_TYPE_MAP:
+            if resourcepath.endswith(resourceext):
+                return self.CARBON_RESOURCE_TYPE_MAP[resourceext](resourcepath)
+        return resourcepath
+
+    def map_confml_resource(self, resourcetype, resourcepath):
+        return self.CONFML_RESOURCE_TYPE_MAP[resourcetype](resourcepath)
+
+    def map_carbon_configurationroot(self, resourcepath):
+        return resourcepath.replace('.configurationroot', '.confml')
+
+    def map_carbon_configurationlayer(self, resourcepath):
+        return resourcepath.replace('.configurationlayer', '/root.confml')
+
+    def map_carbon_featurelist(self, resourcepath):
+        return "featurelists/%s" % resourcepath.replace('.featurelist', '.confml')
+
+    def map_confml_configurationroot(self, resourcepath):
+        return resourcepath.replace('.confml', '.configurationroot')
+
+    def map_confml_configurationlayer(self, resourcepath):
+        return resourcepath.replace('/root.confml', '.configurationlayer')
+
+    def map_confml_featurelist(self, resourcepath):
+        path = resourcepath.replace('featurelists/','').replace('.confml', '')
+        version_identifier = 'WORKING'
+        m = re.match('^(.*) \((.*)\)', path)
+        # if the resourcepath does not have version information 
+        # use default WORKING
+        if m:
+            path = m.group(1)
+            version_identifier = m.group(2)
+        return '%s (%s).featurelist' % (path, version_identifier)
+
+class ResourceListReader(persistence.ConeReader):
+    """
+    """ 
+    def loads(self, jsonstr):
+        """
+        @param jsonstr: The json string to read. 
+        """
+        reslist = model.ResourceList()
+        datadict = simplejson.loads(jsonstr)
+        for configuration in datadict.get('configurations', []):
+            reslist.add_resource(model.ConfigurationResource(**configuration))
+        for featurelist in datadict.get('featurelists', []):
+            reslist.add_resource(model.FeatureListResource(**featurelist))
+        return reslist
+
+class HasResourceReader(persistence.ConeReader):
+    """
+    """ 
+    def loads(self, jsonstr):
+        """
+        @param jsonstr: The json string to read. 
+        """
+        try:
+            datadict = simplejson.loads(jsonstr)
+            return datadict.get('has_resource',False)
+        except ValueError,e:
+            logging.getLogger('cone').error("Failed to parser json from %s" % jsonstr)
+            raise e
+
+
+class CarbonWriter(persistence.ConeWriter):
+    """
+    """ 
+    def dumps(self, obj):
+        """
+        @param obj: The object 
+        """
+        """ Make sure that the object is mapped to an object in this model """
+        mobj = obj._get_mapper('carbon').map_object(obj)
+        writer = get_writer_for_class(mobj.__class__.__name__)
+        return writer.dumps(obj)
+
+
+class CarbonReader(persistence.ConeReader):
+    """
+    """ 
+    def loads(self, jsonstr):
+        """
+        @param xml: The xml which to read. reads only the first object. 
+        """
+        try:
+            datadict = simplejson.loads(jsonstr)
+            for key in datadict:
+                reader = get_reader_for_elem(key)
+                return reader.loads(datadict[key])
+        except (SyntaxError, ValueError),e:
+            utils.log_exception(logging.getLogger('cone'), "Json string parse raised exception: %s!" % (e))
+            raise exceptions.ParseError("Json string %s parse raised exception: %s!" % (jsonstr,e))
+
+class ConfigurationCreateWriter(CarbonWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this CarbonWriter supports writing
+        of the given class name
+        """
+        return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        featurelists = []
+        included = []
+        # Remove the featurelists and configurations from the creation phase
+#        resmapper = CarbonResourceMapper()
+#        for confpath in obj.list_configurations():
+#            config = obj.get_configuration(confpath)
+#            if config.meta and config.meta.get('type') == 'featurelist':
+#                featurelists.append(resmapper.map_confml_resource('featurelist',confpath))
+#            elif config.meta and config.meta.get('type'):
+#                included.append(resmapper.map_confml_resource(config.meta.get('type'),confpath))
+#            else:
+#                # ignore configs that are not carbon configs
+#                pass
+
+        configuration_dict = {'name' : obj.name,
+                              'parent_path' : '',
+                              'included' : included,
+                              'description' : obj.desc or 'Needs description',
+                              'configuration_type' : 'carbon',
+                              'resource_type' : 'configuration',
+                              'feature_lists' : featurelists, 
+                               }
+        
+        return configuration_dict
+
+class ConfigurationWriter(CarbonWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this CarbonWriter supports writing
+        of the given class name
+        """
+        if classname=="CarbonConfiguration":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        if obj.meta:
+            if obj.meta.get('type') == 'configurationroot':
+                return self.dumps_root(obj)
+            elif obj.meta.get('type') == 'configurationlayer':
+                return self.dumps_layer(obj)
+        raise Exception("Not supported CarbonConfigruration, %s" % obj)
+
+    def dumps_root(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        featurelists = []
+        included = []
+        resmapper = CarbonResourceMapper()
+        for confpath in obj.list_configurations():
+            config = obj.get_configuration(confpath)
+            if config.meta:
+                if config.meta.get('type') == 'featurelist':
+                    featurelists.append(resmapper.map_confml_resource('featurelist',confpath))
+                else:
+                    included.append(resmapper.map_confml_resource(config.meta.get('type'),confpath))
+            else:
+                # This default case could also be identified as error
+                included.append(confpath)
+
+        configuration_dict = {'feature_lists': featurelists,
+                             'parent_config': None, 
+                             'configuration_name': obj.name, 
+                             'version_identifier': obj.version_identifier, 
+                             'included': included, 
+                             'ref': obj.ref}
+        
+        return configuration_dict
+
+    def dumps_layer(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        configuration_dict = {'version_identifier': obj.version_identifier}
+
+        datawriter = DataWriter()
+        data = datawriter.dumps(obj)
+        configuration_dict['data'] =  data
+        
+        return configuration_dict
+
+class ConfigurationRootReader(CarbonReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="configurationroot":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        name = dict.get('configuration_name')
+        path = name + ".confml"
+        conf = model.CarbonConfiguration(dict.get('ref'), path=path, type='configurationroot')
+        conf.name = name
+        conf.version = dict.get('version_identifier')
+        resmapper = CarbonResourceMapper()
+        
+        """ Read the featurelists as included configurations """
+        for fealist in dict.get('feature_lists',[]):
+            conf.include_configuration(resmapper.map_carbon_resource(fealist))
+        """ Read the included configurations """
+        for includedconfig in dict.get('included',[]):
+            conf.include_configuration(resmapper.map_carbon_resource(includedconfig))
+        return conf
+
+class ConfigurationLayerReader(CarbonReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="configurationlayer":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        name = dict.get('configuration_name')
+        path = name + ".confml"
+        conf = model.CarbonConfiguration(dict.get('ref'), path=path, type='configurationlayer')
+        conf.name = name
+        
+        conf.version = dict.get('version_identifier')
+        
+        """ Last read the data of this configuration and add it as a configuration """
+        data_reader = DataReader()
+        datacont = data_reader.loads(dict.get('data', {}))
+        proxy = api.ConfigurationProxy(datacont.path)
+        conf.add_configuration(proxy)
+        proxy._set_obj(datacont)
+        
+        return conf
+
+class FeatureListCreateWriter(CarbonWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Feature list create writer is supported only explicitly
+        """
+        return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The FeatureList object 
+        """
+        """ Make sure that the object is mapped to an object in this model """
+        mobj = obj._get_mapper('carbon').map_object(obj)
+        featurelist_dict = {'type' : 'featurelist',
+                            'flv_description' : mobj.desc or 'Needs description',
+                            'version_identifier' : mobj.version_identifier
+                            }
+        if hasattr(mobj, 'responsible'):
+            featurelist_dict['responsible'] = mobj.responsible
+        return featurelist_dict
+
+class FeatureListWriter(CarbonWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Feature list create writer is supported only explicitly
+        """
+        if classname == 'FeatureList':
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The FeatureList object 
+        """
+
+        featurelist_dict = {
+                            'type' : 'featurelist',
+                            'name' : obj.name,
+                            'flv_description' : obj.desc or 'Needs description',
+                            'path' : obj.path,
+                            'features' : []
+                            }
+        if obj.meta.get('version_identifier'):
+            featurelist_dict['version_identifier'] = obj.meta.get('version_identifier')
+        # add all features of the featurelist
+        for fearef in obj.list_features():
+            feature = obj.get_feature(fearef)
+            writer = FeatureWriter()
+            feadict = writer.dumps(feature)
+            featurelist_dict['features'].append(feadict)
+        
+        return featurelist_dict
+
+class FeatureListReader(CarbonReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="featurelist":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        fealist_expanded            = dict.get('expanded')
+        fealist_version             = dict.get('version_identifier')
+        fealist_is_latest_version   = dict.get('is_latest_version')
+        fealist_list_id             = dict.get('list_id')
+        fealist_path                = dict.get('path')
+        fealist_version_title       = dict.get('version_title')
+        fealist_can_be_released     = dict.get('can_be_released')
+        fealist_type                = dict.get('type')
+        fealist_has_external_relations = dict.get('is_latest_version')
+        
+        # Create a configuration object from the featurelist
+        conf = model.FeatureList(path='featurelists/'+fealist_version_title+'.confml')
+        conf.meta.add('version_identifier', fealist_version)
+        
+        for feature in dict.get('features'):
+            reader = FeatureReader()
+            fea = reader.loads(feature)
+            if fea != None:
+                conf.add_feature(fea)
+        
+        for feafqr in conf.list_all_features():
+            # Add empty data object to featurelist configuration
+            conf.add_data(api.Data(fqr=feafqr))
+            
+        return conf
+
+
+class FeatureWriter(CarbonWriter):
+    CONFML_TO_CARBON_TYPE = {
+                             'boolean'   : 'BOOLEAN',
+                             'int'       : 'INTEGER',
+                             'selection' : 'SELECTION',
+                             'string'    : 'STRING',
+                             None : None,
+                             '' : ''
+                             }
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="Feature" or\
+            classname=="CarbonBooleanSetting" or\
+            classname=="CarbonIntSetting" or\
+            classname=="CarbonStringSetting" or\
+            classname=="CarbonSelectSetting"or\
+            classname=="CarbonSetting":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Feature object 
+        """
+        """ Make sure that the object is mapped to an object in this model """
+        mobj = obj._get_mapper('carbon').map_object(obj)
+        
+        featuredict = {'type' : 'feature',
+                       'status' : 'APPROVED',
+                       'title' : mobj.name,
+                       'ref' : mobj.ref,
+                       'description' : mobj.desc or 'Needs description',
+                       'responsible' : None,
+                       'value_type' : self.CONFML_TO_CARBON_TYPE[mobj.type],
+                       'children' : []}
+        if featuredict['value_type'] != None:
+            featuredict['type_object'] = 'carbon_feature_type_normal'
+        if mobj.type == 'selection':
+            featuredict['options'] = mobj.options.keys() 
+
+        writer = FeatureWriter()
+        for fearef in mobj.list_features():
+            feaobj = obj.get_feature(fearef)
+            childdict = writer.dumps(feaobj)
+            featuredict['children'].append(childdict)
+        return featuredict
+
+
+class FeatureReader(CarbonReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="features":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        id = dict.get('id')
+        name = dict.get('title')
+        ref = dict.get('ref')
+        ref = utils.resourceref.to_objref(ref)
+        status = dict.get('status')
+        value_type = dict.get('value_type')
+        description = dict.get('description')
+        
+        if value_type == 'boolean':
+            fea = model.CarbonBooleanSetting(ref, type=value_type)
+        elif value_type == 'integer':
+            fea = model.CarbonIntSetting(ref, type=value_type)
+        elif value_type == 'string':
+            fea = model.CarbonStringSetting(ref, type=value_type)
+        elif value_type == 'selection':
+            fea = model.CarbonSelectionSetting(ref, type=value_type)
+            for option in dict.get('options'):
+                fea.add_option(option,option)
+        elif value_type == '':
+            fea = model.CarbonFeature(ref, type=value_type)
+        else:
+            fea = model.CarbonFeature(ref)
+
+        
+        fea.name = name
+        fea.status = status
+        fea.desc = description
+         
+        for childdict in dict.get('children',[]):
+            reader = FeatureReader()
+            subfea = reader.loads(childdict)
+            if subfea != None:
+                fea.add_feature(subfea)
+        return fea
+
+class DataWriter(CarbonWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if  classname=="Data" or \
+            classname=="DataContainer":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The DataContainer object 
+        """
+        datadict = {}
+        for dataelem in obj._traverse(type=api.Data):
+            if dataelem.get_value() != None:
+                datadict[dataelem.get_fearef()] = map_confml2carbon_value(dataelem.get_value())
+        return datadict
+
+
+class DataReader(CarbonReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="data":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        datacont  = api.Configuration('confml/data.confml')
+        for dataref in dict.keys():
+            # Ignore null values
+            if dict[dataref]:
+                refs = []
+                for elem in dataref.split('.'):
+                    refs.append(utils.resourceref.to_objref(elem))
+                newref = '.'.join(refs)
+                dataelem = api.Data(fqr=newref, value=map_carbon2confml_value(dict[dataref]))
+                datacont.add_data(dataelem)
+        return datacont
+
+def map_carbon2confml_value(value):
+    if value == 'DEFINED':
+        return 'true'
+    elif value == 'UNDEFINED':
+        return 'false'
+    else:
+        return value
+
+def map_confml2carbon_value(value):
+    if value == 'true':
+        return 'DEFINED'
+    elif value == 'false':
+        return 'UNDEFINED'
+    else:
+        return value
+
+def get_reader_for_elem(elemname, parent=None):
+    for reader in CarbonReader.__subclasses__():
+        if reader.supported_elem(elemname,parent):
+            return reader()
+    raise exceptions.ConePersistenceError("No reader for given elem %s under %s found!" % (elemname, parent))
+
+def get_writer_for_class(classname):
+    for writer in CarbonWriter.__subclasses__():
+        if writer.supported_class(classname):
+            return writer ()
+    raise exceptions.ConePersistenceError("No writer for given class found! %s" % classname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+if SOURCE_ROOT not in sys.path:
+    sys.path.append(SOURCE_ROOT)
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    sys.path.insert(0, ROOT_PATH)
+    try:
+        suite = unittest.TestSuite()
+        for test_module in __all__:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/tests/unittest_mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,107 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+
+from cone.public import api, exceptions
+from cone.confml import model as confmlmodel
+from cone.carbon import persistentjson, model, mapping
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestGetMapper(unittest.TestCase):
+    def test_get_mapper(self):
+        mapper = model.get_mapper('confml')
+        self.assertTrue(isinstance(mapper, mapping.Carbon2confml))
+
+    def test_get_mapper_from_object(self):
+        s = model.CarbonSetting("test")
+        mapper = s._get_mapper('confml')
+        self.assertTrue(isinstance(mapper, mapping.Carbon2confml))
+
+
+class TestCarbon2confml(unittest.TestCase):
+    def test_map_carbon_configuration(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonConfiguration("test")
+        c2 = mapper.configuration(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlConfiguration))
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlConfiguration))
+
+    def test_map_carbon_featurelist(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.FeatureList(name="test")
+        c2 = mapper.configuration(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlConfiguration))
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlConfiguration))
+        
+    def test_map_carbon_configuration_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonConfiguration("test")
+        c1.name = "test.confml"
+        c1.namespace = "com.nokia"
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlConfiguration))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.namespace, "com.nokia")
+        self.assertEquals(c2.path, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_int_setting_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonIntSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlIntSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonBooleanSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlBooleanSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('confml')
+        c1 = model.CarbonSelectionSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, confmlmodel.ConfmlSelectionSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/carbon/tests/unittest_model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,143 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+import datetime
+
+from cone.public import api, exceptions
+from cone.carbon import persistentjson, model
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestConfigurationResource(unittest.TestCase):
+    def test_create(self):
+        c = model.ConfigurationResource(configuration_name='test')
+        self.assertTrue(c)
+        self.assertEquals(c.name, 'test')
+
+    def test_create_from_dict(self):
+        confdict = {'parent_config': 'hessu', 'path': 'Testing', 'version_identifier': '0.1', 'configuration_name': 'Testing'}
+        c = model.ConfigurationResource(**confdict)
+        self.assertTrue(c)
+        self.assertEquals(c.name, 'Testing')
+        self.assertEquals(c.path, 'Testing')
+        self.assertEquals(c.parent_config, 'hessu')
+        self.assertEquals(c.version, '0.1')
+        self.assertEquals(c.get_path(), 'Testing/root.confml')
+
+class TestFeatureListResource(unittest.TestCase):
+    def test_create(self):
+        c = model.FeatureListResource(path='test', list_id=1, list_version_id=1)
+        self.assertTrue(c)
+        self.assertEquals(c.path, 'test')
+        self.assertEquals(c.list_id, 1)
+        self.assertEquals(c.list_version_id, 1)
+
+    def test_create_from_dict(self):
+        fldict = {
+            "list_version_id": 30, 
+            "expanded": True, 
+            "version_identifier": "working", 
+            "is_latest_version": True, 
+            "list_id": 33, 
+            "path": "ESTART", 
+            "version_title": "ESTART (working)", 
+            "can_be_released": True, 
+            "type": "featurelist", 
+            "has_external_relations": False
+        }
+        c = model.FeatureListResource(**fldict)
+        self.assertTrue(c)
+        self.assertEquals(c.list_version_id, 30)
+        self.assertEquals(c.expanded, True)
+        self.assertEquals(c.version_identifier, "working")
+        self.assertEquals(c.is_latest_version, True)
+        self.assertEquals(c.list_id, 33)
+        self.assertEquals(c.path, 'ESTART')
+        self.assertEquals(c.version_title, "ESTART (working)")
+        self.assertEquals(c.can_be_released, True)
+        self.assertEquals(c.type, "featurelist")
+        self.assertEquals(c.has_external_relations, False)
+
+
+class TestCarbonConfiguration(unittest.TestCase):
+    def test_create_carbon_configuration(self):
+        config = model.CarbonConfiguration(path='foo/bar/test.confml', version_identifier='testing')
+        self.assertEquals(config.version_identifier,'testing')
+        self.assertEquals(config.path,'foo/bar/test.confml')
+        self.assertEquals(config.ref,'foo__bar__test_confml')
+        self.assertEquals(config.name,'test')
+
+        config = model.CarbonConfiguration(ref='foo/bar/test.confml')
+        self.assertEquals(config.path,'foo/bar/test.confml')
+        self.assertEquals(config.ref,'foo__bar__test_confml')
+        self.assertEquals(config.name,'test')
+
+    def test_create_carbon_configuration_with_current_week_version(self):
+        config = model.CarbonConfiguration(path='foo/bar/test.confml')
+        dt = datetime.datetime.today()
+        self.assertEquals(config.version_identifier,"%dwk%02d" % dt.isocalendar()[0:2])
+
+class TestResourceList(unittest.TestCase):
+    def test_create_resource_list(self):
+        rl = model.ResourceList()
+        self.assertTrue(rl != None)
+
+    def test_add_resource(self):
+        rl = model.ResourceList()
+        c = model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'Testing', 'version_identifier': '0.1', 'configuration_name': 'Testing'})
+        rl.add_resource(c)
+
+    def test_list_resources(self):
+        rl = model.ResourceList()
+        rl.add_resource(model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'Testing', 'version_identifier': '0.1', 'configuration_name': 'Testing'}))
+        rl.add_resource(model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'Foobar', 'version_identifier': '0.1', 'configuration_name': 'Foobar'}))
+        self.assertEquals(rl.list_resources(),['Testing/root.confml','Foobar/root.confml'])
+
+    def test_iterate_resources(self):
+        rl = model.ResourceList()
+        rl.add_resource(model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'Testing', 'version_identifier': '0.1', 'configuration_name': 'Testing'}))
+        rl.add_resource(model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'Foobar', 'version_identifier': '0.1', 'configuration_name': 'Foobar'}))
+        for res in rl:
+            self.assertTrue(isinstance(res,model.ConfigurationResource))
+
+class TestFeatureList(unittest.TestCase):
+    def test_create(self):
+        c = model.FeatureList(name='test')
+        self.assertTrue(c)
+        self.assertEquals(c.name, 'test')
+        self.assertEquals(c.meta.get('type'), 'featurelist')
+        self.assertEquals(c.path, 'test.confml')
+
+    def test_create_with_path(self):
+        c = model.FeatureList(path='featurelists/test.confml')
+        self.assertTrue(c)
+        self.assertEquals(c.name, '')
+        self.assertEquals(c.meta.get('type'), 'featurelist')
+        self.assertEquals(c.path, 'featurelists/test.confml')
+        self.assertEquals(c.version_identifier, 'WORKING')
+
+class TestFeature(unittest.TestCase):
+    def test_create(self):
+        c = model.CarbonFeature(ref='test')
+        self.assertTrue(c)
+        self.assertEquals(c.name, 'test')
+        self.assertEquals(c.ref, 'test')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import sys
+
+__all__ = ["implml"]
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/confmltree.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+try:
+    from elementtree.ElementTree import *
+except ImportError:
+    from xml.etree.ElementTree import *
+
+
+class ElementTreeNs(ElementTree):
+    """ 
+    A class inherited from elementtree.ElementTree that can write
+    xml elements with qualified names. The xml namespaces that are defined 
+    to the self.namespases are written out to the root element of the given
+    root element.
+    
+    Example:
+    
+    elem = ElementTreeNs.Element('{http://www.test.com}test') 
+    etreens = ElementTreeNs(elem, None, {'foo' : 'http://www.test.com'})
+    outf = open('test.xml','w')
+    ElementTreeNs.write(outf)
+    
+    content of test.xml would be
+    <foo:test xmlns:foo="http://www.test.com"/>
+    """
+    def __init__(self, element=None, file=None, namespaces={}):
+        ElementTree.__init__(self, element, file)
+        self.namespaces = namespaces
+
+    def write(self, file, encoding="us-ascii"):
+        """
+        Writes the element tree to a file, as XML with the existing namespaces
+        
+        @param file A file name, or a file object opened for writing.
+        @param encoding Optional output encoding (default is US-ASCII).
+        """
+        assert self._root is not None
+        if not hasattr(file, "write"):
+            file = open(file, "wb")
+        if not encoding:
+            encoding = "us-ascii"
+        elif encoding != "utf-8" and encoding != "us-ascii":
+            file.write("<?xml version='1.0' encoding='%s'?>\n" % encoding)
+        # set the namespaces for the root element
+        for ns in self.namespaces:
+            self._root.set('xmlns:%s' % self.namespaces[ns], ns)
+        self._write(file, self._root, encoding, self.namespaces)
+
+
+def tostring(element, namespaces, encoding=None):
+    """
+    """
+    class dummy:
+        pass
+    data = []
+    file = dummy()
+    file.write = data.append
+    ElementTreeNs(element, None, namespaces).write(file, encoding)
+    return "".join(data)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/implml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys
+import os
+
+from cone.public import plugin, utils, exceptions
+
+debug = 0
+
+class Implml(plugin.ImplBase):
+    """
+    Base class for any  implementation plugin. 
+    """
+    def __init__(self,ref,configuration,output='output'):
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.set_output_root(output)
+        pass
+
+    def list_output_files(self):
+        return utils.list_files(self.output)
+
+
+    def has_ref(self, refs):
+        """
+        Return True if the implementation uses the given ref as input value. Otherwise return False.
+        """
+        raise exceptions.NotSupportedException()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,86 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+
+"""
+Methods for Mapping Carbon model to other data model objects 
+"""
+from cone.public import api, exceptions, container, utils
+from cone.public.mapping import BaseMapper
+from cone.carbon import model as carbonmodel
+
+""" Carbon to confml model mapping is done in Carbon2confml """
+from cone.confml import model 
+
+class Confml2carbon(object):
+    """
+    Carbon2confml class maps Carbon model object to confml model objects.  
+    """
+    def __init__(self):
+        self.MAPPING_TABLE = {model.ConfmlConfiguration: self.configuration,
+                              model.ConfmlFeature: self.setting,
+                              model.ConfmlSetting: self.setting,
+                              model.ConfmlIntSetting: self.setting,
+                              model.ConfmlBooleanSetting: self.setting,
+                              model.ConfmlSelectionSetting: self.setting}
+        pass
+
+    def map_object(self, object):
+        """
+        Return a confml model object from Carbon object
+        """
+        try:
+            return self.MAPPING_TABLE[object.__class__](object)
+        except KeyError:
+            return object
+
+    def configuration(self, object):
+        """
+        Map a CarbonConfiguration object to a ConfmlConfiguration
+        """
+        mapdict = object._dict()
+        if object.meta and object.meta.get('type') == 'featurelist':
+            mapobj = object._clone(class_instance=carbonmodel.FeatureList, recursion=True)
+        else:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonConfiguration, recursion=True)
+        return mapobj
+
+    def setting(self, object):
+        """
+        Map a CarbonSetting object to a ConfmlSetting
+        """
+        mapdict = object._dict()
+        if object.__class__ == model.ConfmlFeature:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonFeature, recursion=True)
+        elif object.__class__ == model.ConfmlIntSetting:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonIntSetting, recursion=True)
+        elif object.__class__ == model.ConfmlBooleanSetting:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonBooleanSetting, recursion=True)
+        elif object.__class__ == model.ConfmlSelectionSetting:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonSelectionSetting, recursion=True)
+        elif object.__class__ == model.ConfmlSetting:
+            mapobj = object._clone(class_instance=carbonmodel.CarbonSetting, recursion=True)
+        else:
+            raise exceptions.IncorrectClassError('Cannot find a mapping object for this class %s!' % object.__class__)
+        return mapobj
+
+MAPPERS =  \
+{ 'carbon' : Confml2carbon,
+  'confml' : BaseMapper
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,982 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Base class for Confml elements.
+Attributes:
+ All Confml element attributes become attributes of this instance.
+"""
+import types
+from cone.public import api, exceptions, container, utils
+
+class ConfmlElement(api.Base):
+    def _get_mapper(self,modelname):
+        """
+        Return a instance of appropriate mapper for given model.
+        """
+        mapmodule = __import__('cone.confml.mapping')
+        return mapmodule.confml.mapping.MAPPERS[modelname]()
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+
+    def set_desc(self,value): 
+        self._add(ConfmlDescription(value))
+
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+class ConfmlConfiguration(ConfmlElement, api.Configuration):
+    """
+    Confml configuration class. 
+    """
+    def __init__(self,ref="", **kwargs):
+        super(ConfmlConfiguration,self).__init__(ref, **kwargs)
+        if kwargs.get('meta'):
+            self.meta = kwargs.get('meta')
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+
+    def get_desc(self): 
+        """
+        @return: The description of the Configuration.
+        """
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+
+    def set_desc(self,value): 
+        self._add(ConfmlDescription(value))
+
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+    def get_meta(self): 
+        """
+        @return: The description of the Configuration.
+        """
+        try:
+            meta = getattr(self,ConfmlMeta.refname)
+            return meta
+        except AttributeError:
+            return None
+
+    def set_meta(self,value): 
+        self._add(ConfmlMeta(value))
+
+    def del_meta(self): 
+        try:
+            self._remove(ConfmlMeta.refname)
+        except exceptions.NotFound:
+            pass
+
+    """ The meta element as a property """
+    meta = property(get_meta,set_meta,del_meta)
+
+
+class ConfmlGroup(ConfmlElement, api.Group):
+    """
+    Confml view.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(ConfmlGroup,self).__init__(ref,**kwargs)
+        if kwargs.get('icon'):
+            self.icon = kwargs.get('icon')
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+    def get_icon(self): 
+        try:
+            icon = getattr(self,ConfmlIcon.refname)
+            return icon.href
+        except AttributeError:
+            return None
+    def set_icon(self,value): self._add(ConfmlIcon(value))
+    def del_icon(self): 
+        try:
+            self._remove(ConfmlIcon.refname)
+        except exceptions.NotFound:
+            pass
+    """ The icon as a property """
+    icon = property(get_icon,set_icon,del_icon)
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+    def set_desc(self,value): self._add(ConfmlDescription(value))
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+
+class ConfmlView(api.View):
+    """
+    Confml view.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(ConfmlView,self).__init__(ref,**kwargs)
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+
+
+    def get_desc(self): 
+        try:
+            desc = getattr(self,ConfmlDescription.refname)
+            return desc.text
+        except AttributeError:
+            return None
+    def set_desc(self,value): self._add(ConfmlDescription(value))
+    def del_desc(self): 
+        try:
+            self._remove(ConfmlDescription.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    desc = property(get_desc,set_desc,del_desc)
+
+class ConfmlFeature(ConfmlElement, api.Feature):
+    pass
+
+class ConfmlSetting(ConfmlElement, api.Feature):
+    """
+    Confml setting class. Attribute 'options' contains options of this setting.
+    """
+    supported_types = ['int',
+                       'string',
+                       'boolean',
+                       'selection']
+    def __init__(self, ref,**kwargs):
+        super(ConfmlSetting,self).__init__(ref,**kwargs)
+        self.type = kwargs.get('type',None)
+        if kwargs.get('desc'):
+            self.desc = kwargs.get('desc')
+        if kwargs.get('minOccurs'):
+            self.minOccurs = kwargs.get('minOccurs')
+        if kwargs.get('maxOccurs'):
+            self.maxOccurs = kwargs.get('maxOccurs')
+        if kwargs.get('maxLength'):
+            self.maxLength = kwargs.get('maxLength')
+        if kwargs.get('minLength'):
+            self.minLength = kwargs.get('minLength')
+        if kwargs.get('mapKey'):
+            self.mapKey = kwargs.get('mapKey')
+        if kwargs.get('mapValue'):
+            self.mapValue = kwargs.get('mapValue')
+        
+        self.readOnly = kwargs.get('readOnly',None)
+        self.constraint = kwargs.get('constraint',None)
+        self.required = kwargs.get('required',None)
+        self.relevant = kwargs.get('relevant',None)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRe('.*')
+
+    def add_property(self, **kwargs):
+        """
+        @param name=str: property name 
+        @param value=str: property value
+        @param unit=str: property unit, e.g. kB
+        """
+        self._add(ConfmlProperty(**kwargs), container.APPEND)
+
+    def get_property(self, name):
+        """
+        @param name: The name of the property
+        """
+        for property in utils.get_list(self._get(ConfmlProperty.refname)):
+            if property.name == name:
+                return property
+        raise exceptions.NotFound("ConfmlProperty with name %s not found!" % name)
+
+    def remove_property(self, name):
+        """
+        remove a given option from this feature by name. 
+        @param name: 
+        """
+        for property in self._get(ConfmlProperty.refname):
+            if property.name == name:
+                return self._remove(property.get_fullref())
+        raise exceptions.NotFound("ConfmlProperty with name %s not found!" % name)
+
+    def list_properties(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [obj.name for obj in utils.get_list(self._get(ConfmlProperty.refname))]
+
+    def get_maxlength(self): 
+        try:
+            return getattr(self,ConfmlMaxLength.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxlength(self,value): 
+        self._add(ConfmlMaxLength(value))
+
+    def del_maxlength(self): 
+        try:
+            self._remove(ConfmlMaxLength.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    maxLength = property(get_maxlength,set_maxlength,del_maxlength)
+
+    def get_minlength(self): 
+        try:
+            return getattr(self,ConfmlMinLength.refname).value
+        except AttributeError:
+            return None
+
+    def set_minlength(self,value): 
+        self._add(ConfmlMinLength(value))
+
+    def del_minlength(self): 
+        try:
+            self._remove(ConfmlMinLength.refname)
+        except exceptions.NotFound:
+            pass
+    """ The description as a property """
+    minLength = property(get_minlength,set_minlength,del_minlength)
+
+    def get_minInclusive(self): 
+        try:
+            return getattr(self,ConfmlMinInclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_minInclusive(self,value): 
+        self._add(ConfmlMinInclusive(value))
+
+    def del_minInclusive(self): 
+        try:
+            self._remove(ConfmlMinInclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minInclusive as a property """
+    minInclusive = property(get_minInclusive,set_minInclusive,del_minInclusive)
+
+    def get_maxInclusive(self): 
+        try:
+            return getattr(self,ConfmlMaxInclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxInclusive(self,value): 
+        self._add(ConfmlMaxInclusive(value))
+
+    def del_maxInclusive(self): 
+        try:
+            self._remove(ConfmlMaxInclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minInclusive as a property """
+    maxInclusive = property(get_maxInclusive,set_maxInclusive,del_maxInclusive)
+
+    def get_minExclusive(self): 
+        try:
+            return getattr(self,ConfmlMinExclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_minExclusive(self,value): 
+        self._add(ConfmlMinExclusive(value))
+
+    def del_minExclusive(self): 
+        try:
+            self._remove(ConfmlMinExclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The minExclusive as a property """
+    minExclusive = property(get_minExclusive,set_minExclusive,del_minExclusive)
+
+    def get_maxExclusive(self): 
+        try:
+            return getattr(self,ConfmlMaxExclusive.refname).value
+        except AttributeError:
+            return None
+
+    def set_maxExclusive(self,value): 
+        self._add(ConfmlMaxExclusive(value))
+
+    def del_maxExclusive(self): 
+        try:
+            self._remove(ConfmlMaxExclusive.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The maxExclusive as a property """
+    maxExclusive = property(get_maxExclusive,set_maxExclusive,del_maxExclusive)
+
+    def get_pattern(self): 
+        try:
+            return getattr(self,ConfmlPattern.refname).value
+        except AttributeError:
+            return None
+
+    def set_pattern(self,value): 
+        self._add(ConfmlPattern(value))
+
+    def del_pattern(self): 
+        try:
+            self._remove(ConfmlPattern.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The pattern as a property """
+    pattern = property(get_pattern,set_pattern,del_pattern)
+
+    def get_totalDigits(self): 
+        try:
+            return getattr(self,ConfmlTotalDigits.refname).value
+        except AttributeError:
+            return None
+
+    def set_totalDigits(self,value): 
+        self._add(ConfmlTotalDigits(value))
+
+    def del_totalDigits(self): 
+        try:
+            self._remove(ConfmlTotalDigits.refname)
+        except exceptions.NotFound:
+            pass     
+    """ The totalDigits as a property """
+    totalDigits = property(get_totalDigits,set_totalDigits,del_totalDigits)
+
+    @property
+    def options(self):
+        optdict = {}
+        for opt in self._objects(type=api.Option):
+            optdict[opt.value] = opt
+        return  optdict
+
+    @property
+    def properties(self):
+        dict = {}
+        for property in utils.get_list(self._get(ConfmlProperty.refname)):
+            dict[property.name] = property
+        return  dict
+
+    def get_rfs(self,):
+        return super(ConfmlSetting,self).get_value('rfs')
+
+    def set_rfs(self, value):
+        super(ConfmlSetting,self).set_value('rfs',value)
+
+    def del_rfs(self):
+        super(ConfmlSetting,self).del_value('rfs')
+
+    rfs = property(get_rfs,set_rfs,del_rfs)
+
+    def get_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in get operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        if not attr or attr == 'data':
+            return self.get_data_cast(value)
+        elif attr == 'rfs':
+            return self.get_rfs_cast(value)
+        else:
+            return value
+    
+    def set_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in the set operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        if not attr or attr == 'data':
+            return self.set_data_cast(value)
+        elif attr == 'rfs':
+            return self.set_rfs_cast(value)
+        else:
+            return value
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the data type casting in get operation  
+        @param value: the value to cast 
+        """
+        return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the data type casting in the set operation  
+        @param value: the value to cast 
+        """
+        return value
+
+    def get_rfs_cast(self, value):
+        """
+        A function to perform the rfs type casting in get operation  
+        @param value: the value to cast 
+        """
+        if value == 'true':
+            return True
+        elif value == 'false':
+            return False
+        else: # otherwise this is an invalid rfs value. Should it report an error?
+            return value
+    
+    def set_rfs_cast(self, value):
+        """
+        A function to perform the rfs type casting in the set operation  
+        @param value: the value to cast 
+        """
+        if value:
+            return 'true'
+        else: 
+            return 'false'
+
+
+class ConfmlStringSetting(ConfmlSetting):
+    """
+    Confml setting class for integer type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'string'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+
+class ConfmlIntSetting(ConfmlSetting):
+    """
+    Confml setting class for integer type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'int'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRange(0,sys.maxint)
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            try:
+                return int(value)
+            except ValueError:
+                return int(value, 16)
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        return str(int(value))
+
+
+class ConfmlRealSetting(ConfmlSetting):
+    """
+    Confml setting class for real type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'real'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueRange(0,float(sys.maxint))
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            return float(value)
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        return str(float(value))
+
+
+
+
+class ConfmlBooleanSetting(ConfmlSetting):
+    """
+    Confml setting class for boolean type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'boolean'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.ValueSet([True,False])
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        if value:
+            if value in ('true', '1'):
+                return True
+            else:
+                return False
+        else:
+            return value
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        if isinstance(value, basestring):
+            if value in ('false', '0'):
+                return 'false'
+            elif value in ('true', '1'):
+                return 'true'
+        
+        return str(bool(value)).lower()
+
+
+class ConfmlSelectionSetting(ConfmlSetting):
+    """
+    Confml setting class for boolean type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'selection'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+    
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.Feature.get_valueset(self)
+
+class ConfmlMultiSelectionSetting(ConfmlSetting):
+    """
+    Confml setting class for multiSelection type.
+    """
+
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'multiSelection'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+        
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        return api.Feature.get_valueset(self)
+
+    def get_data_cast(self, value):
+        """
+        A function to perform the value type casting in get operation  
+        """
+        try:
+            if not isinstance(value, types.ListType):
+                values = value.split('" "')
+                for i in range(len(values)):
+                    if values[i].startswith('"'):
+                        values[i] = values[i][1:] 
+                    if values[i].endswith('"'):
+                        values[i] = values[i][:-1]
+                return values
+            return value
+        except AttributeError:
+            return None
+    
+    def set_data_cast(self, value):
+        """
+        A function to perform the value type casting in the set operation  
+        """
+        
+        if isinstance(value, list):
+            value = " ".join(['"%s"' % elem for elem in value])
+        return value
+    
+    def set_value(self, value):
+        if not isinstance(value, types.ListType):
+            raise ValueError("Only list types are allowed.")
+        self.value = value
+
+class ConfmlDateSetting(ConfmlSetting):
+    """
+    Confml setting class for date type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'date'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlTimeSetting(ConfmlSetting):
+    """
+    Confml setting class for time type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'time'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlDateTimeSetting(ConfmlSetting):
+    """
+    Confml setting class for date-time type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'dateTime'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlDurationSetting(ConfmlSetting):
+    """
+    Confml setting class for date type.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'duration'
+        ConfmlSetting.__init__(self,ref,**kwargs)
+
+class ConfmlSequenceSetting(api.FeatureSequence,ConfmlSetting):
+    """
+    Confml setting class. Attribute 'options' contains options of this setting.
+    """
+    def __init__(self, ref,**kwargs):
+        ConfmlSetting.__init__(self,ref,**kwargs)
+        api.FeatureSequence.__init__(self,ref,**kwargs)
+
+class ConfmlFileSetting(ConfmlSetting):
+    """
+    Confml file setting class.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'file'
+        ConfmlSetting.__init__(self, ref, **kwargs)
+        """
+        The file element always includes localPath and targetPath child elements.
+        """
+        self.add_feature(ConfmlLocalPath())
+        self.add_feature(ConfmlTargetPath())
+
+class ConfmlFolderSetting(ConfmlSetting):
+    """
+    Confml folder setting class.
+    """
+    def __init__(self, ref,**kwargs):
+        kwargs['type'] = 'folder'
+        ConfmlSetting.__init__(self, ref, **kwargs)
+        """
+        The folder element always includes localPath and targetPath child elements.
+        """
+        self.add_feature(ConfmlLocalPath())
+        self.add_feature(ConfmlTargetPath())
+
+class ConfmlLocalPath(ConfmlElement, api.Feature):
+    """
+    Confml file class. Attribute setting.
+    """
+    def __init__(self, ref='localPath', **kwargs):
+        kwargs['type'] = 'string'
+        ConfmlElement.__init__(self, **kwargs)
+        api.Feature.__init__(self, ref, **kwargs)
+        self.readOnly = kwargs.get('readOnly', None)
+
+
+class ConfmlTargetPath(ConfmlElement, api.Feature):
+    """
+    Confml file class. Attribute setting.
+    """
+    def __init__(self, ref='targetPath', **kwargs):
+        kwargs['type'] = 'string'
+        ConfmlElement.__init__(self, **kwargs)
+        api.Feature.__init__(self, ref, **kwargs)
+        self.readOnly = kwargs.get('readOnly', None)
+
+
+class ConfmlMeta(api.Base):
+    """
+    Confml meta element
+    """
+    refname = "_meta"
+    def __init__(self, array=None, **kwargs):
+        super(ConfmlMeta,self).__init__(self.refname)
+        self.array  = []
+        if array:            
+            self.array += array
+
+    def __getitem__(self, key):
+        return self.array[key]
+ 
+    def __delitem__(self, key):
+        del self.array[key]
+
+    def __setitem__(self, key, value):
+        self.array[key] = value
+
+    def __str__(self):
+        tempstr = "ConfmlMeta object\n"
+        counter = 0
+        for item in self.array:
+            tempstr += "\t%d: %s\n" % (counter, item.__str__())
+            counter += 1
+        return tempstr 
+
+    def __cmp__(self, other):
+        try:
+            for item in self.array:
+                if item != other.array[self.array.index(item)]:
+                    return 1
+        except:
+            return 1
+        return 0
+
+    def append(self, value):
+        self.array.append(value)
+
+    def add(self, tag, value, ns=None, attributes=None):
+        self.array.append(ConfmlMetaProperty(tag, value, ns, attrs=attributes))
+
+    def get(self, tag, default=None):
+        """
+        Try to find the element by its tag in the meta elem array.
+        @param tag: the tag that is searched,
+        @param default: return the default value if the element is not found. 
+        @return: the value of the ConfmlMetaProperty object if it is found. Default value 
+        if element with tag is not found.
+        """
+        for item in self.array:
+            if item.tag == tag:
+                return item.value
+        return default
+
+    def replace(self, index, tag, value, ns=None, dict=None):
+        self.array[index] = ConfmlMetaProperty(tag, value, ns, attrs=dict)
+
+    def clear(self, value):
+        self.array = []
+
+    def clone(self):
+        newMeta = ConfmlMeta()
+        for item in self.array:
+            newProp = ConfmlMetaProperty(item.tag, item.value, item.ns, attrs = item.attrs)
+            newMeta.append(newProp)
+        return newMeta
+
+    def find_by_tag(self, value):
+        for item in self.array:
+            if item.tag == value:
+                return self.array.index(item)
+        return -1
+
+    def find_by_attribute(self, name, value):
+        for item in self.array:
+            if item.attrs.has_key(name) and item.attrs[name] == value: 
+                return self.array.index(item)
+        return -1
+
+    def get_property_by_tag(self, tag):
+        """
+        Try to find the element by its tag in the meta elem array.
+        @param tag: the tag that is searched
+        @return: the ConfmlMetaProperty object if it is found. None if element with tag is not found.
+        """
+        for item in self.array:
+            if item.tag == tag:
+                return item
+        return None
+
+
+class ConfmlDescription(api.Base):
+    """
+    Confml description element
+    """
+    refname = "_desc"
+    def __init__(self, text=None, **kwargs):
+        super(ConfmlDescription,self).__init__(self.refname)
+        self.text = text or ''
+
+
+class ConfmlIcon(api.Base):
+    """
+    Confml icon element
+    """
+    refname = "_icon"
+    def __init__(self, href='', **kwargs):
+        super(ConfmlIcon,self).__init__(self.refname)
+        self.href = href
+
+
+class ConfmlProperty(api.Base):
+    """
+    Confml meta element
+    """
+    refname = "_property"
+    def __init__(self, **kwargs):
+        """
+        @param name=str: name string 
+        @param value=str: value for the property, string 
+        @param unit=str: unit of the property
+        """
+        super(ConfmlProperty,self).__init__(self.refname)
+        self.name = kwargs.get('name',None)
+        self.value = kwargs.get('value',None)
+        self.unit = kwargs.get('unit',None)
+
+
+class ConfmlMetaProperty(api.Base):
+    """
+    Confml meta property element
+    """
+    refname = "_metaproperty"
+    def __init__(self, tag, value = None, ns = None, **kwargs):
+        """
+        """
+        super(ConfmlMetaProperty,self).__init__(self.refname)
+        self.tag = tag
+        self.value = value
+        self.ns = ns
+        if kwargs.has_key("attrs") and kwargs["attrs"] != None:
+            self.attrs = dict(kwargs["attrs"])
+        else:
+            self.attrs = {}
+
+    def __cmp__(self, other):
+        try:
+            if self.tag != other.tag or self.value != other.value\
+                or self.ns != other.ns or self.attrs != other.attrs:
+                return 1
+        except:
+            return 1
+        return 0
+
+    def __str__(self):
+        return "Tag: %s Value: %s Namespace: %s Attributes: % s" % (self.tag, self.value, self.ns, repr(self.attrs))         
+        
+            
+
+class ConfmlLength(api.Base):
+    """
+    Confml length element
+    """
+    refname = "_length"
+    def __init__(self, value, **kwargs):
+        super(ConfmlLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxLength(api.Base):
+    """
+    Confml max element
+    """
+    refname = "_maxLength"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinLength(api.Base):
+    """
+    Confml min element
+    """
+    refname = "_minLength"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinLength,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinInclusive(api.Base):
+    """
+    Confml minInclusive element
+    """
+    refname = "_minInclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinInclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxInclusive(api.Base):
+    """
+    Confml minInclusive element
+    """
+    refname = "_maxInclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxInclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMinExclusive(api.Base):
+    """
+    Confml minExclusive element
+    """
+    refname = "_minExclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMinExclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlMaxExclusive(api.Base):
+    """
+    Confml maxExclusive element
+    """
+    refname = "_maxExclusive"
+    def __init__(self, value, **kwargs):
+        super(ConfmlMaxExclusive,self).__init__(self.refname)
+        self.value = value
+
+class ConfmlPattern(api.Base):
+    """
+    Confml pattern element
+    """
+    refname = "_pattern"
+    def __init__(self, value, **kwargs):
+        super(ConfmlPattern,self).__init__(self.refname)
+        self.value = value   
+
+class ConfmlTotalDigits(api.Base):
+    """
+    Confml totalDigits element
+    """
+    refname = "_totalDigits"
+    def __init__(self, value, **kwargs):
+        super(ConfmlTotalDigits,self).__init__(self.refname)
+        self.value = value
+
+def get_mapper(modelname):
+    """
+    Return a instance of appropriate mapper for given model.
+    """
+    mapmodule = __import__('cone.confml.mapping')
+    return mapmodule.confml.mapping.MAPPERS[modelname]()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/persistentconfml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1164 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import re
+import logging
+import xml.parsers.expat
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+""" cone specific imports """
+from cone.public import persistence, exceptions, api, utils, container
+from cone.confml import model
+
+CONFIGURATION_NAMESPACES = ["http://www.s60.com/xml/confml/2","http://www.s60.com/xml/confml/1"]
+INCLUDE_NAMESPACES       = ["http://www.w3.org/2001/XInclude","http://www.w3.org/2001/xinclude"]
+XLINK_NAMESPACES         = ["http://www.w3.org/1999/xlink"]
+SCHEMA_NAMESPACES        = ["http://www.w3.org/2001/XMLSchema"]
+CV_NAMESPACE             = {"http://www.nokia.com/xml/cpf-id/1": "cv"}
+MODEL                    = model
+
+def dumps(obj, indent=True):
+    etree = ConfmlWriter().dumps(obj)
+    if indent:
+        persistence.indent(etree)
+    return ElementTree.tostring(etree)
+
+def loads(xml):
+    return ConfmlReader().loads(xml)
+
+
+
+class ConfmlWriter(persistence.ConeWriter):
+    """
+    """ 
+    def dumps(self, obj):
+        """
+        @param obj: The object 
+        """
+        """ Make sure that the object is mapped to an object in this model """
+        mobj = obj._get_mapper('confml').map_object(obj)
+        writer = get_writer_for_class(mobj.__class__.__name__)
+        return writer.dumps(obj)
+
+class ConfmlReader(persistence.ConeReader):
+    """
+    """ 
+    def loads(self, xmlstr):
+        """
+        @param xml: The xml which to read. reads only the first object. 
+        """
+        reader = get_reader_for_elem("configuration")
+        etree = utils.etree.fromstring(xmlstr)
+        return reader.loads(etree)
+
+
+class ConfigurationWriter(ConfmlWriter):
+    """
+    Writes a single Configuration project confml file.
+    """ 
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="Configuration" or \
+           classname=="ConfmlConfiguration" :
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        self.configuration_namespace = CONFIGURATION_NAMESPACES[0]
+        self.include_namespace       = INCLUDE_NAMESPACES[0]
+        self.xlink_namespace         = XLINK_NAMESPACES[0]
+        self.schema_namespace        = SCHEMA_NAMESPACES[0]
+    
+    def dumps(self,obj,indent=True):
+        elem = ElementTree.Element("configuration")
+        if self.configuration_namespace:
+            elem.set("xmlns",self.configuration_namespace)
+        if self.include_namespace:
+            elem.set("xmlns:xi",self.include_namespace)
+        if self.include_namespace:
+            elem.set("xmlns:xlink",self.xlink_namespace)
+        if self.schema_namespace:
+            elem.set("xmlns:xs",self.schema_namespace)
+        elem.set("name",obj.get_name()) 
+        for child in obj._objects():
+            """ Make sure that the object is mapped to an object in this model """
+            mobj = child._get_mapper('confml').map_object(child)
+            writer = get_writer_for_class(mobj.__class__.__name__)
+            childelem = writer.dumps(child)
+            elem.append(childelem)
+        return elem
+ 
+
+class ConfigurationReader(ConfmlReader):
+    """
+    Parses a single CPF configuration project root confml file. Parses the XInclude statements to 
+    find out the layers inside the project
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given elem name
+        """
+        if elemname=="configuration":
+            return True
+        else:
+            return False
+
+    def __init__(self):
+        self.configuration_namespaces  = CONFIGURATION_NAMESPACES
+        self.include_namespaces        = INCLUDE_NAMESPACES
+        self.schema_namespaces         = SCHEMA_NAMESPACES
+
+    def loads(self, etree):
+        configuration = model.ConfmlConfiguration("")
+        configuration.set_name(etree.get("name") or 'unknown') 
+        configuration.set_ref(etree.get("name") or 'unknown')
+        for elem in etree.getchildren():
+            # At the moment we ignore the namespace of elements
+            (namespace,elemname) = get_elemname(elem.tag)
+            try:
+                reader = get_reader_for_elem(elemname)
+                obj = reader.loads(elem)
+                if obj:
+                    configuration.add(obj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return configuration
+
+
+class MetaWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlMeta":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        
+        elem = ElementTree.Element("meta")
+        for metaproperty in obj:
+            prefix = CV_NAMESPACE.get(metaproperty.ns, "")
+            if prefix != "":
+                #Including namespace to metadata element as well            
+                elem.set(("xmlns:%s" % prefix), metaproperty.ns)
+                childelem = ElementTree.Element(prefix + ":" + metaproperty.tag)
+            else:
+                childelem = ElementTree.Element(metaproperty.tag)
+            if metaproperty.value != None:
+                childelem.text = metaproperty.value
+            for attr in metaproperty.attrs:
+                childelem.set(attr, metaproperty.attrs[attr])
+            elem.append(childelem)
+        return elem
+
+
+class MetaReader(ConfmlReader):
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="meta":
+            return True
+        else:
+            return False
+
+    def loads(self,etree):
+        metaelem = model.ConfmlMeta()
+        for elem in etree.getchildren():            
+            (namespace,elemname) = get_elemname(elem.tag)
+            attributes = {}
+            for key in elem.keys():
+                attributes[key] = elem.get(key)
+            
+            metaprop = model.ConfmlMetaProperty(elemname, elem.text, namespace, attrs=attributes)
+            metaelem.append(metaprop)
+        return metaelem
+
+
+class DescWriter(ConfmlWriter):
+    """
+    """ 
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlDescription":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = ElementTree.Element('desc')
+        elem.text = obj.text
+        return elem
+
+
+class DescReader(ConfmlReader):
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlReader supports reading
+        of the given elem name
+        """
+        if elemname=="desc":
+            return True
+        else:
+            return False
+
+    def loads(self,elem):
+        desc = model.ConfmlDescription(elem.text)
+        return desc
+
+class ConfigurationProxyWriter(ConfmlWriter):
+    """
+    """ 
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfigurationProxy":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = self.to_include(obj.path)
+        return elem
+
+    def to_include(self,include):
+        elem = ElementTree.Element("xi:include",{"href":include})
+        return elem 
+
+class ConfigurationProxyReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="include":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        
+        return api.ConfigurationProxy(self.parse_include(elem))
+
+    def parse_include(self,include):
+        #print "Found include %s" % include.get('href').replace('#/','')
+        return include.get('href').replace('#/','')
+
+
+class FeatureWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlFeature" or \
+           classname=="Feature":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = ElementTree.Element('feature', 
+                                   {'ref' : obj.get_ref(),
+                                    'name' : obj.get_name()})
+        if obj.get_type():
+            elem.set('type', obj.get_type())
+        for child in obj._objects():
+            """ Make sure that the object is mapped to an object in this model """
+            mobj = child._get_mapper('confml').map_object(child)
+            writer = get_writer_for_class(mobj.__class__.__name__)
+            childelem = writer.dumps(child)
+            if childelem != None:
+                elem.append(childelem)
+        return elem
+
+
+class FeatureReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="feature":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        type = elem.get('type')
+        if type == 'sequence':
+            feature = api.FeatureSequence(elem.get('ref'))
+        else:
+            feature = model.ConfmlFeature(elem.get('ref'))
+        if elem.get('name'):
+            feature.set_name(elem.get('name'))
+        feature.set_type(type)
+        for elem in elem.getchildren():
+            # At the moment we ignore the namespace of elements
+            (namespace,elemname) = get_elemname(elem.tag)
+            try:
+                reader = get_reader_for_elem(elemname)
+                obj = reader.loads(elem)
+                feature.add(obj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return feature
+
+
+class OptionWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="Option":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Option object 
+        """
+        
+        objdict = {}
+        if obj.get_name() is not None: objdict['name'] = obj.get_name()
+        if obj.get_value() is not None: objdict['value'] = obj.get_value()
+        if obj.map is not None: objdict['map'] = obj.map
+        if obj.relevant is not None: objdict['relevant'] = obj.relevant
+        elem = ElementTree.Element('option', objdict)
+        
+        return elem
+
+
+class OptionReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="option":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        name = elem.get('name')
+        value = elem.get('value')
+        optmap = elem.get('map')
+        if value == None and optmap == None:
+            logging.getLogger('cone').warning("Encountered option with no value")
+            option = None
+        else:
+            option = api.Option(name, value, map=optmap, relevant=elem.get('relevant'))
+        return option
+
+
+class IconWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlIcon":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Option object 
+        """
+        elem = ElementTree.Element('icon', 
+                                   {'xlink:href' : obj.href})
+        return elem
+
+
+class IconReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="icon":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        href = elem.get('{%s}href' % XLINK_NAMESPACES[0])
+        obj = model.ConfmlIcon(href)
+        return obj
+
+
+class PropertyWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlProperty":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Option object 
+        """
+        elem = ElementTree.Element('property')
+        if obj.name != None:
+            elem.set('name', obj.name)
+        if obj.value != None:
+            elem.set('value', obj.value)
+        if obj.unit != None:
+            elem.set('unit', obj.unit)
+        return elem
+
+
+class PropertyReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="property":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        option = model.ConfmlProperty(name=elem.get('name'),value=elem.get('value'), unit=elem.get('unit'))
+        return option
+
+
+class XmlSchemaFacetWriter(ConfmlWriter):
+    MAPPING = {'ConfmlLength'       : 'xs:length',
+               'ConfmlMinLength'    : 'xs:minLength',
+               'ConfmlMaxLength'    : 'xs:maxLength',
+               'ConfmlMinInclusive' : 'xs:minInclusive',
+               'ConfmlMaxInclusive' : 'xs:maxInclusive',
+               'ConfmlMinExclusive' : 'xs:minExclusive',
+               'ConfmlMaxExclusive' : 'xs:maxExclusive',
+               'ConfmlPattern'      : 'xs:pattern',
+               'ConfmlTotalDigits'  : 'xs:totalDigits'}
+    
+    @classmethod
+    def supported_class(cls, classname):
+        return classname in cls.MAPPING
+    
+    def dumps(self, obj):
+        """
+        @param obj: The facet object 
+        """
+        
+        classname = obj.__class__.__name__
+        elem = ElementTree.Element(self.MAPPING[classname])
+        if obj.value != None:
+            elem.set('value', str(obj.value))
+        return elem
+
+class XmlSchemaFacetReader(ConfmlReader):
+    MAPPING = {'length'       : model.ConfmlLength,
+               'minLength'    : model.ConfmlMinLength,
+               'maxLength'    : model.ConfmlMaxLength,
+               'minInclusive' : model.ConfmlMinInclusive,
+               'maxInclusive' : model.ConfmlMaxInclusive,
+               'minExclusive' : model.ConfmlMinExclusive,
+               'maxExclusive' : model.ConfmlMaxExclusive,
+               'pattern'      : model.ConfmlPattern,
+               'totalDigits'  : model.ConfmlTotalDigits}
+    
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        return elemname in cls.MAPPING
+    
+    def loads(self, elem):
+        """
+        @param elem: The XML schema facet element
+        """
+        elem_name = utils.xml.split_tag_namespace(elem.tag)[1]
+        facet_class = self.MAPPING[elem_name]
+        obj = facet_class(elem.get('value'))
+        return obj
+
+
+class DataWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="Data":
+            return True
+        if classname=="DataContainer":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Data object 
+        """
+        # Create a data hierarchy of the 
+        elem = ElementTree.Element(obj.get_ref())
+        if hasattr(obj,'get_value') and obj.get_value() and not obj.get_map():
+            elem.text = obj.get_value()
+        elif hasattr(obj,'get_map') and obj.get_map():
+            elem.set('map', obj.get_map())
+        if hasattr(obj,'template') and obj.template == True:
+            elem.set('template','true')
+        if hasattr(obj,'policy') and obj.policy != '':
+            elem.set('extensionPolicy',obj.policy)
+        for child in obj._objects():
+            writer = DataWriter()
+            childelem = writer.dumps(child)
+            if childelem != None:
+                elem.append(childelem)
+        return elem
+
+
+class DataReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="data":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        
+        (namespace,elemname) = get_elemname(elem.tag)
+        obj = api.DataContainer(elemname, container=True)
+        for elem in elem.getchildren():
+            try:
+                reader = ElemReader(attr='data')
+                childobj = reader.loads(elem)
+                obj.add(childobj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return obj
+
+
+class ViewWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="View" or \
+           classname=="ConfmlView":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = ElementTree.Element('view', 
+                                   {'id' : obj.get_ref(),
+                                    'name' : obj.get_name()})
+        for child in obj._objects():
+            """ Make sure that the object is mapped to an object in this model """
+            mobj = child._get_mapper('confml').map_object(child)
+            writer = get_writer_for_class(mobj.__class__.__name__)
+            childelem = writer.dumps(child)
+            if childelem != None:
+                elem.append(childelem)
+        return elem
+
+
+class ViewReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="view":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        vid = elem.get('id')
+        name = elem.get('name')
+        view = model.ConfmlView(name, id=vid)
+        for elem in elem.getchildren():
+            # At the moment we ignore the namespace of elements
+            (namespace,elemname) = get_elemname(elem.tag)
+            try:
+                reader = get_reader_for_elem(elemname)
+                obj = reader.loads(elem)
+                view.add(obj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return view
+
+
+class GroupWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="Group" or classname=="ConfmlGroup":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = ElementTree.Element('group', 
+                                   {'name' : obj.get_name()})
+        for child in obj._objects():
+            """ Make sure that the object is mapped to an object in this model """
+            mobj = child._get_mapper('confml').map_object(child)
+            writer = get_writer_for_class(mobj.__class__.__name__)
+            childelem = writer.dumps(child)
+            if childelem != None:
+                elem.append(childelem)
+        return elem
+
+
+class GroupReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=='group':
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        gname = elem.get('name')
+        gref = utils.resourceref.to_dref(gname).replace('.','_')
+        group = model.ConfmlGroup(gref, name=gname)
+        for elem in elem.getchildren():
+            # At the moment we ignore the namespace of elements
+            (namespace,elemname) = get_elemname(elem.tag)
+            try:
+                reader = get_reader_for_elem(elemname, 'group')
+                obj = reader.loads(elem)
+                if obj != None:
+                    group.add(obj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return group
+
+
+class GroupSettingWriter(ConfmlWriter):
+    """
+    """ 
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="FeatureLink":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        ref = obj.fqr.replace('.','/')
+        elem = ElementTree.Element('setting', 
+                                   {'ref' : ref})
+        return elem
+
+class GroupSettingReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=='setting' and parent=='group':
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        ref = elem.get('ref') or ''
+        ref = ref.replace('/','.')
+        return api.FeatureLink(ref)
+
+
+
+class ConfmlSettingWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlSetting" or \
+           classname=="ConfmlStringSetting" or \
+           classname=="ConfmlIntSetting" or \
+           classname=="ConfmlRealSetting" or \
+           classname=="ConfmlBooleanSetting" or \
+           classname=="ConfmlSelectionSetting" or \
+           classname=="ConfmlMultiSelectionSetting" or \
+           classname=="ConfmlDateSetting" or \
+           classname=="ConfmlTimeSetting" or \
+           classname=="ConfmlDateTimeSetting" or \
+           classname=="ConfmlDurationSetting" or \
+           classname=="ConfmlFileSetting" or \
+           classname=="ConfmlFolderSetting" or \
+           classname=="FeatureSequence" or \
+           classname=="ConfmlSequenceSetting":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        elem = ElementTree.Element('setting', 
+                                   {'ref' : obj.get_ref(),
+                                    'name' : obj.get_name()})
+        if obj.type:
+            elem.set('type', obj.get_type())
+        if hasattr(obj,'minOccurs'):
+            elem.set('minOccurs', str(obj.minOccurs))
+        if hasattr(obj,'maxOccurs'):
+            elem.set('maxOccurs', str(obj.maxOccurs))
+        if hasattr(obj,'readOnly') and obj.readOnly != None:
+            elem.set('readOnly', str(obj.readOnly).lower())
+        if hasattr(obj,'required') and obj.required != None:
+            elem.set('required', str(obj.required).lower())
+        if hasattr(obj,'constraint') and obj.constraint != None:
+            elem.set('constraint', obj.constraint)
+        if hasattr(obj,'relevant') and obj.relevant != None:
+            elem.set('relevant', obj.relevant)
+        if hasattr(obj,'mapKey') and obj.mapKey is not None:
+            elem.set('mapKey', str(obj.mapKey))
+        if hasattr(obj,'mapValue') and obj.mapValue is not None:
+            elem.set('mapValue', str(obj.mapValue))
+            
+        for child in obj._objects():
+            """ Make sure that the object is mapped to an object in this model """
+            mobj = child._get_mapper('confml').map_object(child)
+            writer = get_writer_for_class(mobj.__class__.__name__)
+            childelem = writer.dumps(child)
+            if childelem != None:
+                elem.append(childelem)
+        return elem
+
+
+class ConfmlSettingReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if parent and not (parent=='feature' or parent=='setting'):
+             return False
+        if elemname=='setting':
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        typedef = elem.get('type')
+        if typedef == 'sequence':
+            map_key = elem.get('mapKey')
+            map_value = elem.get('mapValue')
+            feature = model.ConfmlSequenceSetting(elem.get('ref'), mapKey=map_key, mapValue=map_value)
+        elif typedef == 'int':
+            feature = model.ConfmlIntSetting(elem.get('ref'))
+        elif typedef == 'boolean':
+            feature = model.ConfmlBooleanSetting(elem.get('ref'))
+        elif typedef == 'selection':
+            feature = model.ConfmlSelectionSetting(elem.get('ref'))
+        elif typedef == 'multiSelection':
+            feature = model.ConfmlMultiSelectionSetting(elem.get('ref'))
+        elif typedef == 'string':
+            feature = model.ConfmlStringSetting(elem.get('ref'))
+        elif typedef == 'real':
+            feature = model.ConfmlRealSetting(elem.get('ref'))
+        elif typedef == 'file':
+            feature = model.ConfmlFileSetting(elem.get('ref'))
+        elif typedef == 'folder':
+            feature = model.ConfmlFolderSetting(elem.get('ref'))
+        elif typedef == 'date':
+            feature = model.ConfmlDateSetting(elem.get('ref'))
+        elif typedef == 'time':
+            feature = model.ConfmlTimeSetting(elem.get('ref'))
+        elif typedef == 'dateTime':
+            feature = model.ConfmlDateTimeSetting(elem.get('ref'))
+        elif typedef == 'duration':
+            feature = model.ConfmlDurationSetting(elem.get('ref'))
+        
+           
+        else:
+            # Handle the default setting as int type
+            feature = model.ConfmlSetting(elem.get('ref'), type=None)
+        
+        if elem.get('name'):
+            feature.set_name(elem.get('name'))
+        if elem.get('minOccurs'):
+            feature.minOccurs = int(elem.get('minOccurs'))
+        if elem.get('maxOccurs'):
+            feature.maxOccurs = int(elem.get('maxOccurs'))
+        if elem.get('readOnly'):
+            feature.readOnly = elem.get('readOnly') == 'true' or False
+        if elem.get('required'):
+            feature.required = elem.get('required') == 'true' or False
+        if elem.get('constraint'):
+            feature.constraint = elem.get('constraint')
+        if elem.get('relevant'):
+            feature.relevant = elem.get('relevant')
+        
+        for elem in elem.getchildren():
+            # At the moment we ignore the namespace of elements
+            (namespace,elemname) = get_elemname(elem.tag)
+            try:
+                reader = get_reader_for_elem(elemname)
+                obj = reader.loads(elem)
+                if obj != None:
+                    feature.add(obj,container.APPEND)
+                else:
+                    logging.getLogger('cone').warning("Invalid child %s in %s" % (elem,feature.name))
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return feature
+
+
+class ConfmlLocalPathWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlLocalPath":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The ConfmlLocalPath object 
+        """
+        elem = ElementTree.Element('localPath')
+        if obj.readOnly:
+            elem.set('readOnly', unicode(obj.readOnly))
+        return elem
+
+
+class ConfmlLocalPathReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="localPath":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        return model.ConfmlLocalPath(readOnly=elem.get('readOnly'))
+
+
+class ConfmlTargetPathWriter(ConfmlWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfmlTargetPath":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        """
+        @param obj: The ConfmlLocalPath object 
+        """
+        elem = ElementTree.Element('targetPath')
+        if obj.readOnly:
+            elem.set('readOnly', unicode(obj.readOnly))
+        return elem
+
+
+class ConfmlTargetPathReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="targetPath":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        return model.ConfmlTargetPath(readOnly=elem.get('readOnly'))
+
+
+class DummyWriter(ConfmlWriter):
+    """
+    Dummy writer is executed on ConE model elements that are not supposed to go to the confml file
+    """ 
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConfmlWriter supports writing
+        of the given class name
+        """
+        if classname=="_FeatureProxy":
+            return True
+        else:
+            return False
+
+    def dumps(self, obj):
+        return None
+
+
+
+class RfsReader(ConfmlReader):
+    """
+    """ 
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConfmlWriter supports reading
+        of the given elem name
+        """
+        if elemname=="rfs":
+            return True
+        else:
+            return False
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        
+        (namespace,elemname) = get_elemname(elem.tag)
+        obj = api.DataContainer(elemname, container=True)
+        for elem in elem.getchildren():
+            try:
+                reader = ElemReader(attr='rfs')
+                childobj = reader.loads(elem)
+                obj.add(childobj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return obj
+
+class ElemReader(ConfmlReader):
+    def __init__(self, **kwargs):
+        self.template = kwargs.get('template',False)
+        self.attr = kwargs.get('attr',None)
+        self.args = kwargs
+
+    def loads(self, elem):
+        """
+        @param elem: The xml include elem
+        """
+        (namespace,elemname) = get_elemname(elem.tag)
+        datavalue = None
+        if len(list(elem)) == 0:
+            datavalue = elem.text
+        datatemplate = elem.get('template') == 'true' or self.template
+        dataextensionpolicy = elem.get('extensionPolicy') or ''
+        datamap = elem.get('map')
+        obj = api.Data(ref=elemname,value=datavalue, template=datatemplate, attr=self.attr,policy=dataextensionpolicy,map=datamap)
+        for elem in elem.getchildren():
+            try:
+                reader = ElemReader(**self.args)
+                childobj = reader.loads(elem)
+                obj.add(childobj)
+            except exceptions.ConePersistenceError,e:
+                logging.getLogger('cone').warning("Could not parse element %s. Exception: %s" % (elem,e))
+                continue
+        return obj
+
+namespace_pattern = re.compile("{(.*)}(.*)")
+nonamespace_pattern = re.compile("(.*)")
+
+def get_elemname(tag):
+    
+    ns = namespace_pattern.match(tag)
+    nn = nonamespace_pattern.match(tag)
+    if ns:
+        namespace = ns.group(1)
+        elemname = ns.group(2)
+        return (namespace,elemname)
+    elif nn:
+        namespace = ""
+        elemname = nn.group(1)
+        return (namespace,elemname)
+    else:
+        raise exceptions.ParseError("Could not parse tag %s" % tag)
+        
+
+def get_reader_for_elem(elemname, parent=None):
+    for reader in ConfmlReader.__subclasses__():
+        if reader.supported_elem(elemname,parent):
+            return reader()
+    raise exceptions.ConePersistenceError("No reader for given elem %s under %s found!" % (elemname, parent))
+
+def get_writer_for_class(classname):
+    for writer in ConfmlWriter.__subclasses__():
+        if writer.supported_class(classname):
+            return writer ()
+    raise exceptions.ConePersistenceError("No writer for given class found! %s" % classname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+if SOURCE_ROOT not in sys.path:
+    sys.path.insert(0, SOURCE_ROOT)
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    sys.path.insert(0, ROOT_PATH)
+    try:
+        suite = unittest.TestSuite()
+        for test_module in __all__:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_2DigitDialing.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="2 Digit Dialing" ref="CVC_2DigitDialing">
+		<confml:desc>2 Digit Dialing.</confml:desc>
+		<confml:setting name="2 Digit Dialing" ref="CVC_2DigitDialing" type="boolean">
+			<confml:desc>2 Dialing. Default is disabled</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	<CVC_2DigitDialing>
+	<CVC_2DigitDialing>false</CVC_2DigitDialing>
+	</CVC_2DigitDialing>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_ActiveIdleNotifiers.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Homescreen Notification components" ref="CVC_ActiveIdleNotifiers">
+      <confml:desc>Notification components: missed calls, new messages (device inbox), and new voice messages are located on one row of the device. It is possible to configure the notifiers on/off separately. If a notification component is turned off, the notifications are shown as traditional pop-up notifications.</confml:desc>  
+  <confml:setting name="E-mail notification" ref="CVC_ActiveIdleNotifiersEmail" type="boolean">
+      <confml:desc>Up to two different e-mail accounts for each mode can be configured to be visible on the Home screen. It is not possible to customize e-mail notifiers as they are only available when the e-mail account is first activated.</confml:desc>
+    </confml:setting>
+  <confml:setting name="Calendar and To-do notification" ref="CVC_ActiveIdleNotifiersCalendar" type="boolean">
+      <confml:desc>Calendar and To-do components provide dynamically updated information from Calendar entries and ToDo notes. If there is no data to show, "No calendar events for today" note is visible on the Home screen view.</confml:desc>
+    </confml:setting>
+ <confml:setting name="Music Player notification" ref="CVC_ActiveIdleNotifiersMusicPlayer" type="boolean">
+     <confml:desc>The Music Player component shows the music tracks that are being played by the Music Player. If there is no data to show, this UI area is empty.</confml:desc>
+   </confml:setting>
+ <confml:setting name="Visual Radio notification" ref="CVC_ActiveIdleNotifiersVisualRadio" type="boolean">
+     <confml:desc>The Visual radio plug-in shows the name or frequency of the radio channel that is being played by Visual radio in the background. The icon also shows whether Visual radio service is available for the current channel.</confml:desc>
+   </confml:setting>
+    <confml:setting name="WLAN notification" ref="CVC_ActiveIdleNotifiersWLAN" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="E-mail settings wizard" ref="CVC_ActiveIdleNotifiersEmailSettingsWizard" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Internet Сall setup" ref="CVC_ActiveIdleNotifiersInternetCallSetup" type="boolean">
+     <confml:desc>This plug-in provides easy access to Voice over IP settings wizard, providing options to launch Voice over IP setup wizard or hide the plug-in from the Home screen.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Mobile search" ref="CVC_ActiveIdleNotifiersMobileSearch" type="boolean">
+     <confml:desc>The Mobile search plug-in allows the user to initiate a search for content in the device or in the Internet directly from Home screen. User can click on the plug-in and write the search term.</confml:desc>
+   </confml:setting>
+    <confml:setting name="SIM Application Toolkit" ref="CVC_ActiveIdleNotifiersSIMApplicationToolkit" type="boolean">
+     <confml:desc>The SIM Application Toolkit shows messages from an application residing on the SIM card.</confml:desc>
+   </confml:setting>
+</confml:feature>
+<confml:data>
+<confml:CVC_ActiveIdleNotifiers>
+<confml:CVC_ActiveIdleNotifiersEmail>true</confml:CVC_ActiveIdleNotifiersEmail>
+<confml:CVC_ActiveIdleNotifiersCalendar>true</confml:CVC_ActiveIdleNotifiersCalendar>
+<confml:CVC_ActiveIdleNotifiersMusicPlayer>true</confml:CVC_ActiveIdleNotifiersMusicPlayer>
+<confml:CVC_ActiveIdleNotifiersVisualRadio>true</confml:CVC_ActiveIdleNotifiersVisualRadio>
+<confml:CVC_ActiveIdleNotifiersWLAN>true</confml:CVC_ActiveIdleNotifiersWLAN>
+<confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>true</confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>
+<confml:CVC_ActiveIdleNotifiersInternetCallSetup>true</confml:CVC_ActiveIdleNotifiersInternetCallSetup>
+<confml:CVC_ActiveIdleNotifiersMobileSearch>true</confml:CVC_ActiveIdleNotifiersMobileSearch>
+<confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>true</confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>
+</confml:CVC_ActiveIdleNotifiers>
+</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_ActiveIdleOther.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Miscelaneous Homescreen settings" ref="CVC_ActiveIdleOther">
+  <confml:setting name="Homescreen Idle Easy Dialing" ref="CVC_ActiveIdleEasyDialing" type="boolean">
+      <confml:desc>Easy Dialing allows user to start dialling from Home Screen to a contact without first starting Phonebook application. The name input is predictive (subject to restrictions by input language), and the contacts are matched so that each character only requires one key press. Typing more narrows down the options. User is able to use the number that was just typed, or select one of the name matches.</confml:desc>
+    </confml:setting>
+    
+    
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_AppShell323.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+  <feature name="Application Menu Customization for S60 3.2.3" ref="CVC_AppShell323">
+    <desc>Application Shell customization.</desc>
+    <setting name="Application Menu data location" ref="CVC_AppShell323" type="folder">
+      <desc>Folder containing Application Shell configuration files: appshelldata.xml, appshelldata.dtd, appshellapplications.properties</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+<data>
+<CVC_AppShell323>
+<CVC_AppShell323><localPath>UI/Application Menu</localPath></CVC_AppShell323>
+</CVC_AppShell323>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_CPHSALS.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="CPHS/ALS settings" ref="CVC_CPHSALS">
+		<confml:desc>CPHS is an extension to the GSM specification that adds several convenience and usability enhancements to the way GSM phones and SIM cards operate. Examples of CPHS enhancements include single-key access to a standard voicemail number stored on the SIM, and a message-waiting indicator to alert users to new voicemail messages. CPHS also provides carriers with greater control and flexibility over the carrier name that is displayed on the phone. CPHS also includes the ability to control certain network-based features from the phone interface, including call forwarding, call waiting, and caller-ID. CPHS is not an official part of the GSM specification. It was developed by the PCN Association rather than the GSM Association. Nonetheless, CPHS has been popular among carriers. Many European and American GSM carriers require it, and so newer GSM phones from most major manufacturers include CPHS functionality.</confml:desc>
+		<confml:setting name="CPHS / ALS mode" ref="CVC_CPHSALS" type="selection">
+			<confml:desc>If ALS is set as ON, the functionality of toggling from General to Silent profile by long press # key will be disabled. CPHS and ALS can be set ON and OFF in the customer variants of the standard transceiver. CPHS and ALS can never be both set ON at the same time.</confml:desc>
+      <confml:option name="Both OFF" value="off"/>
+      <confml:option name="CPHS" value="cphs"/>
+      <confml:option name="ALS" value="als"/>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_CellInfoDisplay.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+<feature name="Cell Info Display" ref="CVC_CellInfoDisplay">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception)</desc>
+	<setting name="Cell Info Display" ref="CVC_CellInfoDisplay" type="boolean">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception). "On" when checked. Cell info display is "Off" by default in the standard transceiver. This setting is set "On" by default for countries in which the GSM regulatory authority requires it.</desc>
+  </setting>
+</feature>
+<data>
+</data>
+</configuration>
Binary file configurationengine/source/cone/confml/tests/data/CVC_Content.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_CustomerMenu.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="CVC_Previewable">
+	<confml:feature name="Customer Menu" ref="CVC_OperatorMenu">
+		<confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter. The URL defines the xHTML Startup page that is shown when the Customer Menu application is launched, for example www.customername.com/index.html. The URL also defines the customer domain URL path, for example www.customername.com/. All user-browsed xHTML pages belonging to that path are automatically stored in the Customer Menu cache.The Customer Menu application can be configured as a shortcut just like any other application. In Main menu, the Customer Menu is placed by default to 11th position. When the Customer Menu is enabled, Help moves from position 11 to 12 and Apps moves from 12 to 13, which is not visible until the user scrolls the menu cursor.</confml:desc>
+		<confml:setting name="Customer Menu icon" ref="CVC_OperatorMenuIconFile" type="file">
+			<confml:desc>Customer menu icon that will be present in Application Grid. Size: 65 x 65 pixels. Format: SVGT (preferred) or BMP. Color depth: 24 bit</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon bitmask" ref="CVC_OperatorMenuIconMaskFile" type="file">
+			<confml:desc>Customer menu bitmask when using BMP menu icon. Size: 65 x 65 pixels. Format: BMP. Color depth: 8 bit</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon caption" ref="CVC_OperatorMenuIconCaption" type="string">
+			<confml:desc>The text caption for Customer Menu icon </confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu source URL" ref="CVC_OperatorMenuURL" type="string">
+			<confml:desc>Target URL for Operator Menu. The URL defines the xHTML Start-up page that will be shown when the Customer Menu application is launched (e.g. “www.customername.com/index.htmâ€). The URL also defines the customer domain URL path (e.g. “www.customername.comâ€).</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu cache" ref="CVC_OperatorMenuCache" type="folder">
+			<confml:desc>Data stored in the Customer Menu cache is preserved in the device memory and can be accessed even after the Browser session is ended and through power cycles of the device. File format: xHTML files. Customers provide the xHTML pages to be pre-installed in the Customer Menu Cache.The max. amount of data that can be stored in the Customer Menu cache is 300 KB</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer menu cache expiration date" ref="CVC_AppShellOperatorMenuCacheExpireDate" type="string">
+			<confml:desc>In “mm/yyyy†format. Customers define the expiration date of the xHTML page(s). After that date, the cache content will no longer be used and Operator icon will launch URL instead.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+<confml:CVC_OperatorMenu>
+<confml:CVC_OperatorMenuCache>
+<confml:localPath>UI/Customer Menu/Cache</confml:localPath>
+</confml:CVC_OperatorMenuCache>
+</confml:CVC_OperatorMenu>
+</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_InstantMessaging.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_instantmessaging">
+
+<feature name="Instant Messaging" ref="CVC_InstantMessaging">
+	<desc>IM (Instant Messaging) settings</desc>	
+	<setting name="Server name" ref="CVC_IMServerName" type="string">
+	<desc>Server name. Max 30 chars.</desc>
+  	</setting>
+  	<setting name="Access point in use" ref="CVC_IMAccessPointInUse" type="string">
+  	<desc>Max 100 chars.</desc>
+  	</setting>
+  	<setting name="Web address" ref="CVC_IMWebAddress" type="string">
+  	<desc>Max 50 chars.</desc>
+  	</setting>
+  	<setting name="User ID" ref="CVC_IMUserID" type="string">
+  	</setting>
+  	<setting name="Password " ref="CVC_IMPassword" type="string">
+  	</setting>
+  	<setting name="IM Presence" ref="CVC_IMPresence" type="selection">
+  		<option name="Active for all" value="all"/>
+		<option name="Active for contacts" value="contacts"/>
+		<option name="Not active" value="not"/>
+  	</setting>
+  	<setting name="Allow messages from" ref="CVC_IMAllowMessagesFrom" type="selection">
+  		<option name="All" value="all"/>
+		<option name="IM contacts only " value="contacts"/>
+		<option name="None" value="none"/>
+  	</setting>
+  	<setting name="Message  scrolling speed" ref="CVC_IMMessageScrollingSpeed" type="selection">
+  		<option name="Slow" value="Slow"/>
+		<option name="Medium" value="Medium"/>
+		<option name="Fast" value="Fast"/>
+  	</setting>
+  	<setting name="Sort IM contacts" ref="CVC_IMSortContacts" type="selection">
+  		<option name="Alphabetically" value="Alphabetically"/>
+		<option name="By online status" value="Bystatus"/>
+  	</setting>
+  	<setting name="Availability reloading" ref="CVC_IMAvailabilityReloading" type="selection">
+  		<option name="Automatic" value="Automatic"/>
+		<option name="Manual" value="Manual"/>
+  	</setting>
+  	<setting name="Offline contacts" ref="CVC_IMOfflineContacts" type="selection">
+  		<option name="Show" value="Show"/>
+		<option name="Hide" value="Hide"/>
+  	</setting>
+  	<setting name="Own message colour" ref="CVC_IMOwnMessageColour" type="string">
+  	</setting>
+  	<setting name="Received message colour" ref="CVC_IMReceivedMessageColour" type="string">
+  	</setting>
+  	<setting name="Show date/ time info" ref="CVC_IMShowDateTimeInfo" type="selection">
+  		<option name="Yes" value="Yes"/>
+		<option name="No" value="No"/>
+  	</setting>
+  	<setting name="IM alert tone" ref="CVC_IMAlertTone" type="file">
+		<desc>Alert tone for Instant Messaging.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+	</setting>
+  	<setting name="Default Server" ref="CVC_IMDefaultServer" type="string">
+  	</setting>
+  	<setting name="Presence login type" ref="CVC_IMPresenceLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network On app." value="autohome"/>
+		<option name="Start-up Manual" value="manual"/>
+  	</setting>
+  	<setting name="IM login type" ref="CVC_IMLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network" value="autohome"/>
+		<option name="Start-up" value="start"/>
+		<option name="Manual" value="manual"/>
+  	</setting>
+</feature>
+ <data>
+ </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_NokiaPCInternetAccess.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Nokia PC Internet Access" ref="CVC_NokiaPCInternetAccess">
+<desc>Customizations of PC application "Nokia PC Internet Access"</desc>
+    <setting name="Customer logo file" ref="CVC_NokiaPCInternetAccessFile" type="file">
+      <desc>Customer logo file. Format: Portable Network Graphics with transparent background. Size 280x40.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+		<setting name="Customer defined URL" ref="CVC_NokiaPCInternetAccessURL" type="string">
+			<desc>NPCIA autolaunches the default web browser of the PC. Default starting page of the browser can be set through NPCIA (when browser is launched by NPCIA)</desc>
+		</setting>
+		<setting name="Customer Care contact info" ref="CVC_NokiaPCInternetAccessCustomerCareInfo" type="string">
+			<desc>Located in in NPCIAs’ ‘Settings’ view. Can be phone number and/or link to operator webpage.</desc>
+		</setting>
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_OperatorLogo.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Operator Logo" ref="CVC_OperatorLogo">
+<desc>The Nokia E75 supports color logos in addition to the traditional black and white customer logos. Customer logos may be predefined in the default settings for the device or downloaded by the user. The customer logo is stored together with the MNC and MCC info of the home network in the device and will be displayed when the user is in the home network. The customer logo replaces the standard customer name.</desc>
+    <setting name="Operator Logo File" ref="CVC_OperatorLogoPath" type="file">
+      <desc>Operator logo file. Format: BMP or SVG. Maximum size 134x33 pixels. Name must be Logo_MCC_MNC_PROG.svg or Logo_MCC_MNC_PROG.bmp, where MCC and MNC are mobile country code and mobile network code.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_Preinstalled.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,167 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+	<feature name="Pre-installed Content" ref="CVC_PreinstalledContent">
+		<desc>Customer-defined pre-installed content. Please note that the total size of the User Data Area content size must not exceed 5 Mbytes.</desc>
+
+		<setting maxOccurs="6" name="Pre-Installed MMS Messages" ref="CVC_PreInstalledMMSs" type="sequence">
+			<desc>Max 6 mms, max size 35K. Binary format (encoding according to MMS encapsulation specification)</desc>
+			<setting name="Pre-Installed MMS" ref="CVC_PreInstalledMMS" type="file">
+				<desc>Pre-Installed MMS</desc>
+				<property name="maxFileSize" unit="kb" value="35"/>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+		</setting>
+
+		<setting name="Pre-Installed Images" ref="CVC_PreInstalledImagesFolder" type="folder">
+			<desc>Pre-Installed Images. Size up to 5MP (2560x1920 pixels), format JPEG. No EXIF data allowed</desc>
+			<property name="maxFileSize" unit="Mb" value="5"/>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Streaming links" ref="CVC_PreInstalledStreamingLinksFolder" type="folder">
+			<desc>Pre-Installed Streaming links. Format is .ram file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Music Clips" ref="CVC_PreInstalledMusicClipsFolder" type="folder">
+			<desc>Pre-Installed Music Clips.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Video Clips" ref="CVC_PreInstalledVideoClipsFolder" type="folder">
+			<desc>Pre-Installed Video Clips.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Default ringtone in General Profile" ref="CVC_DefaultRingtoneFile" type="file">
+			<desc>Default Ringtone in General Profile. Any supported media file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Default Message Alert tone in General Profile" ref="CVC_DefaultMessageToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default ringtone for incoming message event in General Profile. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Default Video Call tone in General Profile" ref="CVC_DefaultVideoCallToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default ringtone for video call event in General Profile. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Pre-Installed Themes" ref="CVC_PreInstalledThemesFolder" type="folder">
+			<desc>Pre-Installed Themes. Format is Theme project archive zip file with extesion .tpf, containing the theme project and main .tdf file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Application pre-Installed to User Data Area" ref="CVC_PreInstalledUDAApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Application pre-Installed to Memory Card" ref="CVC_PreInstalledMMCApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian	sisgned .sis file or Java MIDP .jar + .jad. Ensure that application	did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-loaded (bundled) application installable by end-user." ref="CVC_BundledApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-loaded to device. Offerecd for installation to the end-user. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+		
+		<setting name="Symbian Certificates" ref="CVC_CertificatesSymbian" type="sequence">
+			<desc>Symbian certificates for trusted software installations.
+			</desc>
+			<setting name="Symbian Certificate file" ref="CVC_SymbianCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+			<setting name="Trusted installation of native Symbian OS applications" ref="CVC_AllowSWInstall" type="boolean">
+				<desc>Allows installation of native Symbian OS applications (on/off)</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+
+		<setting name="Java MIDP2 Certificates" ref="CVC_CertificatesMIDP" type="sequence">
+			<desc>Java MIDP certificates for trusted software installations.
+			</desc>
+			<setting name="Java Certificate file" ref="CVC_JavaCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+			<setting name="Trusted Domain" ref="CVC_TrustedDomain" type="selection">
+				<desc>Trusted application domain: Customer or Third-party.
+				</desc>
+				<option name="Customer" value="Customer"/>
+				<option name="Third Party" value="Third Party"/>
+			</setting>
+		</setting>
+		<setting name="Internet Certificates" ref="CVC_CertificatesInternet" type="sequence">
+			<desc>Certificates for Internet services: SSL/TLS (HTTPS,SecureIMAP, etc.) connections.</desc>
+			<setting name="Internet Certificate file" ref="InternetCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.
+				</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+	</feature>
+
+<data>
+
+
+<CVC_PreinstalledContent>
+
+<CVC_PreInstalledImagesFolder>
+        <localPath>Media/Images</localPath>
+</CVC_PreInstalledImagesFolder>
+
+<CVC_PreInstalledStreamingLinksFolder>
+        <localPath>Streaming Links</localPath>
+</CVC_PreInstalledStreamingLinksFolder>
+
+<CVC_PreInstalledMusicClipsFolder>
+        <localPath>Media/Music</localPath>
+</CVC_PreInstalledMusicClipsFolder>
+
+<CVC_PreInstalledVideoClipsFolder>
+        <localPath>Media/Videos</localPath>
+</CVC_PreInstalledVideoClipsFolder>
+
+<CVC_PreInstalledThemesFolder>
+        <localPath>UI/Themes</localPath>
+</CVC_PreInstalledThemesFolder>
+
+<CVC_PreInstalledUDAApplicationsFolder>
+        <localPath>Applications/Pre-installed to UDA</localPath>
+</CVC_PreInstalledUDAApplicationsFolder>
+
+<CVC_PreInstalledMMCApplicationsFolder>
+        <localPath>Applications/Pre-installed to MMC</localPath>
+</CVC_PreInstalledMMCApplicationsFolder>
+
+<CVC_BundledApplicationsFolder>
+        <localPath>Applications/Bundled</localPath>
+</CVC_BundledApplicationsFolder>
+
+</CVC_PreinstalledContent>
+
+</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_RightSoftkey.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Right Softkey Customization" ref="CVC_RSK">
+    <confml:desc>The right soft key (RSK) in idle mode can be configured to launch a customer defined application or URL. The RSK label can be branded with a graphic only if it is a URL. The left soft key (LSK) is always a text string and is not customizable. The end user is able to personalize both the left and right soft keys.</confml:desc>
+    <confml:setting name="Right Softkey Customization" ref="CVC_ActiveIdleRSKCustomization" type="boolean">
+      <confml:desc>Right Softkey Customization</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey caption" ref="CVC_ActiveIdleRSKText" type="string">
+      <confml:desc>Right Softkey caption text (if RSK is not customized as image). 12 characters max (5 for Chinese variants).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey image" ref="CVC_ActiveIdleRSKImage" type="file">
+      <confml:desc>Size: 115 x 22 pixels Format: SVGT (preferred) or BMP</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting name="Right Softkey image BMP mask" ref="CVC_ActiveIdleRSKImageBMPMask" type="file">
+      <confml:desc>Right softkey BMP mask. Applicable only if BMP format is used.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting name="Right Softkey target URL" ref="CVC_ActiveIdleRSKTargetURL" type="string">
+      <confml:desc>Right Softkey target URL (if target is defined as a web site).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey target Application UID" ref="CVC_ActiveIdleRSKTargetAppUID" type="string">
+      <confml:desc>Right Softkey target Application UID (if target is an application). Format is a hexadecimal number (0x00000000).</confml:desc>
+    </confml:setting>
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_StartupShutdownAnimations.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="Operator Startup Animation">
+	<confml:feature name="Operator Startup Animation" ref="CVC_StartupAnimationSequence">
+		<confml:desc>Startup animation. The customer specific startup element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Startup Animation Duration, seconds" ref="CVC_StartupAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Startup Audio" ref="CVC_StartupAnimationTone" type="file">
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Startup Frames Location" ref="CVC_StartupFrameLocation" type="folder">
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+	</confml:feature>
+	<confml:feature name="Operator Shutdown Animation" ref="CVC_ShutdownAnimationSequence">
+		<confml:desc>Shutdown animation. The customer specific shutdown element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Shutdown Animation Duration" ref="CVC_ShutdownAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Shutdown Audio" ref="CVC_ShutdownAnimationTone" type="file">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+		</confml:setting>
+		<confml:setting name="Shutdown Frames Location" ref="CVC_ShutdownFrameLocation" type="folder">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+		<confml:CVC_StartupAnimationSequence>
+			<confml:CVC_StartupAnimationDuration>3000</confml:CVC_StartupAnimationDuration>
+			<confml:CVC_StartupAnimationTone>
+			</confml:CVC_StartupAnimationTone>
+			<confml:CVC_StartupFrameLocation>
+				<confml:localPath>UI/Start-up Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_StartupFrameLocation>
+		</confml:CVC_StartupAnimationSequence>
+		<confml:CVC_ShutdownAnimationSequence>
+			<confml:CVC_ShutdownAnimationDuration>3000</confml:CVC_ShutdownAnimationDuration>
+			<confml:CVC_ShutdownAnimationTone>
+				<confml:localPath/>
+				<confml:targetPath/>
+			</confml:CVC_ShutdownAnimationTone>
+			<confml:CVC_ShutdownFrameLocation>
+				<confml:localPath>UI/Shutdown Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_ShutdownFrameLocation>
+		</confml:CVC_ShutdownAnimationSequence>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_Streaming.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_streaming">
+	<feature name="Streaming Settings" ref="CVC_streaming">
+		<desc>Streaming Settings</desc>
+		<setting name="Use proxy" ref="CVC_streamingUseProxy" type="selection">
+			<desc>Use proxy for streaming</desc>
+			<option name="Yes" value="Yes"/>
+			<option name="No" value="No"/>
+		</setting>
+		<setting name="Proxy server address" ref="CVC_streamingProxyServerAddress" type="string">
+			<desc>Programmed (max.length 1000 characters)</desc>
+		</setting>
+		<setting name="Proxy port number" ref="CVC_streamingProxyPortNumber" type="int">
+			<desc>Programmed (1-9999)</desc>
+		</setting>
+		<setting name="Default access point" ref="CVC_streamingAccessPoint" type="string">
+			<desc>Programmed (max.length 100 characters)</desc>
+		</setting>
+		<setting name="Online time" ref="CVC_streamingOnlineTime" type="selection">
+			<desc>Limit for online time spent in streaming</desc>			
+			<option name="Unlimited" value="Unlimited"/>
+			<option name="User defined" value="UD"/>
+		</setting>
+		<setting name="User defined time" ref="CVC_streamingOnlineTimeValue" type="int">
+			<desc>User-selectable value for online streaming time (if limiting is enabled)</desc>
+			<desc>(1 – 30 minutes)</desc>
+		</setting>
+		<setting name="Lowest UDP port" ref="CVC_streamingLowestUDPPort" type="int">
+			<desc>1024 (equal or smaller than Highest UDP port) (default 6970)</desc>
+		</setting>
+		<setting name="Highest UDP port" ref="CVC_streamingHighestUDPPort" type="int">
+			<desc>65535 (equal or bigger than Lowest UDP port)(default 32000)</desc>
+		</setting>
+		<setting name="GPRS bandwidth" ref="CVC_streamingGPRSBandwidth" type="selection">
+			<desc>GPRS bandwidth limit for streaming</desc>
+			<option name="9.05 kbit/s" value="9"/>
+			<option name="13.40 kbit/s" value="13"/>
+			<option name="18.10 kbit/s" value="18"/>
+			<option name="27.15 kbit/s" value="27"/>
+			<option name="40.20 kbit/s" value="40"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined GPRS bandwidth" ref="CVC_streamingGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 99.99 kbps)</desc>
+		</setting>
+		<setting name="EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidth" type="selection">
+			<desc>EGPRS bandwidth limit for streaming</desc>
+			<option name="44.80 kbit/s" value="44"/>
+			<option name="59.20 kbit/s" value="59"/>
+			<option name="89.60 kbit/s" value="89"/>
+			<option name="108.80 kbit/s" value="108"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 199.99 kbps)</desc>
+		</setting>
+		<setting name="UMTS bandwidth" ref="CVC_streamingUMTSBandwidth" type="selection">
+			<desc>UMTS bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined UMTS bandwidth" ref="CVC_streamingUMTSBandwidthValue" type="real">
+			<desc>User defined (5 – 999.99 kbps)</desc>
+		</setting>
+		<setting name="WLAN bandwidth" ref="CVC_streamingWLANBandwidth" type="selection">
+			<desc>WLAN bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="768.00 kbit/s" value="768"/>
+			<option name="1.05 Mbit/s" value="1050"/>
+			<option name="1.43 Mbit/s" value="1430"/>
+			<option name="1.92 Mbit/s" value="1920"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined WLAN bandwidth" ref="CVC_streamingWLANBandwidthValue" type="real">
+			<desc>User defined (kbps)</desc>
+		</setting>
+		<setting name="HSDPA bandwidth" ref="CVC_streamingHSDPABandwidth" type="selection">
+			<desc>HSDPA bandwidth limit for streaming</desc>
+			<option name="600.00 kbit/s" value="600"/>
+			<option name="1.20 Mbit/s" value="1200"/>
+			<option name="1.80 Mbit/s" value="1800"/>
+			<option name="2.40 Mbit/s" value="2400"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="3.60 Mbit/s" value="3600"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined HSDPA bandwidth" ref="CVC_streamingHSDPABandwidthValue" type="real">
+			<desc>User defined (5 – 3999.99 kbps)</desc>
+		</setting>
+	</feature>
+	<data>
+		<CVC_streaming>
+			<CVC_streamingUseProxy>No</CVC_streamingUseProxy>
+			<CVC_streamingProxyServerAddress/>
+			<CVC_streamingProxyPortNumber>554</CVC_streamingProxyPortNumber>
+			<CVC_streamingAccessPoint/>
+			<CVC_streamingOnlineTime>Unlimited</CVC_streamingOnlineTime>
+			<CVC_streamingOnlineTimeValue>1</CVC_streamingOnlineTimeValue>
+			<CVC_streamingLowestUDPPort>6970</CVC_streamingLowestUDPPort>
+			<CVC_streamingHighestUDPPort>32000</CVC_streamingHighestUDPPort>
+			<CVC_streamingGPRSBandwidth>40</CVC_streamingGPRSBandwidth>
+			<CVC_streamingGPRSBandwidthValue>5</CVC_streamingGPRSBandwidthValue>
+			<CVC_streamingEGPRSBandwidth>89</CVC_streamingEGPRSBandwidth>
+			<CVC_streamingEGPRSBandwidthValue>5</CVC_streamingEGPRSBandwidthValue>
+			<CVC_streamingUMTSBandwidth>384</CVC_streamingUMTSBandwidth>
+			<CVC_streamingUMTSBandwidthValue>5</CVC_streamingUMTSBandwidthValue>
+			<CVC_streamingWLANBandwidth>1430</CVC_streamingWLANBandwidth>
+			<CVC_streamingWLANBandwidthValue>5</CVC_streamingWLANBandwidthValue>
+			<CVC_streamingHSDPABandwidth>user</CVC_streamingHSDPABandwidth>
+			<CVC_streamingHSDPABandwidthValue>5</CVC_streamingHSDPABandwidthValue>
+		</CVC_streaming>
+	</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_SyncML.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_SyncML">
+	<feature name="SyncML Settings" ref="CVC_SyncML">
+		<desc>SyncML Settings.</desc>
+		<setting name="Sync profile name" ref="CVC_SMLSyncProfileName" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+		<setting name="Server version" ref="CVC_SMLServerVersion" type="selection">
+			<desc>1.1, 1.2 (default)</desc>
+			<option name="1.2" value="1.2"/>
+			<option name="1.1" value="1.1"/>
+		</setting>
+		<setting name="Server ID" ref="CVC_SMLServerID" type="string">
+			<desc>Server ID</desc>
+		</setting>
+		<setting name="Data bearer" ref="CVC_SMLDataBearer" type="selection">
+			<desc>Data bearer for server connection</desc>
+			<option name="Internet" value="Internet"/>
+			<option name="Bluetooth" value="BT"/>
+		</setting>
+<!-- if Data bearer = internet-->
+		<setting name="Access point" ref="CVC_SMLAccessPoint" type="selection">
+			<desc>Access point to use for server connetion</desc>
+			<option name="Always ask" value="ask"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="Host Address" ref="CVC_SMLHostAddress" type="string">
+			<desc>Maximum length 150 characters.</desc>
+		</setting>
+		<setting name="Port" ref="CVC_SMLPort" type="int">
+			<desc>80 (default), 1-65535</desc>
+		</setting>
+		<setting name="User name" ref="CVC_SMLUserName" type="string">
+			<desc>Server account: username</desc>
+		</setting>
+		<setting name="Password" ref="CVC_SMLPassword" type="string">
+			<desc>Server account: password</desc>
+		</setting>
+		<setting name="Allow sync requests" ref="CVC_SMLAllowSyncRequests" type="selection">
+			<desc>Policy for sync requests</desc>
+			<option name="Automatically accept" value="auto"/>
+			<option name="Ask first" value="ask"/>
+			<option name="Not allowed" value="no"/>
+		</setting>
+		<setting name="Network user name" ref="CVC_SMLNetworkUserName" type="string">
+			<desc>Username for Access Point connection</desc>
+		</setting>
+		<setting name="Network password" ref="CVC_SMLNetworkPassword" type="string">
+			<desc>Password for Access Point connection</desc>
+		</setting>
+		<setting name="Syncronisation type" ref="CVC_SMLSyncronisationType" type="selection">
+			<desc>Type of syncronization</desc>
+			<option name="Both ways" value="both"/>
+			<option name="To server only" value="server"/>
+			<option name="To phone only" value="phone"/>
+		</setting>
+	</feature>
+	
+	<feature name="SyncML Data Syncronization" ref="CVC_SyncMLDataSync">
+
+		<setting name="Syncronize Contacts" ref="CVC_SyncMLContacts" type="boolean">
+			<desc>Include Contacts in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Calendar" ref="CVC_SyncMLCalendar" type="boolean">
+			<desc>Include Calendar in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Notes" ref="CVC_SyncMLNotes" type="boolean">
+			<desc>Include Notes in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize E-mail" ref="CVC_SyncMLSyncEmail" type="boolean">
+			<desc>Include E-mail in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Music" ref="CVC_SyncMLMusicMetadata" type="boolean">
+			<desc>Include Music in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize MSyncService" ref="CVC_SyncMLMSyncService" type="boolean">
+			<desc>Include MSyncService in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Images" ref="CVC_SyncMLImage" type="boolean">
+			<desc>Include Images in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Synchronize MMS" ref="CVC_SyncMLMMS" type="boolean">
+			<desc>Include MMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Video" ref="CVC_SyncMLVideo" type="boolean">
+			<desc>Include Video in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize SMS" ref="CVC_SyncMLSMS" type="boolean">
+			<desc>Include SMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Bookmarks" ref="CVC_SyncMLBookmarks" type="boolean">
+			<desc>Include Bookmarks in Sync ON/OFF</desc>
+		</setting>
+	</feature>
+
+
+
+
+	<feature name="SyncML Remote Databases" ref="CVC_SyncMLDataSyncRemoteDatabases">
+
+		<setting name="Remote database for Contacts" ref="CVC_SyncMLDataSyncRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Calendar" ref="CVC_SyncMLCalendarRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Notes" ref="CVC_SyncMLNotesRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for E-mail" ref="CVC_SyncMLSyncEmailRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Music" ref="CVC_SyncMLMusicMetadataRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MSyncService" ref="CVC_SyncMLMSyncServiceRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Images" ref="CVC_SyncMLImageRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MMS" ref="CVC_SyncMLMMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Video" ref="CVC_SyncMLVideoRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for SMS" ref="CVC_SyncMLSMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Bookmarks" ref="CVC_SyncMLBookmarksRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+	</feature>
+
+
+<data>
+<CVC_SyncML>
+<CVC_SMLPort>80</CVC_SMLPort>
+</CVC_SyncML>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_ThemeWallpaperScreensaver.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+
+  <feature name="Default Theme" ref="CVC_Theme_ref">
+    <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+    <setting name="Default Theme" ref="CVC_DefaultTheme_ref" type="file">
+      <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+
+    <feature name="Wallpaper" ref="CVC_Wallpaper">
+    <desc>Default wallpaper</desc>
+    <setting name="Wallpaper" ref="CVC_WallpaperFile" type="file">
+      <desc>Size: 240X234 pixels Format: SVGT (preferred) or BMP. 24 bit. The end user can select to change this to either a different single image or select multiple images to run in a wallpaper slide show.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+
+  <feature name="Screensaver" ref="CVC_Screensaver">
+    <desc>Screensaver</desc>
+    <setting name="Screensaver File" ref="CVC_ScreensaverFile" type="file">
+      <desc>Screensaver file. Format is animated GIF.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+    <setting name="Animation Timeout (mins)" ref="CVC_AnimationTimeout" type="int">
+      <desc>Duration the animation will run before reverting to default screensaver in minutes. Min 1 minute, max 30 minutes.</desc>
+    </setting>
+    <setting name="Lights Timeout (secs)" ref="CVC_LightsTimeout" type="int">
+      <desc>Duration of display lights being turned on while the animation runs in seconds. 0 = no lights, max 30 seconds.</desc>
+    </setting>
+  </feature>
+<data>
+<CVC_Screensaver>
+<CVC_AnimationTimeout>3</CVC_AnimationTimeout>
+<CVC_LightsTimeout>15</CVC_LightsTimeout>
+</CVC_Screensaver>
+</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_VoiceMailbox.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="Voice Mailbox Number " ref="CVC_VoiceMailboxNumbers">
+		<confml:desc>The device number of the customer’s voice mailbox may be programmed into the device during production or in service. Voice mailbox feature may be activated in two different ways: CSP (Customer Service Profile) support is enabled in product profile AND voice mailbox numbers can be found from customer’s SIM card</confml:desc>
+		<confml:setting name="Number for primary ALS line" ref="CVC_VoiceMailboxNumberPrimaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Number for secondary ALS line" ref="CVC_VoiceMailboxNumberSecondaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+    </confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/CVC_ZeroPlusSend.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="0+ Send" ref="CVC_ZeroPlusSend">
+		<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks.</confml:desc>
+		<confml:setting name="0+ Send" ref="CVC_ZeroPlusSend" type="boolean">
+			<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks. Default is off.</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/accessoryserver.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,97 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="accessoryserver">
+  <meta>
+    <type>featurelist</type>
+    <version_identifier>working</version_identifier>
+  </meta>
+  <feature ref="KCRUidAccServerSettings" name="Accessory Server Settings">
+    <desc>Central repository for accessory related UI settings.</desc>
+    <setting ref="KAccServerHWDevices" name="Accessory Server HW Devices" type="int">
+      <desc>Setting used to detect properly some connected accessories (e.g. TTY, Loopset).&#xD;
+&#xD;
+Phone may support some HW devices that are not properly identified when they are connected to phone. To properly identify such devices user has to tell by using appropriate user interface setting the type of connected device.</desc>
+    </setting>
+    <setting ref="KAccServerWiredHSLights" name="Accessory Server Wired HS Lights" type="int">
+      <desc>Lights setting for wired headset mode. User may force lights on when wired headset is connected to phone. &#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerWirelessHSLights" name="Accessory Server Wireless HS Lights" type="int">
+      <desc>Lights setting for wireless headset mode. User may force lights on when wireless headset is connected to phone. &#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerWiredCarKitLights" name="Accessory Server Wired Car Kit Lights" type="int">
+      <desc>Lights setting for wired car kit mode. User may force lights on when wired car kit is connected to phone. &#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerWirelessCarKitLights" name="Accessory Server Wireless Car Kit Lights" type="int">
+      <desc>Lights setting for wireless car kit mode. User may force lights on when wireless car kit is connected to phone. &#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerTextDeviceLights" name="Accessory Server Text Device Lights" type="int">
+      <desc>Lights setting for text device mode. User may force lights on when text device is connected to phone.&#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerLoopsetLights" name="Accessory Server Loopset Lights" type="int">
+      <desc>Lights setting for loopset. User may force lights on when loopset is connected to phone.&#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerMusicStandLights" name="Accessory Server Music Stand Lights" type="int">
+      <desc>Lights setting for music stand. User may force lights on when music stand is connected to phone.&#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+    <setting ref="KAccServerSyncStandLights" name="Accessory Server Sync Stand Lights" type="int">
+      <desc>Lights setting for synchronization stand. User may force lights on when synchronization stand is connected to phone.&#xD;
+Possible integer values:&#xD;
+0 lights off&#xD;
+1 lights on&#xD;
+</desc>
+    </setting>
+  </feature>
+  <data>
+    <KCRUidAccServerSettings>
+      <KAccServerHWDevices>4</KAccServerHWDevices>
+      <KAccServerWiredHSLights>0</KAccServerWiredHSLights>
+      <KAccServerWirelessHSLights>0</KAccServerWirelessHSLights>
+      <KAccServerWiredCarKitLights>0</KAccServerWiredCarKitLights>
+      <KAccServerWirelessCarKitLights>0</KAccServerWirelessCarKitLights>
+      <KAccServerTextDeviceLights>0</KAccServerTextDeviceLights>
+      <KAccServerLoopsetLights>0</KAccServerLoopsetLights>
+      <KAccServerMusicStandLights>0</KAccServerMusicStandLights>
+      <KAccServerSyncStandLights>0</KAccServerSyncStandLights>
+    </KCRUidAccServerSettings>
+  </data>
+  <rfs>
+    <KCRUidAccServerSettings>
+      <KAccServerHWDevices>true</KAccServerHWDevices>
+      <KAccServerWiredHSLights>true</KAccServerWiredHSLights>
+      <KAccServerWirelessHSLights>true</KAccServerWirelessHSLights>
+      <KAccServerWiredCarKitLights>true</KAccServerWiredCarKitLights>
+      <KAccServerWirelessCarKitLights>true</KAccServerWirelessCarKitLights>
+      <KAccServerTextDeviceLights>true</KAccServerTextDeviceLights>
+      <KAccServerLoopsetLights>true</KAccServerLoopsetLights>
+      <KAccServerMusicStandLights>true</KAccServerMusicStandLights>
+      <KAccServerSyncStandLights>true</KAccServerSyncStandLights>
+    </KCRUidAccServerSettings>
+  </rfs>
+</configuration>
Binary file configurationengine/source/cone/confml/tests/data/booleans.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/commsdatcreator.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1667 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="Default CommsDat settings" version="1">
+  <feature name="CommsDat generation" ref="KCRUidCommsDatCreator">
+    <desc>Used to configure whether CommsDat generation from these settings is enabled.</desc>    
+    <setting name="CommsDat generation enabled" ref="KCommsDatCreatorInputFileName" type="string">
+      <desc>This is the master switch that determines whether CommsDat is created in the first boot 
+    	of the device based on Configuration Tool output. Set this to Yes if you are creating variant 
+    	and need to configure anything under Default CommsDat settings.</desc>
+      <option name="No" value=""/>
+      <option name="Yes" value="VariantData_commsdat.xml"/>
+    </setting>
+    <setting name="CommsDatCreator startup status flag" readOnly="true" ref="KCommsDatCreatorStartupStatus">
+      <desc>Read-only flag that indicates the CommsDatCreator start-up status in runtime.</desc>
+    </setting>
+  </feature>
+  <feature name="Global settings" ref="Global">
+    <desc>
+  	Global networking related settings not tied to individual connection methods.
+  	</desc>
+    <setting name="Attachmode" ref="Attachmode" type="selection">
+      <desc>
+      GPRS attach mode (attach when needed/when available).
+      </desc>
+      <option name="When available" value="whenavailable"/>
+      <option name="When needed" value="whenneeded"/>
+    </setting>
+    <setting name="Default access point" ref="DefaultAP" type="string">
+      <desc>
+    	Default GPRS access point. Used when the phone is used as a modem for a PC.
+    	The corresponding UI setting is Connection-Packet data-Access point.
+    	</desc>
+    </setting>
+    <setting name="Default icon for DNs" ref="DefaultDnIcon" type="selection">
+      <desc>
+      Default icon for destination networks.
+      </desc>
+      <option name="internet" value="0"/>
+      <option name="wap" value="1"/>
+      <option name="mms" value="2"/>
+      <option name="intranet" value="3"/>
+      <option name="operator" value="4"/>
+      <option name="icon1" value="5"/>
+      <option name="icon2" value="6"/>
+      <option name="icon3" value="7"/>
+      <option name="icon4" value="8"/>
+      <option name="icon5" value="9"/>
+      <option name="icon6" value="10"/>
+      <option name="default" value="11"/>
+    </setting>
+    <setting name="LAN bearer default priority" ref="PriorityLan" type="string">
+      <desc>
+    	Default priority for LAN bearer type.
+    	</desc>
+    </setting>
+    <setting name="WLAN bearer default priority" ref="PriorityWlan" type="string">
+      <desc>
+    	Default priority for WLAN bearer type.
+    	</desc>
+    </setting>
+    <setting name="PAN bearer default priority" ref="PriorityPan" type="string">
+      <desc>
+    	Default priority for PAN bearer type.
+    	</desc>
+    </setting>
+    <setting name="Outgoing GPRS bearer default priority" ref="PriorityGprsOut" type="string">
+      <desc>
+    	Default priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+    <setting name="Incoming GPRS bearer default priority" ref="PriorityGprsIn" type="string">
+      <desc>
+    	Default priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+    <setting name="CDMA2000 bearer default priority" ref="PriorityCdma2k" type="string">
+      <desc>
+    	Default priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+    <setting name="DialOut ISP bearer default priority" ref="PriorityDialOut" type="string">
+      <desc>
+    	Default priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+    <setting name="DialIn ISP bearer default priority" ref="PriorityDialIn" type="string">
+      <desc>
+    	Default priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+    <setting name="VPN bearer default priority" ref="PriorityVpn" type="string">
+      <desc>
+    	Default priority for VPN bearer type.
+    	</desc>
+    </setting>
+    <setting name="MIP bearer default priority" ref="PriorityMip" type="string">
+      <desc>
+    	Default priority for MIP bearer type.
+    	</desc>
+    </setting>
+    <setting name="LAN bearer default UI priority" ref="UIPriorityLan" type="string">
+      <desc>
+    	Default UI priority of LAN connection.
+    	</desc>
+    </setting>
+    <setting name="WLAN bearer default UI priority" ref="UIPriorityWlan" type="string">
+      <desc>
+    	Default UI priority for WLAN bearer type.
+    	</desc>
+    </setting>
+    <setting name="PAN bearer default UI priority" ref="UIPriorityPan" type="string">
+      <desc>
+    	Default UI priority for PAN bearer type.
+    	</desc>
+    </setting>
+    <setting name="Outgoing GPRS bearer default UI priority" ref="UIPriorityGprsOut" type="string">
+      <desc>
+    	Default UI priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+    <setting name="Incoming GPRS bearer default UI priority" ref="UIPriorityGprsIn" type="string">
+      <desc>
+    	Default UI priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+    <setting name="CDMA2000 bearer default UI priority" ref="UIPriorityCdma2k" type="string">
+      <desc>
+    	Default UI priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+    <setting name="DialOut ISP bearer default UI priority" ref="UIPriorityDialOut" type="string">
+      <desc>
+    	Default UI priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+    <setting name="DialIn ISP bearer default UI priority" ref="UIPriorityDialIn" type="string">
+      <desc>
+    	Default UI priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+    <setting name="VPN bearer default UI priority" ref="UIPriorityVpn" type="string">
+      <desc>
+    	Default UI priority for VPN bearer type.
+    	</desc>
+    </setting>
+    <setting name="MIP bearer default UI priority" ref="UIPriorityMip" type="string">
+      <desc>
+    	Default UI priority for MIP bearer type.
+    	</desc>
+    </setting>
+    <setting name="Default connection type" ref="DefaultConnectionType" type="selection">
+      <desc>
+      Specifies how the applications' default connection is specified.
+      </desc>
+      <option name="Ask once" value="Ask once"/>
+      <option name="Always ask" value="Always ask"/>
+      <option name="Destination" value="Destination"/>
+      <option name="Connection method" value="Connection method"/>
+    </setting>
+    <setting name="Default connection name" ref="DefaultConnectionName" type="string">
+      <desc>
+    	The name of the default connection (connection method or destination network). 
+    	Default connection type parameter needs to be set accordingly.
+    	</desc>
+    </setting>
+    <setting name="GPRS last socket activity timeout" ref="GprsLastSocketActivityTimeout">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="GPRS last session closed timeout" ref="GprsLastSessionClosedTimeout">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when session has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="GPRS last socket closed timeout" ref="GprsLastSocketClosedTimeout">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when socket has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="CSD last socket activity timeout" ref="CsdLastSocketActivityTimeout">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="CSD last session closed timeout" ref="CsdLastSessionClosedTimeout">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="CSD last socket closed timeout" ref="CsdLastSocketClosedTimeout">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="WLAN last socket activity timeout" ref="WlanLastSocketActivityTimeout">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="WLAN last session closed timeout" ref="WlanLastSessionClosedTimeout">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="WLAN last socket closed timeout" ref="WlanLastSocketClosedTimeout">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+    <setting name="WLAN background scan interval" ref="WlanBGScanInterval" type="selection">
+      <desc>
+      How often WLAN networks are scanned when idle.
+      </desc>
+      <option name="Never" value="0"/>
+      <option name="Every minute" value="60"/>
+      <option name="Every 2 minutes" value="120"/>
+      <option name="Every 5 minutes" value="300"/>
+      <option name="Every 10 minutes" value="600"/>
+    </setting>
+    <setting name="WLAN use default settings" ref="WlanUseDefSettings" type="selection">
+      <desc>Defines whether default values are being used for the advanced WLAN settings (recommended). </desc>
+      <option name="No" value="0"/>
+      <option name="Yes" value="1"/>
+    </setting>
+    <setting name="WLAN long retry limit" ref="WlanLongRetry">
+      <desc>Defines how many times packets bigger than RTS Threshold are been resent.</desc>
+    </setting>
+    <setting name="WLAN short retry limit" ref="WlanShortRetry">
+      <desc>Defines how many times packets smaller than RTS Threshold are been resent.</desc>
+    </setting>
+    <setting name="WLAN RTS threshold" ref="WlanRTS">
+      <desc>Minimum size of a packet for which CTS/RTS handshake has been used.</desc>
+    </setting>
+    <setting name="WLAN TX power level" ref="WlanTxPowerLevel" type="selection">
+      <desc>Transmission power level in use. In mWs. 4, 10 or 100 mW.</desc>
+      <option name="100 mW" value="100"/>
+      <option name="10 mW" value="10"/>
+      <option name="4 mW" value="4"/>
+    </setting>
+    <setting name="WLAN allow radio measurements" ref="WlanRadioMeasurements" type="selection">
+      <desc>Defines whether the CCX radio measurements are allowed.</desc>
+      <option name="No" value="0"/>
+      <option name="Yes" value="1"/>
+    </setting>
+    <setting name="WLAN power save" ref="WlanPowerMode" type="selection">
+      <desc>Defines whether power saving methods are active. Disabling WLAN
+      power save might increase interoperability but will dramatically shorten battery life.</desc>
+      <option name="On" value="1"/>
+      <option name="Off" value="0"/>
+    </setting>
+  </feature>
+  <feature name="GPRS Access Points" ref="APs" relevant="">
+    <desc>GPRS connection method (CM) definitions</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="GPRS" ref="AP" relevant="" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="Network type" ref="NetworkType" type="selection">
+        <desc>Addressing that the network uses.</desc>
+        <option name="IPv4" value="IPv4"/>
+        <option name="IPv6" value="IPv6"/>
+      </setting>
+      <setting name="GPRS Access Point Name" ref="GPRS_AP_Name" type="string">
+        <desc>The access point name for this GPRS connection</desc>
+      </setting>
+      <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+      <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+      <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+        <option name="Normal" value="Normal"/>
+        <option name="Secure" value="Secure"/>
+      </setting>
+      <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+      <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+      <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+        <option name="On" value="On"/>
+        <option name="Off" value="Off"/>
+      </setting>
+      <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+        <option name="Continuous" value="Continuous"/>
+        <option name="Temporary" value="Temporary"/>
+      </setting>
+      <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="GPRS Use EDGE" ref="GprsUseEdge" type="selection">
+        <desc>Allow EDGE usage.</desc>
+        <option name="Yes" value="Yes"/>
+        <option name="No" value="No"/>
+      </setting>
+      <setting name="ISP Type" ref="IspType" type="selection">
+      <desc>Specifies the service provider type. Used when filtering connection methods for certain purpose.</desc>
+         	<option name="Internet" value="0"/> 
+          <option name="WAP" value="1"/> 
+      		<option name="Both" value="2"/> 
+      </setting>
+    </setting>
+  </feature>
+  <feature name="WLAN Access Points" ref="WLAN_APs" relevant="">
+    <desc>WLAN connection method (CM) definitions</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="WLAN" ref="WLAN_AP" relevant="" type="sequence">
+      <setting constraint="" name="Connection Name" ref="ConnectionName" required="" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="Network Name" ref="NetworkName" type="string">
+        <desc>Service set identifier (SSID) of the primary WLAN network.</desc>
+      </setting>
+      <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+      <setting name="Network Mode" ref="NetworkMode" type="string">
+        <desc>Determines the network infrastructure. 
+        If there is a WLAN access point in the network then this should be Infrastructure.</desc>
+        <option name="Infrastructure" value="Infrastructure"/>
+        <option name="Ad-hoc" value="Ad-hoc"/>
+      </setting>
+      <setting name="Security Mode" ref="SecurityMode" type="selection">
+        <desc>Security mode of the WLAN network.</desc>
+        <option name="Open" value="Open"/>
+        <option name="WEP" value="WEP"/>
+        <option name="802.1x" value="802.1x"/>
+        <option name="WPA" value="WPA"/>
+        <option name="WPA2" value="WPA2"/>
+      </setting>
+      <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="WLAN IP Gateway Address" ref="WlanIpGatewayAddress" type="string">
+      <desc>The gateway IP address. 
+      Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="Wlan IP Net Mask" ref="WlanIpNetMask" type="string">
+      	<desc>Network mask. Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="WLAN Scan SSID" ref="WLANScanSSID" type="selection">
+        <desc>Defines whether the SSID should be actively scanned. 
+        This is needed if the SSID is hidden (not broadcasted by the AP) </desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="WLAN Channel ID" ref="WlanChannelId" type="string">
+        <desc>
+      	802.11 Channel ID (1-14). Used only when connecting/setting up adhoc network.
+      	</desc>
+      </setting>
+      <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="WEP Key In Use" ref="WEPKeyInUse" type="selection">
+        <desc>Index of default WEP key. Used only when security mode is WEP.</desc>
+        <option name="key1" value="key1"/>
+        <option name="key2" value="key2"/>
+        <option name="key3" value="key3"/>
+        <option name="key4" value="key4"/>
+      </setting>
+      <setting name="WEP Auth Type" ref="WEPAuthType" type="selection">
+        <desc>WEP authentication mode. Only used when security mode is WEP.</desc>
+        <option name="Shared" value="Shared"/>
+        <option name="Open" value="Open"/>
+      </setting>
+      <setting name="WEP Key1 Length" ref="WEPKey1Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting name="WEP Key1 Format" ref="WEPKey1Format" type="selection">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting name="WEP Key1 Data" ref="WEPKey1Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting name="WEP Key2 Length" ref="WEPKey2Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting name="WEP Key2 Format" ref="WEPKey2Format" type="selection">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting name="WEP Key2 Data" ref="WEPKey2Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting name="WEP Key3 Length" ref="WEPKey3Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting name="WEP Key3 Format" ref="WEPKey3Format" type="selection">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting name="WEP Key3 Data" ref="WEPKey3Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting name="WEP Key4 Length" ref="WEPKey4Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting name="WEP Key4 Format" ref="WEPKey4Format" type="selection">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting name="WEP Key4 Data" ref="WEPKey4Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting name="WPA Pre-shared Key" ref="WPAPresharedKey" type="string">
+        <desc>WPA/WPA2 pre-shared key in plain text. ASCII character set values between 32-126 must be used. Minimum length is 8 characters and maximum 63.
+        You need to also define the WPA pre-shared key length field accordingly</desc>
+      </setting>
+      <setting name="WPA Use of Pre-shared Key" ref="WPAUseOfPresharedKey" type="selection">
+        <desc>Specifies that when the security mode is WPA or WPA2 if the PSK mode is enabled. 
+        If this is off then EAP mode is used and the list of EAPs needs to be defined.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="WPA Pre-shared key length" ref="WPAKeyLength">
+        <desc>The length of the specified pre-shared key (in WPA pre-shared key field)</desc>
+      </setting>
+      <setting name="WPA List Of EAPs" ref="WPAListOfEAPs" type="string">
+        <desc>
+      	A list of Extensible Authentication Protocols (EAPs) in use. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM the string needs to be "+018". 
+      	The list is in priority order, highest priority first.      	
+      	</desc>
+      </setting>
+      <setting name="EAP-GTC user name" ref="EapGtcUsername" type="string">
+        <desc>The username used with EAP-GTC.</desc>
+      </setting>
+      <setting name="EAP-GTC session validity time" ref="EapGtcSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+      <setting name="EAP-GTC tunneling method" ref="EapGtcEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-GTC.</desc>
+        <option name="EAP-PEAP" value="25"/>
+        <option name="EAP-TTLS" value="21"/>
+        <option name="EAP-FAST" value="43"/>
+      </setting>
+      <setting name="EAP-TLS user name" ref="EapTlsUsername" type="string">
+        <desc>The username used with EAP-TLS.</desc>
+      </setting>
+      <setting name="EAP-TLS realm" ref="EapTlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-TLS verify server realm" ref="EapTlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-TLS require client authentication" ref="EapTlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TLS requires that the server authenticates it (the client).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-TLS session validity time" ref="EapTlsSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+      <setting name="EAP-TLS cipher suites" ref="EapTlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+      <setting name="EAP-TLS user certificate subject key id" ref="EapTlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate. 
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-TLS user certificate issuer" ref="EapTlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TLS user certificate serial number" ref="EapTlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TLS CA certificate subject key id" ref="EapTlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-TLS CA certificate issuer" ref="EapTlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TLS CA certificate serial number" ref="EapTlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TLS tunneling method" ref="EapTlsEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-TLS.</desc>
+        <option name="None" value=""/>
+        <option name="EAP-PEAP" value="25"/>
+        <option name="EAP-TTLS" value="21"/>
+        <option name="EAP-FAST" value="43"/>
+      </setting>
+      <setting name="EAP-LEAP user name" ref="EapLeapUsername" type="string">
+        <desc>The username used with EAP-LEAP.</desc>
+      </setting>
+      <setting name="EAP-LEAP password" ref="EapLeapPassword" type="string">
+        <desc>The password used with EAP-LEAP.</desc>
+      </setting>
+      <setting name="EAP-LEAP session validity time" ref="EapLeapSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+      <setting name="EAP-SIM user name" ref="EapSimUsername" type="string">
+        <desc>The username used with EAP-SIM.</desc>
+      </setting>
+      <setting name="EAP-SIM realm" ref="EapSimRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-SIM pseudonyms allowed" ref="EapSimUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-SIM session validity time" ref="EapSimSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+      <setting name="EAP-SIM tunneling method" ref="EapSimEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-SIM.</desc>
+        <option name="None" value=""/>
+        <option name="EAP-PEAP" value="25"/>
+        <option name="EAP-TTLS" value="21"/>
+        <option name="EAP-FAST" value="43"/>
+      </setting>
+      <setting name="EAP-TTLS user name" ref="EapTtlsUsername" type="string">
+        <desc>The username used with EAP-TTLS.</desc>
+      </setting>
+      <setting name="EAP-TTLS realm" ref="EapTtlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-TTLS verify server realm" ref="EapTtlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-TTLS require client authentication" ref="EapTtlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-TTLS session validity time" ref="EapTtlsSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+      <setting name="EAP-TTLS cipher suites" ref="EapTtlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+      <setting name="EAP-TTLS tunneled methods" ref="EapTtlsEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-TTLS. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+      <setting name="EAP-TTLS user certificate subject key id" ref="EapTtlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-TTLS user certificate issuer" ref="EapTtlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TTLS user certificate serial number" ref="EapTtlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TTLS CA certificate subject key id" ref="EapTtlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-TTLS CA certificate issuer" ref="EapTtlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-TTLS CA certificate serial number" ref="EapTtlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-AKA user name" ref="EapAkaUsername" type="string">
+        <desc>The username used with EAP-AKA.</desc>
+      </setting>
+      <setting name="EAP-AKA realm" ref="EapAkaRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-AKA pseudonyms allowed" ref="EapAkaUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-AKA session validity time" ref="EapAkaSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+      <setting name="EAP-AKA tunneling method" ref="EapAkaEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-AKA.</desc>
+        <option name="None" value=""/>
+        <option name="EAP-PEAP" value="25"/>
+        <option name="EAP-TTLS" value="21"/>
+        <option name="EAP-FAST" value="43"/>
+      </setting>
+      <setting name="EAP-PEAP user name" ref="EapPeapUsername" type="string">
+        <desc>The username used with EAP-PEAP.</desc>
+      </setting>
+      <setting name="EAP-PEAP realm" ref="EapPeapRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-PEAP verify server realm" ref="EapPeapVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-PEAP require client authentication" ref="EapPeapRequireClientAuth" type="selection">
+        <desc>Specifies whether PEAP requires that the server authenticates it (the client).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-PEAP session validity time" ref="EapPeapSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+      <setting name="EAP-PEAP cipher suites" ref="EapPeapCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+      <setting name="EAP-PEAP version 0 allowed" ref="EapPeapV0Allowed" type="selection">
+        <desc>Is PEAP version 0 allowed. If in doubt enable only this one.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-PEAP version 1 allowed" ref="EapPeapV1Allowed" type="selection">
+        <desc>Is PEAP version 1 allowed.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-PEAP version 2 allowed" ref="EapPeapV2Allowed" type="selection">
+        <desc>Is PEAP version 2 allowed.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-PEAP tunneled methods" ref="EapPeapEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-PEAP. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+      <setting name="EAP-PEAP user certificate subject key id" ref="EapPeapUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-PEAP user certificate issuer" ref="EapPeapUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-PEAP user certificate serial number" ref="EapPeapUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-PEAP CA certificate subject key id" ref="EapPeapCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-PEAP CA certificate issuer" ref="EapPeapCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-PEAP CA certificate serial number" ref="EapPeapCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-MSCHAPv2 user name" ref="EapMschapv2Username" type="string">
+        <desc>The username used with EAP-MSCHAPv2.</desc>
+      </setting>
+      <setting name="EAP-MSCHAPv2 password" ref="EapMschapv2Password" type="string">
+        <desc>The password used with EAP-MSCHAPv2.</desc>
+      </setting>
+      <setting name="EAP-MSCHAPv2 session validity time" ref="EapMschapv2SessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+      <setting name="EAP-MSCHAPv2 tunneling method" ref="EapMschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-MSCHAPv2.</desc>
+        <option name="EAP-PEAP" value="25"/>
+        <option name="EAP-TTLS" value="21"/>
+        <option name="EAP-FAST" value="43"/>
+      </setting>
+      <setting name="EAP-FAST user name" ref="EapFastUsername" type="string">
+        <desc>The username used with EAP-FAST.</desc>
+      </setting>
+      <setting name="EAP-FAST realm" ref="EapFastRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+      <setting name="EAP-FAST verify server realm" ref="EapFastVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST require client authentication" ref="EapFastRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST session validity time" ref="EapFastSessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+      <setting name="EAP-FAST cipher suites" ref="EapFastCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+      <setting name="EAP-FAST tunneled methods" ref="EapFastEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-FAST. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+      <setting name="EAP-FAST authenticated provisioning mode allowed" ref="EapFastAuthProvModeAllowed" type="selection">
+        <desc>EAP-FAST authenticated provisioning mode allowed</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST unauthenticated provisioning mode allowed" ref="EapFastUnauthProvModeAllowed" type="selection">
+        <desc>EAP-FAST unauthenticated provisioning mode allowed</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST warn ADHP no PAC" ref="EapFastWarnADHPNoPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no PAC</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST warn ADHP no matching PAC" ref="EapFastWarnADHPNoMatchingPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no matching PAC</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST warn not default server" ref="EapFastWarnNotDefaultServer" type="selection">
+        <desc>EAP-FAST warn not default server</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="EAP-FAST user certificate subject key id" ref="EapFastUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-FAST user certificate issuer" ref="EapFastUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-FAST user certificate serial number" ref="EapFastUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-FAST CA certificate subject key id" ref="EapFastCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+      <setting name="EAP-FAST CA certificate issuer" ref="EapFastCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="EAP-FAST CA certificate serial number" ref="EapFastCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+      <setting name="MSCHAPv2 user name" ref="Mschapv2Username" type="string">
+        <desc>The username used with MSCHAPv2.</desc>
+      </setting>
+      <setting name="MSCHAPv2 password" ref="Mschapv2Password" type="string">
+        <desc>The password used with MSCHAPv2.</desc>
+      </setting>
+      <setting name="MSCHAPv2 session validity time" ref="Mschapv2SessionValidityTime">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+      <setting name="MSCHAPv2 tunneling method" ref="Mschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with MSCHAPv2. Needs to be EAP-TTLS.</desc>
+        <option name="EAP-TTLS" value="21"/>
+      </setting>
+    </setting>
+  </feature>
+  <feature name="CSD Access Points" ref="CSD_APs" relevant="">
+    <desc>Circuit-Switched Data connection methods</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="CSD" ref="CSD_AP" relevant="" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="User Name" ref="UserName" type="string">
+        <desc>Username for the connection.</desc>
+      </setting>
+      <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password on connection set-up time.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+      <setting name="Password Authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication type.</desc>
+        <option name="Normal" value="Normal"/>
+        <option name="Secure" value="Secure"/>
+      </setting>
+      <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP.</desc>
+      </setting>
+      <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Starting page.</desc>
+      </setting>
+      <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>WTLS security.</desc>
+        <option name="On" value="On"/>
+        <option name="Off" value="Off"/>
+      </setting>
+      <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Connection type.</desc>
+        <option name="Continuous" value="Continuous"/>
+        <option name="Temporary" value="Temporary"/>
+      </setting>
+      <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+      <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+        <option name="Autodetect" value="Autodetect"/>
+        <option name="9600" value="9600"/>
+        <option name="14400" value="14400"/>
+        <option name="19200" value="19200"/>
+        <option name="28800" value="28800"/>
+        <option name="38400" value="38400"/>
+        <option name="43200" value="43200"/>
+        <option name="56000" value="56000"/>
+      </setting>
+      <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+        <option name="Analogue" value="Analogue"/>
+        <option name="Isdn v110" value="Isdn v110"/>
+        <option name="Isdn v120" value="Isdn v120"/>
+      </setting>
+      <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+        <option name="Yes" value="Yes"/>
+        <option name="No" value="No"/>
+      </setting>
+      <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+        <option name="Server Number" value="Server Number"/>
+        <option name="Other Number" value="Other Number"/>
+      </setting>
+      <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+      <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+        <option name="Yes" value="Yes"/>
+        <option name="No" value="No"/>
+      </setting>
+      <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+      <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+  <feature name="HSCD Access Points" ref="HSCSD_APs" relevant="">
+    <desc>High-speed Circuit-Switched Data connection methods</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="HSCSD" ref="HSCSD_AP" relevant="" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+      <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+      <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+        <option name="Normal" value="Normal"/>
+        <option name="Secure" value="Secure"/>
+      </setting>
+      <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+      <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+      <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+        <option name="On" value="On"/>
+        <option name="Off" value="Off"/>
+      </setting>
+      <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+        <option name="Continuous" value="Continuous"/>
+        <option name="Temporary" value="Temporary"/>
+      </setting>
+      <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+      <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+        <option name="Autodetect" value="Autodetect"/>
+        <option name="9600" value="9600"/>
+        <option name="14400" value="14400"/>
+        <option name="19200" value="19200"/>
+        <option name="28800" value="28800"/>
+        <option name="38400" value="38400"/>
+        <option name="43200" value="43200"/>
+        <option name="56000" value="56000"/>
+      </setting>
+      <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+        <option name="Analogue" value="Analogue"/>
+        <option name="Isdn v110" value="Isdn v110"/>
+        <option name="Isdn v120" value="Isdn v120"/>
+      </setting>
+      <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+        <option name="Yes" value="Yes"/>
+        <option name="No" value="No"/>
+      </setting>
+      <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+        <option name="Server Number" value="Server Number"/>
+        <option name="Other Number" value="Other Number"/>
+      </setting>
+      <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+      <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+        <option name="Yes" value="Yes"/>
+        <option name="No" value="No"/>
+      </setting>
+      <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+      <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+  <feature name="LAN Access Points" ref="LAN_APs" relevant="">
+    <desc>LAN connection methods</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="LAN" ref="LAN_AP" relevant="" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+      <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+      <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+        <option name="On" value="On"/>
+        <option name="Off" value="Off"/>
+      </setting>
+      <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+        <option name="Continuous" value="Continuous"/>
+        <option name="Temporary" value="Temporary"/>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="LAN If Networks" ref="LanIfNetworks" type="string">
+        <desc>LAN interface networks.</desc>
+      </setting>
+      <setting name="LAN IP Netmask" ref="LanIpNetmask" type="string">
+        <desc>LAN interface netmask.</desc>
+      </setting>
+      <setting name="LAN IP Gateway" ref="LanIpGateway" type="string">
+        <desc>LAN IP Gateway.</desc>
+      </setting>
+      <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    </setting>
+  </feature>
+  <feature name="VPN Access Points" ref="VPN_APs" relevant="">
+    <desc>Virtual Private Network connection methods</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="VPN" ref="VPN_AP" relevant="" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+      <setting name="Connection ID" ref="ConnectionId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="ConfirmFirst"/>
+        <option name="Show Progress" value="ShowProgress"/>
+      </setting>
+      <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting name="Underlying IAP Name" ref="IAP_Name" type="string">
+        <desc>The network connection provider IAP name.</desc>
+      </setting>
+      <setting name="Service Policy" ref="ServicePolicy" type="string">
+        <desc>Service policy.</desc>
+      </setting>
+    </setting>
+  </feature>
+  <feature name="Destination Networks" ref="DNs">
+    <desc>Destination network (SNAP) definitions.</desc>
+    <setting constraint="" maxOccurs="99" minOccurs="0" name="DN" ref="DN" relevant="" type="sequence">
+      <setting name="Name" ref="Name" type="string">
+        <desc>The name that is visible to the user</desc>
+      </setting>
+      <setting name="Destination Network ID" ref="DNId">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+      <setting name="Metadata" ref="Metadata" type="selection">
+        <desc>Metadata that specifies a few default destination networks that applications can use</desc>
+        <option name="User Defined" value="UserDefined"/>
+        <option name="Internet" value="Internet"/>
+        <option name="Operator" value="Operator"/>
+        <option name="MMS" value="MMS"/>
+        <option name="Intranet" value="Intranet"/>
+      </setting>
+      <setting name="Protection Level" ref="Protection" type="selection">
+        <desc>DN protection level. Destination contents mean the connection methods inside the destination and their priorities. </desc>
+        <option name="No protection" value="0"/>
+        <option name="Destination and contents" value="1"/>
+        <option name="Destination" value="2"/>
+      </setting>
+      <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Is DN hidden or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Is DN hidden in CConnDlg or not</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Is DN highlighted or not.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting name="Icon" ref="Icon" type="selection">
+        <desc>Icon to be assigned to DN.</desc>
+        <option name="internet" value="0"/>
+        <option name="wap" value="1"/>
+        <option name="mms" value="2"/>
+        <option name="intranet" value="3"/>
+        <option name="operator" value="4"/>
+        <option name="icon1" value="5"/>
+        <option name="icon2" value="6"/>
+        <option name="icon3" value="7"/>
+        <option name="icon4" value="8"/>
+        <option name="icon5" value="9"/>
+        <option name="icon6" value="10"/>
+        <option name="default" value="11"/>
+      </setting>
+      <setting name="EmbeddedDN" ref="EmbeddedDN" type="string">
+        <desc>
+	    	Name of an embedded DN that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 1" ref="IAP" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 2" ref="IAP2" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 3" ref="IAP3" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 4" ref="IAP4" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 5" ref="IAP5" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 6" ref="IAP6" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 7" ref="IAP7" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 8" ref="IAP8" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 9" ref="IAP9" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+      <setting name="IAP Name 10" ref="IAP10" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <CSD_APs>
+      <CSD_AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+        <WTLS_Security>On</WTLS_Security>
+        <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+        <BearerSpeed>Autodetect</BearerSpeed>
+        <BearerCallTypeIsdn>Analogue</BearerCallTypeIsdn>
+        <CallbackEnabled>Yes</CallbackEnabled>
+        <CallbackType>Server Number</CallbackType>
+        <EnableSWCompression>No</EnableSWCompression>
+        <UseLoginScript>No</UseLoginScript>
+      </CSD_AP>
+    </CSD_APs>
+    <DNs>
+      <DN template="true">
+        <Metadata>User Defined</Metadata>
+        <Protection>0</Protection>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Icon>11</Icon>
+      </DN>
+      <DN extensionPolicy="replace">
+        <Name>Internet</Name>
+        <DNId>1</DNId>
+        <Metadata>Internet</Metadata>
+        <Protection>2</Protection>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>Yes</Highlighted>
+        <Icon>0</Icon>
+      </DN>
+      <DN>
+        <Name>MMS</Name>
+        <DNId>2</DNId>
+        <Metadata>MMS</Metadata>
+        <Protection>2</Protection>
+        <Hidden>No</Hidden>
+        <HiddenAgent>Yes</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Icon>2</Icon>
+      </DN>
+      <DN>
+        <Name>Operator</Name>
+        <DNId>3</DNId>
+        <Metadata>Operator</Metadata>
+        <Protection>2</Protection>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Icon>4</Icon>
+      </DN>
+    </DNs>
+    <Global>
+      <Attachmode>whenavailable</Attachmode>
+      <DefaultDnIcon>11</DefaultDnIcon>
+      <DefaultConnectionType>Ask once</DefaultConnectionType>
+      <DefaultConnectionName/>
+      <DefaultAP/>
+      <WlanUseDefSettings>1</WlanUseDefSettings>
+      <WlanBGScanInterval>0</WlanBGScanInterval>
+      <WlanTxPowerLevel>100</WlanTxPowerLevel>
+      <WlanRadioMeasurements>1</WlanRadioMeasurements>
+      <WlanPowerMode>1</WlanPowerMode>
+      <PriorityLan>0</PriorityLan>
+      <PriorityWlan>1</PriorityWlan>
+      <PriorityPan>2</PriorityPan>
+      <PriorityGprsOut>3</PriorityGprsOut>
+      <PriorityGprsIn>4</PriorityGprsIn>
+      <PriorityCdma2k>5</PriorityCdma2k>
+      <PriorityDialOut>6</PriorityDialOut>
+      <PriorityDialIn>7</PriorityDialIn>
+      <PriorityVpn>253</PriorityVpn>
+      <PriorityMip>254</PriorityMip>
+      <UIPriorityLan>9</UIPriorityLan>
+      <UIPriorityWlan>0</UIPriorityWlan>
+      <UIPriorityPan>8</UIPriorityPan>
+      <UIPriorityGprsOut>1</UIPriorityGprsOut>
+      <UIPriorityGprsIn>2</UIPriorityGprsIn>
+      <UIPriorityCdma2k>3</UIPriorityCdma2k>
+      <UIPriorityDialOut>4</UIPriorityDialOut>
+      <UIPriorityDialIn>5</UIPriorityDialIn>
+      <UIPriorityVpn>6</UIPriorityVpn>
+      <UIPriorityMip>7</UIPriorityMip>
+      <WlanLongRetry>4</WlanLongRetry>
+      <WlanShortRetry>7</WlanShortRetry>
+      <WlanRTS>2347</WlanRTS>
+      <CsdLastSocketActivityTimeout>300</CsdLastSocketActivityTimeout>
+      <CsdLastSessionClosedTimeout>1</CsdLastSessionClosedTimeout>
+      <CsdLastSocketClosedTimeout>300</CsdLastSocketClosedTimeout>
+      <WlanLastSocketActivityTimeout>-1</WlanLastSocketActivityTimeout>
+      <WlanLastSessionClosedTimeout>1</WlanLastSessionClosedTimeout>
+      <WlanLastSocketClosedTimeout>-1</WlanLastSocketClosedTimeout>
+      <GprsLastSocketActivityTimeout>-1</GprsLastSocketActivityTimeout>
+      <GprsLastSessionClosedTimeout>1</GprsLastSessionClosedTimeout>
+      <GprsLastSocketClosedTimeout>-1</GprsLastSocketClosedTimeout>
+    </Global>
+    <APs>
+      <AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <NetworkType>IPv4</NetworkType>
+        <PromptPassword>No</PromptPassword>
+        <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+        <WTLS_Security>On</WTLS_Security>
+        <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+        <GprsUseEdge>Yes</GprsUseEdge>
+      </AP>
+    </APs>
+    <HSCSD_APs>
+      <HSCSD_AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <PromptPassword>No</PromptPassword>
+        <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+        <WTLS_Security>On</WTLS_Security>
+        <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+        <BearerSpeed>Autodetect</BearerSpeed>
+        <BearerCallTypeIsdn>Analogue</BearerCallTypeIsdn>
+        <CallbackEnabled>Yes</CallbackEnabled>
+        <CallbackType>Server Number</CallbackType>
+        <EnableSWCompression>No</EnableSWCompression>
+        <UseLoginScript>No</UseLoginScript>
+      </HSCSD_AP>
+    </HSCSD_APs>
+    <LAN_APs>
+      <LAN_AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>Confirm first</Seamlessness>
+        <WTLS_Security>On</WTLS_Security>
+        <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      </LAN_AP>
+    </LAN_APs>
+    <WLAN_APs>
+      <WLAN_AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <NetworkMode>Infrastructure</NetworkMode>
+        <SecurityMode>Open</SecurityMode>
+        <WLANScanSSID>No</WLANScanSSID>
+        <WEPKeyInUse>key1</WEPKeyInUse>
+        <WEPAuthType>Shared</WEPAuthType>
+        <WEPKey1Length>64</WEPKey1Length>
+        <WEPKey1Format>ASCII</WEPKey1Format>
+        <WEPKey2Length>64</WEPKey2Length>
+        <WEPKey2Format>ASCII</WEPKey2Format>
+        <WEPKey3Length>64</WEPKey3Length>
+        <WEPKey3Format>ASCII</WEPKey3Format>
+        <WEPKey4Length>64</WEPKey4Length>
+        <WEPKey4Format>ASCII</WEPKey4Format>
+        <WPAUseOfPresharedKey>No</WPAUseOfPresharedKey>
+        <WPAKeyLength>0</WPAKeyLength>
+      </WLAN_AP>
+    </WLAN_APs>
+    <VPN_APs>
+      <VPN_AP template="true">
+        <Protected>No</Protected>
+        <Hidden>No</Hidden>
+        <HiddenAgent>No</HiddenAgent>
+        <Highlighted>No</Highlighted>
+        <Seamlessness>ConfirmFirst</Seamlessness>
+      </VPN_AP>
+    </VPN_APs>
+    <KCRUidCommsDatCreator>
+      <KCommsDatCreatorStartupStatus>0</KCommsDatCreatorStartupStatus>
+      <KCommsDatCreatorInputFileName>VariantData_commsdat.xml</KCommsDatCreatorInputFileName>
+    </KCRUidCommsDatCreator>
+  </data>
+  <rfs>
+    <KCRUidCommsDatCreator>
+      <KCommsDatCreatorStartupStatus>false</KCommsDatCreatorStartupStatus>
+      <KCommsDatCreatorInputFileName>false</KCommsDatCreatorInputFileName>
+    </KCRUidCommsDatCreator>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/cvc_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="CVC_2DigitDialing.confml"/>
+  <xi:include href="CVC_ActiveIdleNotifiers.confml"/>
+  <xi:include href="CVC_ActiveIdleOther.confml"/>
+  <xi:include href="CVC_CellInfoDisplay.confml"/>
+  <xi:include href="CVC_CPHSALS.confml"/>
+  <xi:include href="CVC_CustomerMenu.confml"/>
+  <xi:include href="CVC_InstantMessaging.confml"/>
+  <xi:include href="CVC_NokiaPCInternetAccess.confml"/>
+  <xi:include href="CVC_OperatorLogo.confml"/>
+  <xi:include href="CVC_Preinstalled.confml"/>
+  <xi:include href="CVC_RightSoftkey.confml"/>
+  <xi:include href="CVC_StartupShutdownAnimations.confml"/>
+  <xi:include href="CVC_Streaming.confml"/>
+  <xi:include href="CVC_SyncML.confml"/>
+  <xi:include href="CVC_ThemeWallpaperScreensaver.confml"/>
+  <xi:include href="CVC_VoiceMailbox.confml"/>
+  <xi:include href="CVC_AppShell323.confml"/>
+  <xi:include href="CVC_ZeroPlusSend.confml"/>
+  <xi:include href="cvc_view.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/cvc_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <confml:view id="CVC" name="Custom modeled ConfMLs for customization / foo">
+    <confml:desc>Custom modeled ConfMLs for E75 customization according to E75 Customization Guidelines</confml:desc>
+    <confml:group name="Applications">
+      <confml:desc>Settings for standard S60 Platform applications</confml:desc>
+      <confml:icon xlink:href="applications_48_nav.png"/>
+      <confml:group name="Browser">
+        <confml:desc>Browser (xHTML) settings</confml:desc>
+      </confml:group>
+      <confml:group name="Calendar">
+        <confml:desc>Calendar</confml:desc>
+      </confml:group>
+      <confml:group name="Device Manager">
+        <confml:desc>Settings for Device Manager application.</confml:desc>
+      </confml:group>
+      <confml:group name="Media Player">
+        <confml:desc>Media Player</confml:desc>
+      </confml:group>
+      <confml:group name="Voice Recorder">
+        <confml:desc>Voice Recorder</confml:desc>
+      </confml:group>
+      <confml:group name="Phonebook">
+        <confml:desc>Phonebook</confml:desc>
+      </confml:group>
+      <confml:group name="Logs">
+        <confml:desc>Logs</confml:desc>
+      </confml:group>
+      <confml:group name="Camcorder">
+        <confml:desc>Camcorder</confml:desc>
+      </confml:group>
+      <confml:group name="Clock">
+        <confml:desc>Clock</confml:desc>
+      </confml:group>
+      <confml:group name="Profiles">
+        <confml:desc>Profiles</confml:desc>
+      </confml:group>
+      <confml:group name="Positioning">
+        <confml:desc>Positioning</confml:desc>
+      </confml:group>
+      <confml:group name="Instant Messaging">
+        <confml:desc>Instant Messaging</confml:desc>
+        <confml:setting ref="CVC_InstantMessaging/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Connectivity">
+      <confml:desc>Settings for personal communication and connection methods</confml:desc>
+      <confml:icon xlink:href="connectivity_48_nav.png"/>
+      <confml:group name="Access Points">
+        <confml:desc>Nokia NXX has StartUp Settings application. It configures access point settings based on a SIM card�s MCC and MNC and the access point information supplied to Nokia by the network operators.</confml:desc>
+      </confml:group>
+      <confml:group name="MMS">
+        <confml:desc>If the Customer specifies MMS settings (including Access points) in their variant then the transceiver will be able to receive MMS messages straight away after having been powered-up.</confml:desc>
+      </confml:group>
+      <confml:group name="SMS">
+        <confml:desc>SMS Settings</confml:desc>
+      </confml:group>
+      <confml:group name="Postcard">
+        <confml:desc>Postcard settings</confml:desc>
+      </confml:group>
+      <confml:group name="E-mail">
+        <confml:desc>Customers may choose to define one set of common settings for the e-mail client in the Messaging application of the device.</confml:desc>
+      </confml:group>
+      <confml:group name="Messaging">
+        <confml:desc>Messaging</confml:desc>
+      </confml:group>
+      <confml:group name="Bluetooth">
+        <confml:desc>Bluetooth</confml:desc>
+      </confml:group>
+      <confml:group name="Streaming">
+        <confml:desc>Streaming</confml:desc>
+        <confml:setting ref="CVC_streaming/*"/>
+      </confml:group>
+      <confml:group name="Mobile TV">
+        <confml:desc>Mobile TV</confml:desc>
+      </confml:group>
+      <confml:group name="Voice and Video Mail">
+        <confml:desc>Settings for voice and video mailboxes</confml:desc>
+        <confml:setting ref="CVC_VoiceMailboxNumbers/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="System">
+      <confml:desc>System settings of S60 platform</confml:desc>
+      <confml:icon xlink:href="system_48_nav.png"/>
+      <confml:group name="Accessory Profiles">
+        <confml:desc>Accessory Profiles</confml:desc>
+      </confml:group>
+      <confml:group name="SyncML">
+        <confml:desc>SyncML</confml:desc>
+        <confml:setting ref="CVC_SyncML/*"/>
+        <confml:setting ref="CVC_SyncMLDataSync/*"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/*"/>
+      </confml:group>
+      <confml:group name="Light Sensor">
+        <confml:desc>Light Senso</confml:desc>
+      </confml:group>
+      <confml:group name="Java">
+        <confml:desc>Java Application Settings</confml:desc>
+      </confml:group>
+      <confml:group name="Other">
+        <confml:desc>Other</confml:desc>
+        <confml:setting ref="CVC_CellInfoDisplay/*"/>
+        <confml:setting ref="CVC_ZeroPlusSend/*"/>
+        <confml:setting ref="CVC_2DigitDialing/*"/>
+        <confml:setting ref="CVC_CPHSALS/*"/>
+      </confml:group>
+      <confml:group name="Telephony">
+        <confml:desc>Telephony</confml:desc>
+      </confml:group>
+      <confml:group name="FOTA">
+        <confml:desc>Firmware update Over The Air</confml:desc>
+      </confml:group>
+      <confml:group name="Keyguard">
+        <confml:desc>Keypad lock settings</confml:desc>
+      </confml:group>
+      <confml:group name="Service Messages">
+        <confml:desc>Service Messages</confml:desc>
+      </confml:group>
+      <confml:group name="Vibra">
+        <confml:desc>Vibra</confml:desc>
+      </confml:group>
+      <confml:group name="TV-out">
+        <confml:desc>TV-out</confml:desc>
+      </confml:group>
+      <confml:group name="Software Install">
+        <confml:desc>Software Install</confml:desc>
+      </confml:group>
+    </confml:group>
+    <confml:group name="UI">
+      <confml:desc>Settings for branding, user interface and look &amp; feel</confml:desc>
+      <confml:icon xlink:href="userinterface_48_nav.png"/>
+      <confml:group name="Customer Menu">
+        <confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter.</confml:desc>
+        <confml:setting ref="CVC_OperatorMenu/*"/>
+      </confml:group>
+      <confml:group name="Customer Logo">
+        <confml:desc>The Nokia NXX supports colour logos in addition to the traditional black and white Customer logos.</confml:desc>
+        <confml:setting ref="CVC_OperatorLogo/*"/>
+      </confml:group>
+      <confml:group name="Ring Tones">
+        <confml:desc>Nokia NXX supports the following types of ring tones and alert tones. The Customer may select to include tones of their own in any of the listed formats. The Customer can specify one as the default ringing tone in the General profile.</confml:desc>
+      </confml:group>
+      <confml:group name="Start-up and shutdown animations">
+        <confml:desc>Start-up and shutdown animations</confml:desc>
+        <confml:setting ref="CVC_ShutdownAnimationSequence/*"/>
+        <confml:setting ref="CVC_StartupAnimationSequence/*"/>
+      </confml:group>
+      <confml:group name="Application Menu">
+        <confml:desc>Application Menu</confml:desc>
+        <confml:setting ref="CVC_AppShell323/*"/>
+      </confml:group>
+      <confml:group name="Themes">
+        <confml:desc>Themes</confml:desc>
+        <confml:setting ref="CVC_Theme_ref/*"/>
+      </confml:group>
+      <confml:group name="General">
+        <confml:desc>General</confml:desc>
+        <confml:setting ref="CVC_RSK/*"/>
+        <confml:setting ref="CVC_Wallpaper/*"/>
+        <confml:setting ref="CVC_Screensaver/*"/>
+      </confml:group>
+      <confml:group name="Nokia PC Internet Access">
+        <confml:desc>Nokia PC Internet Access a.k.a. Phone a modem</confml:desc>
+        <confml:setting ref="CVC_NokiaPCInternetAccess/*"/>
+      </confml:group>
+      <confml:group name="Homescreen">
+        <confml:desc>Homescreen or Active Idle customizations</confml:desc>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/*"/>
+        <confml:setting ref="CVC_ActiveIdleOther/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Pre-Installed Content">
+      <confml:desc>Applications, music, video and other files preinstalled to device</confml:desc>
+      <confml:icon xlink:href="preinstalledcontent_48_nav.png"/>
+      <confml:group name="Customer Applications">
+        <confml:desc>Customer specific Symbian and Java applications can be pre-installed to device memory (UDA).</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMCApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledUDAApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_BundledApplicationsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded MMS">
+        <confml:desc>Maximum amount of 3 Customer specific MMS messages may be pre-installed in the Device memory.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMSs"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Video">
+        <confml:desc>Customer specific video clips may be pre-installed in the User Data Area or Memory card. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledVideoClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Music">
+        <confml:desc>Customer can pre-load Music content in the User Data Area and/or memory card. They will be seen in Nseries Music Player. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMusicClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Images">
+        <confml:desc>Customer can pre-load images in the User Data Area and/or memory card. They will be seen in Photos application. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledImagesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-installed Ringtones">
+        <confml:desc>Pre-installed ringtones</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultMessageToneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultRingtoneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultVideoCallToneFile"/>
+      </confml:group>
+      <confml:group name="Pre-installed Certificates">
+        <confml:desc>Pre-installed security certificates (X.509)</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesInternet"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesMIDP"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesSymbian"/>
+      </confml:group>
+      <confml:group name="Pre-installed Themes">
+        <confml:desc>Pre-installed Themes</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledThemesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-defined Streaming Links">
+        <confml:desc>Pre-defined Streaming Links</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledStreamingLinksFolder"/>
+      </confml:group>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
Binary file configurationengine/source/cone/confml/tests/data/facets.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/data/multiselection.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Multiselection generation test" version="1">
+  <feature ref="MultiSelections" name="MultiSelections">
+    <setting ref="MultiSel1" name="MultiSel1" type="multiSelection">
+		<option name="Name1" value="first selection"/>
+		<option name="Name2" value="second selection"/>
+	</setting>
+  </feature>
+  <feature name="UDA content definition" ref="uda_content">
+        <setting name="UDA content directory" ref="uda_directory" type="string">
+                <desc>Folder containing content for UDA</desc>
+        </setting>
+        <setting name="Vanilla UDA content zipfiles" ref="vanilla_udafiles" type="sequence" mapKey="zipfile" mapValue="zipfile">
+                <setting name="Zip filename" ref="zipfile" type="string">
+                        <desc>A zip file name inside the uda content directory</desc>
+                </setting>
+        </setting>
+        <setting name="User UDA content zipfiles" ref="user_udafiles" type="sequence" mapKey="zipfile/localPath" mapValue="zipfile/localPath">
+                <setting name="Zip filename" ref="zipfile" type="file">
+                        <desc>A zip file name inside the uda content directory</desc>
+                        <localPath/>
+                        <targetPath readOnly="true"/>
+                </setting>
+        </setting>
+  </feature>
+	<feature name="UDA content selection" ref="uda_selection">
+	                <setting name="UDA content selection" ref="selectedfiles" type="multiSelection">
+	                  <option map="uda_content/vanilla_udafiles"/>
+	                </setting>
+	 </feature>  
+  
+  
+  <data>
+    <MultiSelections>
+      <MultiSel1>"first selection" "second selection"</MultiSel1>
+    </MultiSelections>
+	<uda_content>
+	      <uda_directory>/epoc32/data/uda/common001</uda_directory>
+	      <vanilla_udafiles>
+	        <zipfile>app1.zip</zipfile>
+	      </vanilla_udafiles>
+	      <vanilla_udafiles>
+	        <zipfile>app2.zip</zipfile>
+	      </vanilla_udafiles>
+	      <user_udafiles>
+	        <zipfile><localPath>user_app1.zip</localPath></zipfile>
+	      </user_udafiles>
+	</uda_content>
+    <uda_selection>
+      <selectedfiles></selectedfiles>
+    </uda_selection>   
+    
+  </data>
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/cone/confml/tests/data/voicemailbox.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/basic_setting_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+    
+    <confml:setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection">
+      <confml:desc>A multi-selection setting</confml:desc>
+      <confml:option name="Option 0" value="opt 0"/>
+      <confml:option name="Option 1" value="opt 1"/>
+      <confml:option name="Option 2" value="opt 2"/>
+      <confml:option name="Option 3" value="opt 3"/>
+      <confml:option name="Option 4" value="opt 4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+      <confml:MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</confml:MultiSelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+      <confml:MultiSelectionSetting>true</confml:MultiSelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/bitmask_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Bitmask test">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+    </BitmaskTest>
+  </data>
+  
+  <rfs>
+    <BitmaskTest>
+      <Bit0>false</Bit0>
+      <Bit1>true</Bit1>
+      <Bit2>false</Bit2>
+      <Bit3>true</Bit3>
+      <Bit4>false</Bit4>
+      <Bit5>true</Bit5>
+    </BitmaskTest>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/config_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<configuration name="platform1_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+  <xi:include href="platforms/platform2/root.confml" />
+  <xi:include href="foo/root.confml" />
+<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+    <cv:configuration-property name="platform_name" value="plat1" />
+  <version>Version1</version>
+  <platform>Platform1</platform>
+  <date>Date1</date>
+  <release>Release1</release>
+  <editor>Editor1</editor>
+  </meta>
+<desc>Description1</desc>
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/cone/confml/tests/testdata/read_write/facets.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,112 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Feature 1">
+  <feature ref="Feature1" name="Feature 1">
+    <desc>Feature with all supported setting types</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    
+    <setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection">
+      <desc>A multi-selection setting</desc>
+      <option name="Option 0" value="opt 0"/>
+      <option name="Option 1" value="opt 1"/>
+      <option name="Option 2" value="opt 2"/>
+      <option name="Option 3" value="opt 3"/>
+      <option name="Option 4" value="opt 4"/>
+    </setting>
+    
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+      <setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+        <desc>A multi-selection sub-setting</desc>
+        <option name="Option 0" value="opt 0"/>
+        <option name="Option 1" value="opt 1"/>
+        <option name="Option 2" value="opt 2"/>
+        <option name="Option 3" value="opt 3"/>
+        <option name="Option 4" value="opt 4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</MultiSelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 0"</MultiSelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 1"</MultiSelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+        <MultiSelectionSubSetting>"opt 2"</MultiSelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+      <MultiSelectionSetting>false</MultiSelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/cone/confml/tests/testdata/read_write/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/file_folder_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Time types test">
+  <confml:feature ref="FileFolderTest" name="File &amp; folder types test">
+    <confml:desc>Feature with file and folder setting types</confml:desc>
+    <confml:setting ref="FolderSetting" name="Folder setting" type="folder">
+      <confml:localPath/>
+      <confml:targetPath/>
+      <confml:desc>A folder setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="FileSetting" name="File setting" type="file">
+      <confml:localPath/>
+      <confml:targetPath/>
+      <confml:desc>A file setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:FileFolderTest>
+      <confml:FolderSetting>
+        <confml:localPath>default_folder</confml:localPath>
+        <confml:targetPath>default_target_folder/</confml:targetPath>
+      </confml:FolderSetting>
+      <confml:FileSetting>
+        <confml:localPath>default_file.txt</confml:localPath>
+        <confml:targetPath>default_target_folder/default_file_renamed.txt</confml:targetPath>
+      </confml:FileSetting>
+    </confml:FileFolderTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/name_id_mapping_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Test features for testing name-ID mappings">
+    <feature ref="NameIdMappingTestSourceSequences" name="Source sequences for name-ID mappings">
+        <setting ref="StringSequence" name="String sequence" type="sequence" mapKey="Value" mapValue="Value">
+            <setting ref="Value" name="Value sub-setting" type="string"/>
+        </setting>
+        
+        <setting ref="StringToStringSequence" name="String-to-string sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="string"/>
+        </setting>
+        
+        <setting ref="StringToIntSequence" name="String-to-int sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="int"/>
+        </setting>
+        
+        <setting ref="StringToRealSequence" name="String-to-real sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="real"/>
+        </setting>
+    </feature>
+
+
+    <feature ref="NameIdMappingTestTargetSettings" name="Target settings for name-ID mappings">
+        <setting ref="Selection" name="Selection setting" type="selection">
+            <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="Selection2" name="Selection setting 2" type="selection">
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="String" name="String setting" type="string">
+            <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="String2" name="String setting 2" type="string">
+            <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="Int" name="Int setting" type="int">
+            <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Real" name="Real setting" type="real">
+            <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Sequence" name="Sequence" type="sequence">
+            <setting ref="Selection" name="Selection sub-setting" type="selection">
+                <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="Selection2" name="Selection sub-setting 2" type="selection">
+                <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="String" name="String sub-setting" type="string">
+                <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="String2" name="String sub-setting 2" type="string">
+                <option map="NameIdMappingTestSourceSequences/StringToStringSequence"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="Int" name="Int sub-setting" type="int">
+                <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+            
+            <setting ref="Real" name="Real sub-setting" type="real">
+                <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+        </setting>
+    </feature>
+
+    <data>
+        <NameIdMappingTestSourceSequences>
+            <StringSequence template="true">
+                <Value></Value>
+            </StringSequence>
+            <StringSequence><Value>Entry 1</Value></StringSequence>
+            <StringSequence><Value>Entry 2</Value></StringSequence>
+            <StringSequence><Value>Entry 3</Value></StringSequence>
+            
+            <StringToStringSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToStringSequence>
+            <StringToStringSequence><Name>Entry 1</Name><Value>e 1</Value></StringToStringSequence>
+            <StringToStringSequence><Name>Entry 2</Name><Value>e 2</Value></StringToStringSequence>
+            <StringToStringSequence><Name>Entry 3</Name><Value>e 3</Value></StringToStringSequence>
+            
+            <StringToIntSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToIntSequence>
+            <StringToIntSequence><Name>Entry 1</Name><Value>100</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 2</Name><Value>120</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 3</Name><Value>130</Value></StringToIntSequence>
+            
+            
+            <StringToRealSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToRealSequence>
+            <StringToRealSequence><Name>Entry 1</Name><Value>1.1</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 2</Name><Value>1.2</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 3</Name><Value>1.3</Value></StringToRealSequence>
+        </NameIdMappingTestSourceSequences>
+        
+        
+        <NameIdMappingTestTargetSettings>
+            <Selection>none</Selection>
+            <Selection2>none</Selection2>
+            <String></String>
+            <String2></String2>
+            <Int>0</Int>
+            <Real>0</Real>
+            
+            <Sequence template="true">
+                <Selection>none</Selection>
+                <Selection2>none</Selection2>
+                <String></String>
+                <String2></String2>
+                <Int>0</Int>
+                <Real>0</Real>
+            </Sequence>
+            <Sequence>
+                <Selection>none</Selection>
+                <Selection2>none</Selection2>
+                <String></String>
+                <String2></String2>
+                <Int>0</Int>
+                <Real>0</Real>
+            </Sequence>
+        </NameIdMappingTestTargetSettings>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/option_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,133 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               name="Option test settings">
+    <feature ref="OptionTest" name="Option test">
+        <setting ref="Selection" name="Selection setting" type="selection">
+            <option name="Option 1" value="opt 1"/>
+            <option name="Option 2" value="opt 2"/>
+            <option name="Option 3" value="Option 3"/>
+            <option name="None" value="none"/>
+        </setting>
+        
+        <setting ref="String" name="String setting" type="string">
+            <option name="String 1" value="str 1"/>
+            <option name="String 2" value="str 2"/>
+            <option name="None" value=""/>
+        </setting>
+        
+        <setting ref="Boolean" name="Boolean setting" type="boolean">
+            <option name="Yes" value="true"/>
+            <option name="No" value="false"/>
+        </setting>
+        
+        <setting ref="Int" name="Int setting" type="int">
+            <option name="Zero" value="0"/>
+            <option name="One" value="1"/>
+            <option name="Two" value="2"/>
+        </setting>
+        
+        <setting ref="Real" name="Real setting" type="real">
+            <option name="Zero" value="0"/>
+            <option name="One" value="1"/>
+            <option name="One and a half" value="1.5"/>
+            <option name="Two" value="2"/>
+        </setting>
+        
+        <setting ref="Date" name="Date setting" type="date">
+            <option name="Unix epoch" value="1970-01-01Z"/>
+        </setting>
+        
+        <setting ref="Time" name="Time setting" type="time">
+            <option name="Noon" value="12:00:00"/>
+            <option name="Midnight" value="00:00:00"/>
+        </setting>
+        
+        <setting ref="DateTime" name="Date-time setting" type="dateTime">
+            <option name="Unix epoch" value="1970-01-01-00:00:00Z"/>
+        </setting>
+        
+        <setting ref="Duration" name="Duration setting" type="duration">
+            <option name="One week" value="P7D"/>
+            <option name="One day" value="PT24H"/>
+            <option name="1½ hours" value="PT1H30M"/>
+        </setting>
+        
+        <setting ref="Sequence" name="Sequence" type="sequence">
+            <setting ref="Selection" name="Selection sub-setting" type="selection">
+                <option name="Option 1" value="opt 1"/>
+                <option name="Option 2" value="opt 2"/>
+                <option name="Option 3" value="Option 3"/>
+                <option name="None" value="none"/>
+            </setting>
+            
+            <setting ref="String" name="String sub-setting" type="string">
+                <option name="String 1" value="str 1"/>
+                <option name="String 2" value="str 2"/>
+                <option name="None" value=""/>
+            </setting>
+            
+            <setting ref="Boolean" name="Boolean sub-setting" type="boolean">
+                <option name="Yes" value="true"/>
+                <option name="No" value="false"/>
+            </setting>
+            
+            <setting ref="Int" name="Int sub-setting" type="int">
+                <option name="Zero" value="0"/>
+                <option name="One" value="1"/>
+                <option name="Two" value="2"/>
+            </setting>
+            
+            <setting ref="Real" name="Real sub-setting" type="real">
+                <option name="Zero" value="0"/>
+                <option name="One" value="1"/>
+                <option name="One and a half" value="1.5"/>
+                <option name="Two" value="2"/>
+            </setting>
+            
+            <setting ref="Date" name="Date sub-setting" type="date">
+                <option name="Unix epoch" value="1970-01-01Z"/>
+            </setting>
+            
+            <setting ref="Time" name="Time sub-setting" type="time">
+                <option name="Noon" value="12:00:00"/>
+                <option name="Midnight" value="00:00:00"/>
+            </setting>
+            
+            <setting ref="DateTime" name="Date-time sub-setting" type="dateTime">
+                <option name="Unix epoch" value="1970-01-01-00:00:00Z"/>
+            </setting>
+            
+            <setting ref="Duration" name="Duration sub-setting" type="duration">
+                <option name="One week" value="P7D"/>
+                <option name="One day" value="PT24H"/>
+                <option name="1½ hours" value="PT1H30M"/>
+            </setting>
+        </setting>
+    </feature>
+
+    <data>
+        <OptionTest>
+            <Selection>none</Selection>
+            <String>str 1</String>
+            <Boolean>true</Boolean>
+            <Int>1</Int>
+            <Real>2</Real>
+            <Date>2009-09-09</Date>
+            <Time>07:00:00</Time>
+            <DateTime>2009-09-09-12:38:00+02:00</DateTime>
+            <Duration>PT0S</Duration>
+            
+            <Sequence>
+                <Selection>none</Selection>
+                <String>str 1</String>
+                <Boolean>true</Boolean>
+                <Int>1</Int>
+                <Real>2</Real>
+                <Date>2009-09-09</Date>
+                <Time>07:00:00</Time>
+                <DateTime>2009-09-09-12:38:00+02:00</DateTime>
+                <Duration>PT0S</Duration>
+            </Sequence>
+        </OptionTest>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/read_only_setting_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,172 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+               name="Read-only setting test">
+    <feature ref="ReadOnlySettingTest" name="Read-only setting test">
+        <desc>Feature for testing attribute 'readOnly' in settings.</desc>
+    
+        <setting ref="RealSetting" name="Real setting" type="real" readOnly="true">
+            <desc>A real setting</desc>
+        </setting>
+    
+        <setting ref="IntSetting" name="Int setting" type="int" readOnly="true">
+            <desc>An int setting</desc>
+        </setting>
+    
+        <setting ref="StringSetting" name="String setting" type="string" readOnly="true">
+            <desc>A string setting</desc>
+        </setting>
+    
+        <setting ref="BooleanSetting" name="Boolean setting" type="boolean" readOnly="true">
+            <desc>A boolean setting</desc>
+        </setting>
+    
+        <setting ref="SelectionSetting" name="Selection setting" type="selection" readOnly="true">
+            <desc>A selection setting</desc>
+            <option name="Option0" value="0"/>
+            <option name="Option1" value="1"/>
+            <option name="Option2" value="2"/>
+            <option name="Option3" value="3"/>
+            <option name="Option4" value="4"/>
+        </setting>
+    
+        <setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection" readOnly="true">
+            <desc>A multi-selection setting</desc>
+            <option name="Option 0" value="opt 0"/>
+            <option name="Option 1" value="opt 1"/>
+            <option name="Option 2" value="opt 2"/>
+            <option name="Option 3" value="opt 3"/>
+            <option name="Option 4" value="opt 4"/>
+        </setting>
+    
+        <setting ref="FolderSetting" name="Folder setting" type="folder" readOnly="true">
+            <localPath readOnly="true"/>
+            <targetPath readOnly="true"/>
+            <desc>A folder setting</desc>
+        </setting>
+    
+        <setting ref="FileSetting" name="File setting" type="file" readOnly="true">
+            <localPath readOnly="true"/>
+            <targetPath readOnly="true"/>
+            <desc>A file setting</desc>
+        </setting>
+        
+        <setting ref="DateSetting" name="Date setting" type="date" readOnly="true">
+            <desc>A date setting</desc>
+        </setting>
+        <setting ref="TimeSetting" name="Time setting" type="time" readOnly="true">
+            <desc>A time setting</desc>
+        </setting>
+        <setting ref="DateTimeSetting" name="Date-time setting" type="dateTime" readOnly="true">
+            <desc>A date-time setting</desc>
+        </setting>
+        <setting ref="DurationSetting" name="Duration setting" type="duration" readOnly="true">
+            <desc>A duration setting</desc>
+        </setting>
+    
+        <setting ref="SequenceSetting" name="Sequence setting" type="sequence" readOnly="true">
+            <desc>A sequence setting</desc>
+
+            <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+                <desc>A real sub-setting</desc>
+            </setting>
+
+            <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+                <desc>An int sub-setting</desc>
+            </setting>
+
+            <setting ref="StringSubSetting" name="String sub-setting" type="string">
+                <desc>A string sub-setting</desc>
+            </setting>
+
+            <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+                <desc>A boolean sub-setting</desc>
+            </setting>
+
+            <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+                <desc>A selection sub-setting</desc>
+                <option name="Op0" value="0"/>
+                <option name="Op1" value="1"/>
+                <option name="Op2" value="2"/>
+                <option name="Op3" value="3"/>
+                <option name="Op4" value="4"/>
+            </setting>
+
+            <setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+                <desc>A multi-selection sub-setting</desc>
+                <option name="Option 0" value="opt 0"/>
+                <option name="Option 1" value="opt 1"/>
+                <option name="Option 2" value="opt 2"/>
+                <option name="Option 3" value="opt 3"/>
+                <option name="Option 4" value="opt 4"/>
+            </setting>
+            
+            <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+                <localPath/>
+                <targetPath/>
+                <desc>A folder sub-setting</desc>
+            </setting>
+            
+            <setting ref="FileSubSetting" name="File sub-setting" type="file">
+                <localPath/>
+                <targetPath/>
+                <desc>A file sub-setting</desc>
+            </setting>
+            
+            <setting ref="DateSubSetting" name="Date sub-setting" type="date">
+                <desc>A date sub-setting</desc>
+            </setting>
+            <setting ref="TimeSubSetting" name="Time sub-setting" type="time">
+                <desc>A time sub-setting</desc>
+            </setting>
+            <setting ref="DateTimeSubSetting" name="Date-time sub-setting" type="dateTime">
+                <desc>A date-time sub-setting</desc>
+            </setting>
+            <setting ref="DurationSubSetting" name="Duration sub-setting" type="duration">
+                <desc>A duration sub-setting</desc>
+            </setting>
+
+        </setting>
+        
+    </feature>
+  
+  <data>
+    <ReadOnlySettingTest>
+        <RealSetting>3.14</RealSetting>
+        <IntSetting>10</IntSetting>
+        <StringSetting>default string</StringSetting>
+        <BooleanSetting>true</BooleanSetting>
+        <SelectionSetting>1</SelectionSetting>
+        <MultiSelectionSetting>"opt 0" "opt 2" "opt 4"</MultiSelectionSetting>
+        
+        <FolderSetting>
+            <localPath>default_folder</localPath>
+            <targetPath>default_target_folder/</targetPath>
+        </FolderSetting>
+        <FileSetting>
+            <localPath>default_file.txt</localPath>
+            <targetPath>default_target_folder/default_file_renamed.txt</targetPath>
+        </FileSetting>
+        
+        <DateSetting>2009-02-02</DateSetting>
+        <TimeSetting>07:30:15</TimeSetting>
+        <DateTimeSetting>2009-02-02-07:00:00</DateTimeSetting>
+        <DurationSetting>P5Y4M3DT12H25M15S</DurationSetting>
+        
+        <SequenceSetting>
+            <RealSubSetting>1.25</RealSubSetting>
+            <IntSubSetting>128</IntSubSetting>
+            <StringSubSetting>def1</StringSubSetting>
+            <BooleanSubSetting>false</BooleanSubSetting>
+            <SelectionSubSetting>1</SelectionSubSetting>
+            <MultiSelectionSubSetting>"opt 1"</MultiSelectionSubSetting>
+            <FolderSubSetting><localPath>seq/def1_folder</localPath></FolderSubSetting>
+            <FileSubSetting><localPath>seq/def1_file.txt</localPath></FileSubSetting>
+            <DateSubSetting>2009-02-02</DateSubSetting>
+            <TimeSubSetting>07:30:15</TimeSubSetting>
+            <DateTimeSubSetting>2009-02-02-07:00:00</DateTimeSubSetting>
+            <DurationSubSetting>P5Y4M3DT12H25M15S</DurationSubSetting>
+        </SequenceSetting>
+    </ReadOnlySettingTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/redefine_in_view_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="Redefine in view test">
+    <feature ref="RedefineInViewTest" name="Redefine in view test">
+        <setting ref="NameAndDescRedefinition" name="Name from base" type="string">
+            <desc>Description from base</desc>
+        </setting>
+        
+        <setting ref="IntWithOptions" name="Int setting with options" type="int">
+            <option name="Zero" value="0"/>
+            <option name="Small value" value="1"/>
+            <option name="Medium value" value="10"/>
+            <option name="Large value" value="100"/>
+        </setting>
+        
+        <setting ref="RealWithOptions" name="Real setting with options" type="real">
+            <option name="Zero" value="0"/>
+            <option name="Small value" value="0.001"/>
+            <option name="Medium value" value="0.1"/>
+            <option name="Large value" value="10"/>
+        </setting>
+        
+        <setting ref="StringWithOptions" name="String setting with options" type="string">
+            <option name="None" value="none"/>
+            <option name="UTF-8" value="u8"/>
+            <option name="UTF-16" value="u16"/>
+            <option name="UTF-16 Little-endian" value="u16le"/>
+            <option name="UTF-16 Big-endian" value="u16be"/>
+        </setting>
+    </feature>
+
+    <data>
+        <RedefineInViewTest>
+            <NameAndDescRedefinition>test</NameAndDescRedefinition>
+            <IntWithOptions>0</IntWithOptions>
+            <RealWithOptions>0</RealWithOptions>
+            <StringWithOptions>none</StringWithOptions>
+        </RedefineInViewTest>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/relevant_option_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2"
+               name="Relevant option test">
+  <feature ref="RelevantOptionTest" name="Relevant option test">
+    <desc>Feature for testing attribute 'relevant' in options.</desc>
+    
+    <setting ref="RealValue" name="Real value" type="real">
+      <desc>A real value used for filtering the options in NormalSelection.</desc>
+    </setting>
+    <setting ref="IntValue" name="Int value" type="int">
+      <desc>An int value used for filtering the options in NormalSelection.</desc>
+    </setting>
+    
+    <setting ref="NormalSelection" name="Normal selection" type="selection">
+      <desc>A selection setting</desc>
+      <option name="None" value="none"/>
+      <option name="Real > 1.5" value="real15" relevant="RealValue > 1.5"/>
+      <option name="Real = 3.0" value="real30" relevant="RealValue = 3.0"/>
+      <option name="Real &lt; 3.5" value="real35" relevant="RealValue &lt; 3.5"/>
+      <option name="Int > 15" value="int15" relevant="IntValue > 15"/>
+      <option name="Int = 30" value="int30" relevant="IntValue = 30"/>
+      <option name="Int &lt; 35" value="int35" relevant="IntValue &lt; 35"/>
+      <option name="Real = 3.0 and Int = 30" value="real30_and_int30" relevant="RealValue = 3.0 and IntValue = 30"/>
+      <option name="Real = 3.0 or Int = 30" value="real30_or_int30" relevant="RealValue = 3.0 or IntValue = 30"/>
+      <option name="Feature1/StringSetting = 'test'" value="f1st_is_test" relevant="Feature1/StringSetting = 'test'"/>
+    </setting>
+    
+    <setting ref="Sequence1" name="Sequence 1" type="sequence" mapKey="Value" mapValue="Value">
+        <setting ref="Value" name="Value" type="string"/>
+    </setting>
+    
+    <setting ref="Sequence2" name="Sequence 2" type="sequence" mapKey="Value" mapValue="Value">
+        <setting ref="Value" name="Value" type="string"/>
+    </setting>
+    
+    <setting ref="UseSequence1Items" name="Use items from sequence 1" type="boolean">
+      <desc>Determines whether sequence items from Sequence1 are used in NameIdMappedSelection.</desc>
+    </setting>
+    <setting ref="UseSequence2Items" name="Use items from sequence 2" type="boolean">
+      <desc>Determines whether sequence items from Sequence2 are used in NameIdMappedSelection.</desc>
+    </setting>
+    
+    <setting ref="NameIdMappedSelection" name="Name-ID mapped selection" type="selection">
+      <desc>A selection setting with name-ID mapped options</desc>
+      <option name="None" value="none"/>
+      <option map="RelevantOptionTest/Sequence1" relevant="UseSequence1Items = 'true'"/>
+      <option map="RelevantOptionTest/Sequence2" relevant="UseSequence2Items = 'true'"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <RelevantOptionTest>
+        <RealValue>0.5</RealValue>
+        <IntValue>5</IntValue>
+        <NormalSelection>none</NormalSelection>
+        
+        <Sequence1><Value>Sequence1 item 1</Value></Sequence1>
+        <Sequence1><Value>Sequence1 item 2</Value></Sequence1>
+        <Sequence1><Value>Sequence1 item 3</Value></Sequence1>
+        <Sequence2><Value>Sequence2 item 1</Value></Sequence2>
+        <Sequence2><Value>Sequence2 item 2</Value></Sequence2>
+        <Sequence2><Value>Sequence2 item 3</Value></Sequence2>
+        <UseSequence1Items>true</UseSequence1Items>
+        <UseSequence2Items>false</UseSequence2Items>
+        <NameIdMappedSelection>none</NameIdMappedSelection>
+    </RelevantOptionTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/sequence_setting_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Basic setting types test">
+  <confml:feature ref="SequenceSettingTest" name="Sequence setting test">
+    <confml:desc>Feature with a sequence setting (ConfML v2.0)</confml:desc>
+    
+    <confml:setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <confml:desc>A sequence setting</confml:desc>
+      
+      <confml:setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <confml:localPath/>
+        <confml:targetPath/>
+        <confml:desc>A folder sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <confml:desc>A real sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <confml:localPath/>
+        <confml:targetPath/>
+        <confml:desc>A file sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <confml:desc>An int sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <confml:desc>A string sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <confml:desc>A boolean sub-setting</confml:desc>
+      </confml:setting>
+      
+      <confml:setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <confml:desc>A selection sub-setting</confml:desc>
+        <confml:option name="Op0" value="0"/>
+        <confml:option name="Op1" value="1"/>
+        <confml:option name="Op2" value="2"/>
+        <confml:option name="Op3" value="3"/>
+        <confml:option name="Op4" value="4"/>
+      </confml:setting>
+      
+      <confml:setting ref="MultiSelectionSubSetting" name="Multi-selection sub-setting" type="multiSelection">
+        <confml:desc>A multi-selection sub-setting</confml:desc>
+        <confml:option name="Option 0" value="opt 0"/>
+        <confml:option name="Option 1" value="opt 1"/>
+        <confml:option name="Option 2" value="opt 2"/>
+        <confml:option name="Option 3" value="opt 3"/>
+        <confml:option name="Option 4" value="opt 4"/>
+      </confml:setting>
+      
+      <confml:setting ref="DateSubSetting" name="Date sub-setting" type="date">
+        <confml:desc>A date sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="TimeSubSetting" name="Time sub-setting" type="time">
+        <confml:desc>A time sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="DateTimeSubSetting" name="Date-time sub-setting" type="dateTime">
+        <confml:desc>A date-time sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="DurationSubSetting" name="Duration sub-setting" type="duration">
+        <confml:desc>A duration sub-setting</confml:desc>
+      </confml:setting>
+      
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:SequenceSettingTest>
+      <confml:SequenceSetting template="true">
+        <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.0</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>1</confml:IntSubSetting>
+        <confml:StringSubSetting>template</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>0</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 0"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def1_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.25</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def1_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>128</confml:IntSubSetting>
+        <confml:StringSubSetting>def1</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 1"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def2_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def2_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>def2</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+        <confml:MultiSelectionSubSetting>"opt 2"</confml:MultiSelectionSubSetting>
+        <confml:DateSubSetting>2009-02-02</confml:DateSubSetting>
+        <confml:TimeSubSetting>07:30:15</confml:TimeSubSetting>
+        <confml:DateTimeSubSetting>2009-02-02-07:00:00</confml:DateTimeSubSetting>
+        <confml:DurationSubSetting>P5Y4M3DT12H25M15S</confml:DurationSubSetting>
+      </confml:SequenceSetting>
+    </confml:SequenceSettingTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/time_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" name="Time types test">
+  <confml:feature ref="TimeTypesTest" name="Time types test">
+    <confml:desc>Feature with date-time etc. setting types</confml:desc>
+    <confml:setting ref="DateSetting" name="Date setting" type="date">
+      <confml:desc>A date setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="TimeSetting" name="Time setting" type="time">
+      <confml:desc>A time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DateTimeSetting" name="Date-time setting" type="dateTime">
+      <confml:desc>A date-time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DurationSetting" name="Duration setting" type="duration">
+      <confml:desc>A duration setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:TimeTypesTest>
+      <confml:DateSetting>2009-02-02</confml:DateSetting>
+      <confml:TimeSetting>07:30:15</confml:TimeSetting>
+      <confml:DateTimeSetting>2009-02-02-07:00:00</confml:DateTimeSetting>
+      <confml:DurationSetting>P5Y4M3DT12H25M15S</confml:DurationSetting>
+    </confml:TimeTypesTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/testdata/read_write/view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:view name="Layer 1 view">
+    <confml:desc>Testing view located on layer 1.</confml:desc>
+    <confml:group name="ConfML v1.0 settings">
+      <confml:setting ref="Feature1/RealSetting"/>
+      <confml:setting ref="Feature1/IntSetting"/>
+      <confml:setting ref="Feature1/StringSetting"/>
+      <confml:setting ref="Feature1/BooleanSetting"/>
+      <confml:setting ref="Feature1/SelectionSetting"/>
+      <confml:setting ref="Feature1/SequenceSetting"/>
+      <confml:setting ref="Feature2/SequenceSetting"/>
+    </confml:group>
+    <confml:group name="ConfML v2.0 settings">
+      <confml:setting ref="BasicSettingTypesTest/RealSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/IntSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/StringSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/BooleanSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/SelectionSetting"/>
+      <confml:setting ref="FileFolderTest/FolderSetting"/>
+      <confml:setting ref="FileFolderTest/FileSetting"/>
+      <confml:setting ref="SequenceSettingTest/SequenceSetting"/>
+    </confml:group>
+    
+    
+    <confml:group name="Settings for testing attribute 'relevant'">
+        <confml:group name="In options">
+            <confml:setting ref="RelevantOptionTest/*"/>
+        </confml:group>
+        <confml:group name="In settings">
+            <confml:setting ref="RelevantSettingTest/*"/>
+        </confml:group>
+        <confml:group name="In a feature">
+            <confml:setting ref="RelevantFeatureTest/*"/>
+        </confml:group>
+    </confml:group>
+    
+    <confml:group name="Settings for testing Name-ID mapping">
+        <confml:group name="Source sequences">
+            <confml:setting ref="NameIdMappingTestSourceSequences/*"/>
+        </confml:group>
+        <confml:group name="Target settings">
+            <confml:setting ref="NameIdMappingTestTargetSettings/*"/>
+        </confml:group>
+    </confml:group>
+    
+    <confml:group name="Settings for testing options">
+        <confml:setting ref="OptionTest/*"/>
+    </confml:group>
+    
+    <confml:group name="Settings for testing redefining things in views">
+        <confml:group name="Redefining name and description">
+            <confml:setting ref="RedefineInViewTest/NameAndDescRedefinition" name="Name from view">
+                <confml:desc>Description from view</confml:desc>
+            </confml:setting>
+        </confml:group>
+        
+        <confml:group name="Redefining options">
+            <confml:setting ref="RedefineInViewTest/IntWithOptions">
+                <confml:option name="Small value" value="2"/>
+                <confml:option name="Large value" value="200"/>
+                <confml:option name="Huge value" value="1000000"/>
+            </confml:setting>
+            
+            <confml:setting ref="RedefineInViewTest/RealWithOptions">
+                <confml:option name="Small value" value="0.002"/>
+                <confml:option name="Large value" value="20"/>
+                <confml:option name="Microscopic value" value="1e-9"/>
+            </confml:setting>
+            
+            <confml:setting ref="RedefineInViewTest/StringWithOptions">
+                <confml:option name="UTF-8" value="utf8"/>
+                <confml:option name="UTF-16" value="utf16"/>
+                <confml:option name="Latin-1" value="iso-8859-1"/>
+            </confml:setting>
+        </confml:group>
+    </confml:group>
+
+    
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/unittest_confmlxml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+
+from cone.public import api, exceptions, persistence
+from cone.storage import filestorage
+from cone.confml import persistentconfml, model, confmltree
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestConfmlXml(unittest.TestCase):
+       
+    def test_namespaces(self):
+        root = confmltree.Element('root')
+        elem = confmltree.Element('{http://spam.effbot.org}egg')
+        root.append(elem)
+        elem.append(confmltree.Element('{http://spam.effbot.org}ham'))
+        elem.append(confmltree.Element('{http://test.com}foo'))
+        str = confmltree.tostring(root, {'http://spam.effbot.org': 'ham',
+                              'http://test.com': 'bar'})
+        et = confmltree.fromstring(str)
+        self.assertTrue(et)
+        self.assertEquals(str,'<root xmlns:bar="http://test.com" xmlns:ham="http://spam.effbot.org"><ham:egg><ham:ham /><bar:foo /></ham:egg></root>')
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/unittest_implml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os
+import __init__
+from cone.public.exceptions import NotSupportedException
+
+from cone.confml import implml
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestImplementation(unittest.TestCase):    
+    def setUp(self):
+        pass
+    
+    def test_create_implml(self):
+        imp = implml.Implml('test.txt',None)
+
+    def test_generate_not_supported(self):
+        try:
+            imp = implml.Implml('test.txt',None)
+            imp.generate()
+            self.fail("Implementation base class should not support generation")
+        except NotSupportedException:
+            pass
+
+#    def test_list_output_files(self):
+#        imp = implml.Implml('ref/test.txt',None,ROOT_PATH)
+#        files = imp.list_output_files()
+#        self.assertTrue(len(files)>0)
+        
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/unittest_mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,133 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+
+from cone.public import api, exceptions
+from cone.confml import model, mapping
+from cone.carbon import persistentjson, model as carbonmodel
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestGetMapper(unittest.TestCase):
+    def test_get_mapper(self):
+        mapper = model.get_mapper('carbon')
+        self.assertTrue(isinstance(mapper, mapping.Confml2carbon))
+
+    def test_get_mapper_from_object(self):
+        s = model.ConfmlSetting("test")
+        mapper = s._get_mapper('carbon')
+        self.assertTrue(isinstance(mapper, mapping.Confml2carbon))
+
+
+class TestCarbon2confml(unittest.TestCase):
+    def test_map_carbon_configuration(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlConfiguration("test")
+        c2 = mapper.configuration(c1)
+        c3 = c1._get_mapper('carbon').map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonConfiguration))
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonConfiguration))
+        self.assertTrue(isinstance(c3, carbonmodel.CarbonConfiguration))
+
+    def test_map_carbon_featurelist(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlConfiguration(name="test")
+        c1.meta = {}
+        c1.meta.add('type','featurelist')
+        c2 = mapper.configuration(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.FeatureList))
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.FeatureList))
+
+    def test_map_carbon_featurelist_with_features(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlConfiguration(name="test")
+        c1.add_feature(model.ConfmlFeature('Group'))
+        c1.meta = {}
+        c1.meta.add('type','featurelist')
+        c2 = mapper.configuration(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.FeatureList))
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.FeatureList))
+#        self.assertEquals(c2.list_features(), ['Group'])
+
+    def test_map_carbon_configuration_with_data(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlConfiguration("test")
+        c1.name = "test.confml"
+        c1.namespace = "com.nokia"
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonConfiguration))
+        self.assertEquals(c2.name, "test.confml")
+        self.assertEquals(c2.namespace, "com.nokia")
+        self.assertEquals(c2.path, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_desc(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlSetting("test")
+        c1.desc = 'Testing man'
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+        self.assertEquals(c2.desc, "Testing man")
+        
+    def test_map_carbon_int_setting_with_data(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlIntSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonIntSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlBooleanSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonBooleanSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_setting_with_data(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlSelectionSetting("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonSelectionSetting))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
+
+    def test_map_carbon_feature(self):
+        mapper = model.get_mapper('carbon')
+        c1 = model.ConfmlFeature("test")
+        c2 = mapper.map_object(c1)
+        self.assertTrue(isinstance(c2, carbonmodel.CarbonFeature))
+        self.assertEquals(c2.name, "test")
+        self.assertEquals(c2.ref, "test")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/unittest_model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,611 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import string
+import sys
+import __init__
+
+from cone.public import api, exceptions
+from cone.confml import model
+
+
+class TestConfmlMeta(unittest.TestCase):
+    def test_create_meta(self):
+        metaelem = model.ConfmlMeta()
+        self.assertTrue(metaelem)
+
+    def test_create_with_data(self):
+        prop1 = model.ConfmlMetaProperty("foo", 123)
+        prop2 = model.ConfmlMetaProperty("bar", 312)
+        prop3 = model.ConfmlMetaProperty("test", 'testing string')
+        prop4 = model.ConfmlMetaProperty("testName", 'testing string2', \
+                                         "http://www.nokia.com/xml/cpf-id/1", \
+                                         attrs={"name":"name1", "value": "value1"})            
+        metaelem = model.ConfmlMeta([prop1, prop2, prop3, prop4])
+        self.assertEquals(metaelem[0].tag, "foo")
+        self.assertEquals(metaelem[0].value, 123)
+        self.assertEquals(metaelem[1].tag, "bar")
+        self.assertEquals(metaelem[1].value, 312)
+        self.assertEquals(metaelem[2].tag, "test")
+        self.assertEquals(metaelem[2].value, "testing string")
+        self.assertEquals(metaelem[3].tag, "testName")
+        self.assertEquals(metaelem[3].value, "testing string2")
+        self.assertEquals(metaelem[3].ns, "http://www.nokia.com/xml/cpf-id/1")
+        
+    def test_add_data(self):
+        metaelem = model.ConfmlMeta()
+        metaelem.append(model.ConfmlMetaProperty('test', 123, "abc", attrs = {"foo":"bar", "abc":1}))
+        self.assertEquals(metaelem[0].tag, 'test')
+        self.assertEquals(metaelem[0].value, 123)
+        self.assertEquals(metaelem[0].ns, "abc")
+        self.assertEquals(metaelem[0].attrs, {"foo":"bar", "abc":1})
+
+    def test_find_data(self):
+        metaelem = model.ConfmlMeta()
+        metaelem.append(model.ConfmlMetaProperty('test', 123, "abc",\
+                                                  attrs = {"foo":"bar", "abc":1}))
+        metaelem.append(model.ConfmlMetaProperty('abc', "efg", None,\
+                                                  attrs = {"foo2":"bar2", "abc2":2}))
+        self.assertEquals(metaelem.find_by_tag("test"), 0)
+        self.assertEquals(metaelem.get_property_by_tag("test").tag, 'test')
+        self.assertEquals(metaelem.get_property_by_tag("test").value, 123)
+        self.assertEquals(metaelem.get("test"), 123)
+        self.assertEquals(metaelem.get("test", 'ddd'), 123)
+        # test get_value with not found elem
+        self.assertEquals(metaelem.get("notthere"), None)
+        self.assertEquals(metaelem.get("notthere", 'fooman'), 'fooman')
+        self.assertEquals(metaelem.find_by_attribute("foo2", "bar2"), 1)
+        self.assertEquals(metaelem.find_by_attribute("qwerty", ""), -1)
+
+    def test_clone_meta(self):
+        prop1 = model.ConfmlMetaProperty("foo", 123)
+        prop2 = model.ConfmlMetaProperty("bar", 312)
+        prop3 = model.ConfmlMetaProperty("test", 'testing string')        
+        metaelem1 = model.ConfmlMeta([prop1, prop2, prop3])        
+        metaelem2 = metaelem1.clone()
+        self.assertEquals(metaelem1, metaelem2)
+
+
+class TestConfmlDescription(unittest.TestCase):
+    def test_create_desc(self):
+        descelem1 = model.ConfmlDescription("testing")
+        descelem2 = model.ConfmlDescription()
+        descelem3 = model.ConfmlDescription()
+        descelem3.text = "changed"
+        self.assertEquals(descelem1.text, "testing")
+        self.assertEquals(descelem2.text, "")
+        self.assertEquals(descelem3.text, "changed")
+
+    def test_clone_desc(self):
+        descelem1 = model.ConfmlDescription("testing")
+        descelem2 = descelem1._clone()
+        self.assertEquals(descelem1.text, descelem2.text)
+
+class TestConfmlGroup(unittest.TestCase):
+    def test_create_group(self):
+        group1 = model.ConfmlGroup("foo")
+        self.assertEquals(group1.ref, "foo")
+        self.assertEquals(group1.icon, None)
+        self.assertEquals(group1.desc, None)
+
+    def test_group_access_icon(self):
+        group1 = model.ConfmlGroup("foo", icon='first/icon.bmp')
+        self.assertEquals(group1.icon, "first/icon.bmp")
+        group1.icon = 'foo/bar.jpg'
+        self.assertEquals(group1.icon, "foo/bar.jpg")
+        del group1.icon
+        self.assertEquals(group1.icon, None)
+
+    def test_group_access_description(self):
+        group1 = model.ConfmlGroup("foo", desc='Testing description. for this something!')
+        self.assertEquals(group1.desc, "Testing description. for this something!")
+        group1.desc = 'Something else'
+        self.assertEquals(group1.desc, "Something else")
+        del group1.desc
+        self.assertEquals(group1.icon, None)
+
+    def test_clone_group(self):
+        group1 = model.ConfmlGroup("foo")
+        group2 = group1._clone()
+        self.assertEquals(group1.ref, group2.ref)
+        self.assertEquals(group1.desc, group2.desc)
+        self.assertEquals(group1.icon, group2.icon)
+
+        group1 = model.ConfmlGroup("foo", desc='testing desc', icon='link.bmp')
+        group2 = group1._clone(recursion=True)
+        self.assertEquals(group1.ref, group2.ref)
+        self.assertEquals(group1.desc, group2.desc)
+        self.assertEquals(group1.icon, group2.icon)
+
+
+class TestConfmlSetting(unittest.TestCase):
+    def test_create_setting(self):
+        elem = model.ConfmlSetting('test')
+        self.assertTrue(elem)
+        self.assertEquals(elem.desc, None)
+        self.assertEquals(elem.readOnly, None)
+        self.assertEquals(elem.constraint, None)
+        self.assertEquals(elem.required, None)
+        self.assertEquals(elem.relevant, None)
+
+    def test_getters(self):
+        elem = model.ConfmlSetting('foo')
+        self.assertTrue(elem.get_ref(),'foo')
+        self.assertEquals(elem.get_type(),None)
+        self.assertTrue(elem.get_name(),'foo')
+
+    def test_set_type(self):
+        elem = model.ConfmlSetting('foo')
+        elem.type = 'string'
+        self.assertTrue(elem.ref,'foo')
+        self.assertTrue(elem.type,'string')
+        self.assertTrue(elem.name,'foo')
+
+    def test_setting_with_options(self):
+        elem = model.ConfmlSetting('foo',type='selection')
+        elem.create_option('foo','1')
+        elem.create_option('bar','bar')
+        elem.create_option('hou','sut')
+        self.assertTrue('1' in elem.get_valueset()) 
+        self.assertEquals(elem.options['1'].name, 'foo')
+        self.assertEquals(elem.options['1'].value, '1')
+        self.assertEquals(elem.options['bar'].name, 'bar')
+
+    def test_setting_create_with_nonetype(self):
+        elem = model.ConfmlSetting('foo',type=None)
+        self.assertEqual(elem.type,None) 
+
+    def test_setting_with_properties(self):
+        elem = model.ConfmlSetting('foo')
+        elem.add_property(name='foo',value='bar/foo')
+        elem.add_property(name='bar',value='only/bar')
+        elem.add_property(name='testing',value='1', unit='mB')
+        self.assertEquals(elem.list_properties(), ['foo','bar','testing'])
+        self.assertEquals(elem.get_property('foo').value, 'bar/foo')
+        elem.remove_property('foo')
+        try:
+            elem.remove_property('bss')
+            self.fail('removing invalid succeeds')
+        except exceptions.NotFound:
+            pass
+        self.assertEquals(elem.list_properties(), ['bar','testing'])
+        for property_name in elem.list_properties():
+            elem.remove_property(property_name)
+        self.assertEquals(elem.list_properties(), [])
+        
+
+    def test_setting_with_properties_property(self):
+        elem = model.ConfmlSetting('foo')
+        elem.add_property(name='foo',value='bar/foo')
+        elem.add_property(name='bar',value='only/bar')
+        elem.add_property(name='testing',value='1', unit='mB')
+        self.assertEquals(elem.properties['foo'].value,'bar/foo')
+        self.assertEquals(elem.properties['bar'].value,'only/bar')
+
+    def test_setting_with_readOnly_value(self):
+        elem = model.ConfmlSetting('foo', readOnly=True)
+        self.assertEquals(elem.readOnly,True)
+        elem.readOnly = False
+        self.assertEquals(elem.readOnly,False)
+
+    def test_setting_with_constaint(self):
+        elem = model.ConfmlSetting('foo', constraint=". &gt; '1'")
+        self.assertEquals(elem.constraint,". &gt; '1'")
+        elem.constraint = 'foobar'
+        self.assertEquals(elem.constraint,"foobar")
+
+    def test_setting_with_required_value(self):
+        elem = model.ConfmlSetting('foo', required=False)
+        self.assertEquals(elem.required,False)
+        elem = model.ConfmlSetting('foo', required=True)
+        self.assertEquals(elem.required,True)
+        elem.required = False
+        self.assertEquals(elem.required,False)
+
+    def test_setting_with_relevant_value(self):
+        elem = model.ConfmlSetting('foo', relevant='ffoo oss')
+        self.assertEquals(elem.relevant,'ffoo oss')
+        elem.relevant = ''
+        self.assertEquals(elem.relevant,'')
+
+    def test_setting_with_max_length(self):
+        elem = model.ConfmlSetting('foo', maxLength=10)
+        self.assertEquals(elem.maxLength,10)
+        elem.maxLength = 20
+        self.assertEquals(elem.maxLength,20)
+        self.assertTrue(elem._has(model.ConfmlMaxLength.refname))
+
+    def test_setting_with_min_length(self):
+        elem = model.ConfmlSetting('foo', minLength=10)
+        self.assertEquals(elem.minLength,10)
+        elem.minLength = 20
+        self.assertEquals(elem.minLength,20)
+        self.assertTrue(elem._has(model.ConfmlMinLength.refname))
+
+    def test_setting_rfs_casting(self):
+        elem = model.ConfmlSetting('foo', minLength=10)
+        self.assertEquals(elem.get_rfs_cast('true'),True)
+        self.assertEquals(elem.get_rfs_cast('false'),False)
+        self.assertEquals(elem.set_rfs_cast(True),'true')
+        self.assertEquals(elem.set_rfs_cast(False),'false')
+        self.assertEquals(elem.set_rfs_cast(1),'true')
+
+class TestConfmlSelectionSetting(unittest.TestCase):
+    def test_create_selection_setting(self):
+        elem = model.ConfmlSelectionSetting('foo')
+        self.assertTrue(elem)
+        self.assertEquals(elem.type, 'selection')
+        self.assertEquals(elem.desc, None)
+        self.assertEquals(elem.readOnly, None)
+        self.assertEquals(elem.constraint, None)
+        self.assertEquals(elem.required, None)
+        self.assertEquals(elem.relevant, None)
+    
+    def test_selection_valueset(self):
+        elem = model.ConfmlSelectionSetting('foo')
+        self.assertEquals(elem.type, 'selection')
+        elem.create_option('foo', '1')
+        elem.create_option('bar', '2')
+        elem.create_option('baz', '3')
+        self.assertEquals(elem.get_valueset(), api.ValueSet(['1', '2', '3']))
+
+class TestConfmlMultiSelectionSetting(unittest.TestCase):
+    def test_create_multiselection_setting(self):
+        elem = model.ConfmlMultiSelectionSetting('mset1')
+        self.assertTrue(elem)
+        self.assertEquals(elem.type, 'multiSelection')
+        self.assertEquals(elem.desc, None)
+        self.assertEquals(elem.readOnly, None)
+        self.assertEquals(elem.constraint, None)
+        self.assertEquals(elem.required, None)
+        self.assertEquals(elem.relevant, None)
+    
+    def test_multiselection_valueset(self):
+        elem = model.ConfmlMultiSelectionSetting('foo')
+        self.assertEquals(elem.type, 'multiSelection')
+        elem.create_option('foo', '1')
+        elem.create_option('bar', '2')
+        elem.create_option('baz', '3')
+        self.assertEquals(elem.get_valueset(), api.ValueSet(['1', '2', '3']))
+
+    def test_setting_value_to_multiselection(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlMultiSelectionSetting('mset2', type='multiSelection')
+        conf.add_feature(elem)
+        elem.value = "\"sel1\" \"sel2\""
+        self.assertEquals(elem.type, 'multiSelection')
+        self.assertEquals(elem.get_data_cast("\"sel1\" \"sel2\""), ["sel1", "sel2"])
+        self.assertEquals(elem.get_value(), ["sel1", "sel2"])
+
+    def test_set_data_cast(self):
+        elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
+        self.assertEquals(elem.set_data_cast('"sel1" "sel2 with some spaces"'), '"sel1" "sel2 with some spaces"')
+        self.assertEquals(elem.set_data_cast(["sel1", "sel2 with some spaces"]), '"sel1" "sel2 with some spaces"')
+        self.assertEquals(elem.set_data_cast(["1", "1"]), '"1" "1"')
+        self.assertEquals(elem.set_data_cast([1, 2, 3]), '"1" "2" "3"')
+
+
+    def test_get_data_cast(self):
+        elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
+        self.assertEquals(elem.get_data_cast('"sel1" "sel2 with some spaces"'), ["sel1", "sel2 with some spaces"])
+        self.assertEquals(elem.get_data_cast('"sel1" "sel2 space" "foo bar"'), ["sel1", "sel2 space", "foo bar"])
+
+    def test_setting_value_to_multiselection2(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlMultiSelectionSetting('mset3', type='multiSelection')
+        conf.add_feature(elem)
+        elem.value = '"sel1" "sel2 with some spaces"'
+        self.assertEquals(elem.type, 'multiSelection')
+        self.assertEquals(elem.get_value(), ["sel1", "sel2 with some spaces"])
+        elem.value = ["sel1", "sel2 with some spaces"]
+        self.assertEquals(elem.get_value(), ["sel1", "sel2 with some spaces"])
+        
+    def test_setting_not_list_value_to_multiselection(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlMultiSelectionSetting('mset4', type='multiSelection')
+        conf.add_feature(elem)
+        self.assertRaises(ValueError, elem.set_value, "not list")
+        
+    def test_setting_list_value_to_multiselection(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlMultiSelectionSetting('mset5', type='multiSelection')
+        conf.add_feature(elem)
+        elem.set_value(["li1", "li2"])
+        self.assertEquals(elem.get_value(), ["li1", "li2"])
+        self.assertEquals(elem.get_data().get_value(), '"li1" "li2"')
+
+class TestConfmlIntSetting(unittest.TestCase):
+    def test_create_setting(self):
+        elem = model.ConfmlIntSetting('test')
+        self.assertTrue(elem)
+        self.assertEquals(elem.type, 'int')
+        self.assertEquals(elem.desc, None)
+        self.assertEquals(elem.readOnly, None)
+        self.assertEquals(elem.constraint, None)
+        self.assertEquals(elem.required, None)
+        self.assertEquals(elem.relevant, None)
+
+    def test_setting_value_to_int(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlIntSetting('foo', type='int')
+        conf.add_feature(elem)
+        elem.value = 1
+        self.assertEquals(elem.value,1)
+        self.assertEquals(elem.get_original_value(),'1')
+        self.assertEquals(elem.get_data().get_value(),'1')
+
+    def test_setting_value_with_incompatible_values(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlIntSetting('foo')
+        conf.add_feature(elem)
+        try:
+            elem.value = 'hh'
+            self.fail('setting string to int succeeds')
+        except ValueError:
+            pass
+        elem.value = '1234'
+        self.assertEquals(elem.value, 1234)
+        elem.value = 0xA
+        self.assertEquals(elem.value, 10)
+        del elem.value
+        self.assertEquals(elem.value, None)
+
+    def test_setting_value_to_int(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem1 = model.ConfmlIntSetting('foo')
+        elem2 = model.ConfmlIntSetting('bar')
+        conf.add_feature(elem1)
+        conf.add_feature(elem2)
+        elem1.value = 1
+        elem2.value = 2
+        test = elem1.value + elem2.value
+        self.assertEquals(test,3)
+        elem1.value = elem1.value + elem2.value + 5
+        self.assertEquals(elem1.value,8)
+
+class TestConfmlBooleanSetting(unittest.TestCase):
+    def test_create_setting(self):
+        elem = model.ConfmlBooleanSetting('test')
+        self.assertTrue(elem)
+        self.assertEquals(elem.type, 'boolean')
+        self.assertEquals(elem.desc, None)
+        self.assertEquals(elem.readOnly, None)
+        self.assertEquals(elem.constraint, None)
+        self.assertEquals(elem.required, None)
+        self.assertEquals(elem.relevant, None)
+
+    def test_setting_value_to_int(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlBooleanSetting('foo', type='int')
+        self.assertEquals(elem.type, 'boolean')
+        conf.add_feature(elem)
+        elem.value = 1
+        # Set elem rfs value
+        elem.set_value(True, 'rfs')
+        self.assertEquals(elem.get_value('rfs'),True)
+        self.assertEquals(elem.get_original_value('rfs'),'true')
+        self.assertEquals(elem.value,1)
+        self.assertEquals(elem.get_original_value(),'true')
+        self.assertEquals(elem.get_data().get_value(),'true')
+
+    def test_setting_value_with_incompatible_values(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlBooleanSetting('foo')
+        conf.add_feature(elem)
+        elem.value = '1234'
+        self.assertEquals(elem.value, True)
+        elem.value = 0xA
+        self.assertEquals(elem.value, True)
+        elem.value = False
+        self.assertEquals(elem.value, False)
+        elem.value = ''
+        self.assertEquals(elem.value, False)
+        del elem.value
+        self.assertEquals(elem.value, None)
+    
+    def test_setting_value_with_supported_values(self):
+        conf = model.ConfmlConfiguration('test.confml')
+        elem = model.ConfmlBooleanSetting('foo')
+        conf.add_feature(elem)
+        elem.value = '1'
+        self.assertEquals(elem.value, True)
+        elem.value = 'true'
+        self.assertEquals(elem.value, True)
+        elem.value = True
+        self.assertEquals(elem.value, True)
+        elem.value = '0'
+        self.assertEquals(elem.value, False)
+        elem.value = 'false'
+        self.assertEquals(elem.value, False)
+        elem.value = False
+        self.assertEquals(elem.value, False)
+        del elem.value
+        self.assertEquals(elem.value, None)
+
+class TestConfmlSequenceSetting(unittest.TestCase):
+    def test_create_setting(self):
+        elem = model.ConfmlSequenceSetting('test')
+        self.assertTrue(elem)
+        self.assertEquals(elem.desc, None)
+
+    def test_setting_with_properties_property(self):
+        elem = model.ConfmlSequenceSetting('foo')
+        elem.add_property(name='foo',value='bar/foo')
+        elem.add_property(name='bar',value='only/bar')
+        elem.add_property(name='testing',value='1', unit='mB')
+        self.assertEquals(elem.properties['foo'].value,'bar/foo')
+        self.assertEquals(elem.properties['bar'].value,'only/bar')
+
+    def test_setting_with_min_occurs(self):
+        elem = model.ConfmlSequenceSetting('foo', minOccurs=1)
+        self.assertEquals(elem.minOccurs,1)
+        elem.minOccurs = 2
+        self.assertEquals(elem.minOccurs,2)
+
+    def test_setting_with_max_occurs(self):
+        elem = model.ConfmlSequenceSetting('foo', maxOccurs=10)
+        self.assertEquals(elem.maxOccurs,10)
+        elem.maxOccurs = 20
+        self.assertEquals(elem.maxOccurs,20)
+
+    def test_create_feature_seq_with_int_bool_settings_access_feature_value_with_property(self):
+        config = api.Configuration('foo.confml')
+        fea= model.ConfmlSequenceSetting("foo")
+        fea.add_feature(model.ConfmlIntSetting('child1'))
+        fea.add_feature(model.ConfmlBooleanSetting('child2'))
+        fea.add_feature(model.ConfmlSetting('child3'))
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        # Test adding a data row with array
+        foofea.set_value([['1','2','3'],
+                         ['4','5','6'],
+                         ['7','8','9']
+                         ])
+        self.assertEquals(foofea.value, [['1','2','3'],
+                                         ['4','5','6'],
+                                         ['7','8','9']
+                                        ])
+
+        foofea.value = [['1','2','3'],
+                         ['7','8','9']
+                        ]
+        
+        self.assertEquals(foofea.data[0].value,['1','2','3'])
+        self.assertEquals(foofea.data[1].value,['7','8','9'])
+        self.assertEquals(foofea.data[1][1].value,'8')
+        self.assertEquals(foofea.get_value(), [['1','2','3'],
+                                               ['7','8','9']
+                                               ])
+        self.assertEquals(foofea.child1.value,['1','7'])
+
+class TestConfmlFile(unittest.TestCase):
+    def test_create_localpath_elem(self):
+        elem = model.ConfmlLocalPath()
+        self.assertTrue(elem)
+        self.assertEquals(elem.get_ref(),'localPath')
+
+    def test_create_targetpath_elem(self):
+        elem = model.ConfmlTargetPath()
+        self.assertTrue(elem)
+        self.assertEquals(elem.get_ref(),'targetPath')
+
+    def test_create_file_elem(self):
+        elem = model.ConfmlFileSetting('test')
+        self.assertTrue(elem)
+        self.assertEquals(elem.get_ref(),'test')
+        self.assertEquals(elem.list_features(), ['localPath','targetPath'])
+        self.assertEquals(elem.get_feature('localPath').fqr, 'test.localPath')
+        self.assertEquals(elem.get_feature('targetPath').fqr, 'test.targetPath')
+
+    def test_create_file_elem_and_set_value(self):
+        config = api.Configuration('test.confml')
+        elem = model.ConfmlFileSetting('test', localpath='test.txt')
+        config.add_feature(elem)
+        dview = config.get_default_view()
+        self.assertEquals(dview.list_all_features(),['test','test.localPath','test.targetPath'])
+        dview.get_feature('test.localPath').set_value('foo/test.txt')
+        dview.get_feature('test.targetPath').set_value('Z:\\test\test.txt')
+        dview.get_feature('test.localPath').set_value('now/test.txt')
+        self.assertEquals(dview.get_feature('test.localPath').get_value(),'now/test.txt')
+        self.assertEquals(len(dview.get_feature('test.localPath').get_datas()),1)
+
+    def test_clone_file_elem(self):
+        elem1 = model.ConfmlFileSetting('test')
+        elem2 = elem1._clone(recursion=True)
+        
+
+class TestConfmlIcon(unittest.TestCase):
+    def test_create_icon(self):
+        icon = model.ConfmlIcon("test/foo/bar.jpg")
+        self.assertEquals(icon.href, "test/foo/bar.jpg")
+        icon.href = 'new/icon.jpg'
+        self.assertEquals(icon.href, "new/icon.jpg")
+
+    def test_clone_icon(self):
+        icon1 = model.ConfmlIcon("test/foo/bar.jpg")
+        icon2 = icon1._clone()
+        self.assertEquals(icon1.href, icon2.href)
+
+
+class TestLengths(unittest.TestCase):
+    def test_create_maxLength(self):
+        max = model.ConfmlMaxLength('100')
+        self.assertEquals(max.value, '100')
+
+    def test_create_minLength(self):
+        min = model.ConfmlMinLength('100')
+        self.assertEquals(min.value, '100')
+
+class TestConfmlFacets(unittest.TestCase):
+    def test_create_inclusive(self):
+        min = model.ConfmlMinInclusive('-10')
+        max = model.ConfmlMaxInclusive('10')
+        self.assertEquals(min.value, '-10')
+        self.assertEquals(max.value, '10')
+
+    def test_create_exclusive(self):
+        min = model.ConfmlMinExclusive('0')
+        max = model.ConfmlMaxExclusive("9")
+        self.assertEquals(min.value, '0')
+        self.assertEquals(max.value, '9')
+
+    def test_create_pattern(self):
+        pattern = model.ConfmlPattern("[a-zA-Z]")
+        self.assertEquals(pattern.value, "[a-zA-Z]")
+
+    def test_create_totalDigits(self):
+        digits = model.ConfmlTotalDigits("3")
+        self.assertEquals(digits.value, '3')
+
+class TestConfmlConfiguration(unittest.TestCase):
+    def test_create_configuration(self):
+        config = model.ConfmlConfiguration("test/foo/bar.jpg")
+        self.assertEquals(config.meta, None)
+        self.assertEquals(config.desc, None)
+        self.assertEquals(config.name, 'test__foo__bar_jpg')
+        self.assertEquals(config.ref, 'test__foo__bar_jpg')
+        self.assertEquals(config.path, 'test/foo/bar.jpg')
+
+#    def test_configuration_access_meta(self):
+#        config = model.ConfmlConfiguration("test/foo/bar.jpg", meta={'test':'foo','bar':' hd dd'})
+#        self.assertEquals(config.meta.dict, {'test':'foo','bar':' hd dd'})
+#        self.assertEquals(config.meta['test'],'foo')
+#        config.meta = {'test':'123'}
+#        self.assertEquals(config.meta['test'],'123')
+#        del config.meta
+#        self.assertEquals(config.meta, None)
+        
+    def test_configuration_access_desc(self):
+        config = model.ConfmlConfiguration("test/foo/bar.jpg", desc="testing description")
+        self.assertEquals(config.desc, "testing description")
+        config.desc = 'new desc'
+        self.assertEquals(config.desc, "new desc")
+        del config.desc
+        self.assertEquals(config.desc, None)
+
+class TestConfmlProperty(unittest.TestCase):
+    def test_create_property(self):
+        property = model.ConfmlProperty(name='test',value='foo', unit='kB')
+        self.assertEquals(property.name, 'test')
+        self.assertEquals(property.value, 'foo')
+        self.assertEquals(property.unit, 'kB')
+        property.name = 'testnew'
+        property.value = 'foo faa'
+        self.assertEquals(property.name, 'testnew')
+        self.assertEquals(property.value, 'foo faa')
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/confml/tests/unittest_persistentconfml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1211 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+from cone.public import api, exceptions, persistence
+from cone.storage import filestorage
+from cone.confml import persistentconfml, model
+from testautomation.base_testcase import BaseTestCase
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+testdata  = os.path.join(ROOT_PATH,'data')
+
+simplerootxml = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="simple" version="1">
+  <xi:include href="platform/s60/confml/test.confml#/"/>
+</configuration>
+'''
+
+newincludexml = '''<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="simple" version="1">
+  <xi:include href="platform/s60/confml/test.confml"/>
+</configuration>'''
+
+complexrootxml = '''<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="simple" version="1">
+  <xi:include href="platform/s60/confml/test.confml#/"/>
+  <xi:include href="platform/jallaa/confml/root.confml#/"/>
+  <xi:include href="configB/confml/configB.confml#/"/>
+  <xi:include href="ncp33/prod/confml/root.confml#/"/>
+</configuration>'''
+
+
+morestuff='''<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/xinclude" name="foobar" version="1">
+  <meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+    <cv:configuration-property name="coreplat_name" value="abc_123" />
+    <cv:configuration-property name="product_name" value="qwerty" />
+    <owner>Variant1 creator</owner>
+    <origin>somestorage:somelocation_123/and/path</origin>
+    <target>proto_b2</target>
+  </meta>
+  <desc>This is a configuration for Product1 Region1 Variant1 </desc>
+  <xi:include href="platform/s60/confml/root.confml"/>
+  <xi:include href="ncp11/confml/jallaa.confml"/>
+  <xi:include href="ncp11/prodX/confml/root.confml"/>
+  <xi:include href="regional/japan/confml/root.confml"/>
+</configuration>'''
+
+actualconfml='''<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="accesspoints">
+  <feature ref="KCRUidApEngineLV" name="KCRUidApEngineLV">
+    <desc></desc>
+    <setting ref="KApEngineLVFlags" name="KApEngineLVFlags"/>
+  </feature>
+  <feature ref="KCRUidApSettingsHandlerUiLV" name="KCRUidApSettingsHandlerUiLV">
+    <desc></desc>
+    <setting ref="KApSettingsHandlerUiLVFlags" name="KApSettingsHandlerUiLVFlags"/>
+    <setting ref="KAIStatusPaneLayout" name="Status Pane Layout" type="selection">
+      <desc>Status pane layout setting. 0 = normal, 1 = flat, 2 = hidden</desc>
+      <option name="normal" value="0"/>
+      <option name="flat" value="1"/>
+      <option name="hidden" value="2"/>
+    </setting>
+  </feature>
+  <feature name="Customer Menu" ref="CVC_OperatorMenu">
+    <desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter. The URL defines the xHTML Startup page that is shown when the Customer Menu application is launched, for example www.customername.com/index.html. The URL also defines the customer domain URL path, for example www.customername.com/. All user-browsed xHTML pages belonging to that path are automatically stored in the Customer Menu cache.The Customer Menu application can be configured as a shortcut just like any other application. In Main menu, the Customer Menu is placed by default to 11th position. When the Customer Menu is enabled, Help moves from position 11 to 12 and Apps moves from 12 to 13, which is not visible until the user scrolls the menu cursor.</desc>
+       <setting name="Customer Menu icon" ref="CVC_OperatorMenuIconFile" type="file">
+            <desc>Customer menu icon that will be present in Application Grid. Size: 65 x 65 pixels. Format: SVGT (preferred) or BMP. Color depth: 24 bit</desc>
+        <localPath/>
+        <targetPath readOnly="true"/>
+      </setting>
+  </feature>
+  <data>
+    <KCRUidApEngineLV>
+      <KApEngineLVFlags>0</KApEngineLVFlags>
+    </KCRUidApEngineLV>
+    <KCRUidApSettingsHandlerUiLV>
+      <KApSettingsHandlerUiLVFlags>0</KApSettingsHandlerUiLVFlags>
+      <KAIStatusPaneLayout>0</KAIStatusPaneLayout>
+    </KCRUidApSettingsHandlerUiLV>
+    <CVC_OperatorMenu>
+      <CVC_OperatorMenuIconFile>
+        <localPath>UI/Customer Menu/Cache</localPath>
+      </CVC_OperatorMenuIconFile>
+    </CVC_OperatorMenu>
+  </data>
+  <rfs>
+    <KCRUidApEngineLV>
+      <KApEngineLVFlags>true</KApEngineLVFlags>
+    </KCRUidApEngineLV>
+    <KCRUidApSettingsHandlerUiLV>
+      <KApSettingsHandlerUiLVFlags>false</KApSettingsHandlerUiLVFlags>
+    </KCRUidApSettingsHandlerUiLV>
+  </rfs>
+</configuration>
+'''
+
+sequencesettings = \
+'''<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="BrowserBookmarks">
+<feature name="BookmarkItems" ref="BookmarkItems">
+  <setting name="BookmarkItem" ref="BookmarkItem" type="sequence">
+    <setting name="Type Of Bookmark" ref="Type" type="selection">
+      <desc>This defines the Type of the element created. To create a Folder item - select "Folder". To create a bookmark item - select "Item".</desc>
+      <option name="Folder" value="Folder"/>
+      <option name="Item" value="Item"/>
+    </setting>
+    <setting name="Name Of The New Entry" ref="Name" type="string">
+      <desc>Text field containing name for the Folder or Bookmark.  Must be unique.</desc>
+    </setting>
+  </setting>
+</feature>
+<data>
+  <BookmarkItems>
+    <BookmarkItem template="true">
+      <Type>Template</Type>
+      <Name>Download Applications</Name>
+    </BookmarkItem>
+    <BookmarkItem>
+      <Type>Folder1</Type>
+      <Name>Download Applications</Name>
+    </BookmarkItem>
+    <BookmarkItem>
+      <Type>Folder2</Type>
+      <Name>Download Images</Name>
+    </BookmarkItem>
+    <BookmarkItem>
+      <Type>Folder3</Type>
+    </BookmarkItem>
+  </BookmarkItems>
+</data>
+</configuration>
+'''
+
+simpleview = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration  xmlns:confml="http://www.s60.com/xml/confml/1" schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2">
+  <feature ref="imaker" name="iMaker Image creation">
+    <setting ref="imagetarget" name="IMAGE_TARGET" type="selection">
+      <option name="core" value="0"/>
+      <option name="rofs2" value="1"/>
+      <option name="rofs3" value="2"/>
+      <option name="rofs4" value="3"/>
+      <option name="uda" value="4"/>
+      <option name="rofs3_uda" value="4"/>
+    </setting>
+  </feature>
+  <feature ref="imakerapi" name="iMaker API">
+    <setting ref="imagetype" name="IMAGE_TYPE" type="selection">
+      <option name="rnd" value="0"/>
+      <option name="subcon" value="1"/>
+      <option name="prd" value="2"/>
+    </setting>
+    <setting ref="rofs3version" name="ROFS3_VERSION" type="string"/>
+    <setting ref="productname" name="PRODUCT_NAME" type="string"/>
+    <setting ref="outputLocation" name="OUTPUT_LOCATION" type="string"/>
+  </feature>
+  <data>
+    <imaker>
+      <imagetarget>2</imagetarget>
+    </imaker>
+    <imakerapi>
+      <imagetype>0</imagetype>
+      <rofs3version>V .50.2009.04.0113 RND</rofs3version>
+      <productname>myProduct</productname>
+      <outputLocation>myProduct</outputLocation>
+    </imakerapi>
+  </data>
+  <confml:view id="imakerimage" name="Image creation">
+    <confml:desc>Image creation related settings</confml:desc>
+    <confml:group name="Imageproperties">
+      <confml:desc>Sample Description</confml:desc>
+      <confml:setting ref="imakerapi/*"/>
+      <confml:setting ref="imaker/*"/>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
+'''
+
+class TestModuleGetters(unittest.TestCase):
+    def test_get_reader_for_configuration(self):
+        confread = persistentconfml.get_reader_for_elem("configuration")
+        self.assertTrue(isinstance(confread, persistentconfml.ConfigurationReader))
+
+    def test_get_writer_for_configuration(self):
+        confread = persistentconfml.get_writer_for_class("Configuration")
+        self.assertTrue(isinstance(confread, persistentconfml.ConfigurationWriter))
+
+    def test_get_elemname_from_string(self):
+        self.assertEquals(persistentconfml.get_elemname("{http://www.s60.com/xml/confml/1}configuration")[0],"http://www.s60.com/xml/confml/1")
+        self.assertEquals(persistentconfml.get_elemname("{http://www.s60.com/xml/confml/1}configuration")[1],"configuration")
+
+    def test_get_elemname_from_element_tree(self):
+        root = ElementTree.fromstring(simplerootxml)
+        for elem in root.getiterator():
+            (namespace,elemname) = persistentconfml.get_elemname(elem.tag)
+        self.assertEquals(elemname,"include")
+
+    def test_loads(self):
+        config = persistentconfml.loads(simplerootxml)
+        self.assertEquals(config.get_name(),"simple")
+
+    def test_dumps(self):
+        config = api.Configuration("test.confml")
+        config.include_configuration('path/to/config.confml')
+        dump = persistentconfml.dumps(config)
+        elem = ElementTree.fromstring(dump)
+        self.assertEquals(elem.get('name'),"test_confml")
+
+class TestConfigurationParser(unittest.TestCase):    
+    def test_load_simple(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(simplerootxml))
+        self.assertEquals(obj.get_ref(),'simple')
+        self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
+
+    def test_load_new_include_confml(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(newincludexml))
+        self.assertEquals(obj._list(),['platform__s60__confml__test_confml'])
+
+    def test_load_complexrootxml(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(complexrootxml))
+        self.assertEquals(obj._list(),['platform__s60__confml__test_confml',
+                                        'platform__jallaa__confml__root_confml', 
+                                        'configB__confml__configB_confml', 
+                                        'ncp33__prod__confml__root_confml'])
+
+    def test_load_morestuff(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(morestuff))
+        self.assertEquals(obj._list(),['_meta','_desc','platform__s60__confml__root_confml', 'ncp11__confml__jallaa_confml', 'ncp11__prodX__confml__root_confml', 'regional__japan__confml__root_confml'])
+        met = obj.meta
+        self.assertEquals(obj.meta[2].value,'Variant1 creator')
+        self.assertEquals(obj.meta[3].value,'somestorage:somelocation_123/and/path')
+        self.assertEquals(obj.meta[4].value,'proto_b2')        
+        self.assertEquals(obj.meta[0].tag,'configuration-property')
+        self.assertEquals(obj.meta[0].value, None)
+        self.assertEquals(obj.meta[0].ns,'http://www.nokia.com/xml/cpf-id/1')
+        self.assertEquals(obj.meta[0].attrs,{"name": "coreplat_name", "value": "abc_123"})        
+        self.assertEquals(obj.desc,'This is a configuration for Product1 Region1 Variant1 ')
+
+    def test_load_morestuff_and_remove_included_configuration(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(morestuff))
+        self.assertEquals(obj.list_configurations(),['platform/s60/confml/root.confml', 'ncp11/confml/jallaa.confml', 'ncp11/prodX/confml/root.confml', 'regional/japan/confml/root.confml'])
+        obj.remove_configuration('platform/s60/confml/root.confml')
+        self.assertEquals(obj.list_configurations(),['ncp11/confml/jallaa.confml', 'ncp11/prodX/confml/root.confml', 'regional/japan/confml/root.confml'])
+        for configname in obj.list_configurations():
+            obj.remove_configuration(configname)
+        self.assertEquals(obj.list_configurations(),[])
+
+    def test_load_actualconfml(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(actualconfml))
+        self.assertEquals(obj.list_features(),['KCRUidApEngineLV', 'KCRUidApSettingsHandlerUiLV','CVC_OperatorMenu'])
+        self.assertEquals(obj.list_all_features(),['KCRUidApEngineLV', 
+                                                   'KCRUidApEngineLV.KApEngineLVFlags', 
+                                                   'KCRUidApSettingsHandlerUiLV', 
+                                                   'KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags', 
+                                                   'KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout', 
+                                                   'CVC_OperatorMenu', 
+                                                   'CVC_OperatorMenu.CVC_OperatorMenuIconFile',
+                                                   'CVC_OperatorMenu.CVC_OperatorMenuIconFile.localPath', 
+                                                   'CVC_OperatorMenu.CVC_OperatorMenuIconFile.targetPath'])
+        fea = obj.KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags
+        vset = fea.get_valueset()
+        self.assertTrue(fea.get_value() in vset)
+        self.assertTrue('0' in obj.KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout.get_valueset())
+        self.assertTrue('1' in obj.KCRUidApSettingsHandlerUiLV.KAIStatusPaneLayout.get_valueset())
+        for fearef in obj.list_all_features():
+            fea = obj.get_feature(fearef)
+            if fea.get_type() == 'int':
+                #print "Feature %s, %s: %s" % (fea.get_type(),fea.get_name(),fea.get_value()) 
+                self.assertEquals(fea.get_value(),0)
+        self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.targetPath').get_value(),None)
+        self.assertEquals(obj.get_feature('CVC_OperatorMenu.CVC_OperatorMenuIconFile.localPath').get_value(),'UI/Customer Menu/Cache')
+
+    def test_create_features_with_rfs_data_and_dump_and_load(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('child1'),'feature1')
+        conf.add_feature(api.Feature('child2'),'feature1')
+        conf.add_feature(api.Feature('child3'),'feature1')
+        
+        conf.add_data(api.Data(fqr='feature1.child1',attr='rfs',value='true'))
+        conf.add_data(api.Data(fqr='feature1.child2',attr='rfs',value='false'))
+        dview = conf.get_default_view()
+        self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
+        self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
+        self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
+        
+        dumped = persistentconfml.dumps(conf)
+        conf2 = persistentconfml.loads(dumped)
+        dview = conf2.get_default_view()
+        self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
+        self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
+        self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
+
+    def test_load_actualconfml_test_rfs_settings(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        obj = reader.loads(ElementTree.fromstring(actualconfml))
+        self.assertEquals(obj.get_feature('KCRUidApEngineLV.KApEngineLVFlags').rfs,True)
+        self.assertEquals(obj.get_feature('KCRUidApSettingsHandlerUiLV.KApSettingsHandlerUiLVFlags').rfs,False)
+
+    def test_load_sequence_confml(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(sequencesettings)
+        obj = reader.loads(etree)
+        dcont = obj.get_data('BookmarkItems')
+        dview = obj.get_default_view()
+        self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').list_features(),['Type', 'Name'])
+        self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').list_all_features(),['Type', 'Name'])
+        datatable = dview.get_feature('BookmarkItems.BookmarkItem').get_data()
+        self.assertEquals(len(datatable), 3)
+        self.assertEquals(datatable[0].list_features(), ['Type', 'Name'])
+        self.assertEquals(datatable[0].get_feature('Name').get_value(), 'Download Applications')
+        self.assertEquals(datatable[0][0].get_value(), 'Folder1')
+        self.assertEquals(datatable[0][1].get_value(), 'Download Applications')
+        self.assertEquals(dview.get_feature('BookmarkItems.BookmarkItem').get_value(), 
+                          [
+                          ['Folder1','Download Applications'],
+                          ['Folder2','Download Images'],
+                          ['Folder3',None]])
+
+    def test_load_commsdat_sequence_confml_from_file(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        dview = obj.get_default_view()
+        dnsfea = dview.get_feature('DNs.DN')
+        self.assertEquals(dnsfea.list_features(),['Name', 'DNId', 'Metadata', 'Protection', 'Hidden', 'HiddenAgent', 'Highlighted', 'Icon', 'EmbeddedDN', 'IAP', 'IAP2', 'IAP3', 'IAP4', 'IAP5', 'IAP6', 'IAP7', 'IAP8', 'IAP9', 'IAP10'])
+        self.assertEquals(dnsfea.get_template(),['User Defined', '0', 'No', 'No', 'No', '11', None, None, None, None, None, None, None, None, None, None, None, None, None])
+        self.assertEquals(dnsfea.get_value(),
+        [['Internet', '1', 'Internet', '2', 'No', 'No', 'Yes', '0', None, None, None, None, None, None, None, None, None, None, None],
+         ['MMS', '2', 'MMS', '2', 'No', 'Yes', 'No', '2', None, None, None, None, None, None, None, None, None, None, None], 
+         ['Operator', '3', 'Operator', '2', 'No', 'No', 'No', '4', None, None, None, None, None, None, None, None, None, None, None]
+        ])
+
+    def test_load_content_sequence_confml_from_file(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/CVC_Content.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        dview = obj.get_default_view()
+        content = dview.get_feature('ContentFiles.contentfile')
+        self.assertEquals(content.list_all_features(),['fileelem', 'fileelem.localPath', 'fileelem.targetPath'])
+        self.assertEquals(content.value,[[['test/BookmarkImportSample.txt', None]]])
+        self.assertEquals(content.fileelem.localPath.value,['test/BookmarkImportSample.txt'])
+
+    def test_load_content_multiselection_confml_from_file(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('multiselection.confml')
+        dview = config.get_default_view()
+        multisel1 = dview.get_feature('MultiSelections.MultiSel1')
+        self.assertEquals(multisel1.value,["first selection","second selection"])
+        self.assertEquals(multisel1.get_data_cast(multisel1.get_value()),["first selection","second selection"])
+        self.assertEquals(multisel1.get_value(),["first selection","second selection"])
+        self.assertEquals(multisel1.get_data().get_value(),'"first selection" "second selection"')
+        
+        
+    def test_load_content_multiselection_empty_confml_from_file(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('multiselection.confml')
+        dview = config.get_default_view()
+        multisel1 = dview.get_feature('uda_selection.selectedfiles')
+        self.assertEquals(multisel1.get_value(),None)
+        self.assertEquals(multisel1.get_data().get_value(),None)
+        
+        
+        
+    def test_add_sequence_data_to_separate_confml(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data'),"w"))
+        config = prj.create_configuration('test2.confml')
+        seqconfig = config.create_configuration('sequence.confml')
+        config.create_configuration('testdata.confml')
+        seqconfig.add_feature(api.FeatureSequence('feature1'))
+        seqconfig.add_feature(api.Feature('child1'),'feature1')
+        seqconfig.add_feature(api.Feature('child2'),'feature1')
+        seqconfig.add_feature(api.Feature('child3'),'feature1')
+        dview = config.get_default_view()
+        self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
+        dview.get_feature('feature1').set_template(['c1','c2','c3'])
+        dview.get_feature('feature1').add_sequence(['row 1','43','56'])
+        dview.get_feature('feature1').add_sequence(['row 2','43','56'])
+        config.create_configuration('testdata2.confml')
+        dview.get_feature('feature1').add_sequence(['row 3','43','56'])
+        dview.get_feature('feature1').add_sequence(['row 4','43','56'])
+        dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
+        config.save()
+        prj.close()
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
+        config = prj.get_configuration('test2.confml')
+        dview = config.get_default_view()
+        self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
+        self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
+                                                                     ['row 4', '43', '56']])
+        self.assertEquals(dview.get_feature('feature1').get_data()[0]._index,0)
+        self.assertEquals(dview.get_feature('feature1').get_data()[0].get_value(),['row 3', '43', '56'])
+        self.assertEquals(dview.get_feature('feature1').get_data()[1].get_value(),['row 4', '43', '56'])
+        self.assertEquals(dview.get_feature('feature1').get_data()[0].get_data().find_parent(type=api.Configuration), config.get_configuration('testdata2.confml')._obj)
+        prj.remove_configuration('test2.confml')
+        
+        
+    def test_add_sequence_data_to_separate_confml_with_append_policy(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data'),"w"))
+        config = prj.create_configuration('test1.confml')
+        seqconfig = config.create_configuration('sequence.confml')
+        config.create_configuration('testdata.confml')
+        seqconfig.add_feature(api.FeatureSequence('feature1'))
+        seqconfig.add_feature(api.Feature('child1'),'feature1')
+        seqconfig.add_feature(api.Feature('child2'),'feature1')
+        seqconfig.add_feature(api.Feature('child3'),'feature1')
+        dview = config.get_default_view()
+        self.assertEquals(dview.get_feature('feature1').get_type(),'sequence')
+        dview.get_feature('feature1').set_template(['c1','c2','c3'])
+        dview.get_feature('feature1').add_sequence(['row 1','43','56'])
+        dview.get_feature('feature1').add_sequence(['row 2','43','56'])
+        config.create_configuration('testdata2.confml')
+        dview.get_feature('feature1').add_sequence(['row 3','43','56'])
+        dview.get_feature('feature1').add_sequence(['row 4','43','56'])
+        dview.get_feature('feature1').get_data()[1].set_value(['row 2 updated', 'foo', '56'])
+        config.save()
+        prj.close()
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
+        config = prj.get_configuration('test1.confml')
+        dview = config.get_default_view()
+        self.assertEquals(dview.get_feature('feature1').get_template(),['c1','c2','c3'])
+        self.assertEquals(dview.get_feature('feature1').get_value(),[['row 3', '43', '56'], 
+                                                                     ['row 4', '43', '56']])
+        self.assertEquals(dview.get_feature('feature1').get_data()[0]._index,0)
+        self.assertEquals(dview.get_feature('feature1').get_data()[0].get_value(),['row 3', '43', '56'])
+        self.assertEquals(dview.get_feature('feature1').get_data()[1].get_value(),['row 4', '43', '56'])
+        self.assertEquals(dview.get_feature('feature1').get_data()[0].get_data().find_parent(type=api.Configuration), config.get_configuration('testdata2.confml')._obj)
+        prj.remove_configuration('test1.confml')
+        
+    def test_load_view(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(simpleview)
+        obj = reader.loads(etree)
+        self.assertEquals(obj.get_name(), 'unknown')
+        self.assertEquals(obj.list_views(), ['Image creation'])
+        self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
+        self.assertEquals(obj.get_view('Image creation').desc,'Image creation related settings')
+        self.assertEquals(obj.get_view('Image creation').list_features(),[])
+        self.assertEquals(obj.get_view('Image creation').list_groups(),['Imageproperties'])
+        self.assertEquals(obj.get_view('Image creation').list_all_features(),['Imageproperties.imagetype', 
+                                                                           'Imageproperties.rofs3version', 
+                                                                           'Imageproperties.productname', 
+                                                                           'Imageproperties.outputLocation', 
+                                                                           'Imageproperties.imagetarget'])
+        self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetype').get_value(), '0') 
+        self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.rofs3version').get_value(), 'V .50.2009.04.0113 RND') 
+        self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.productname').get_value(), 'myProduct') 
+        self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.outputLocation').get_value(), 'myProduct') 
+        self.assertEquals(obj.get_view('Image creation').get_feature('Imageproperties.imagetarget').get_value(), '2') 
+        
+    def test_load_cvc_view(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'data')))
+        config = prj.get_configuration('cvc_root.confml')
+        dview = config.get_default_view()
+        self.assertEquals(config.list_views(),['cvc_view_confml.Custom modeled ConfMLs for customization  foo'])
+        view = config.get_view('cvc_view_confml.Custom modeled ConfMLs for customization  foo')
+        self.assertEquals(view.id, 'CVC')
+        self.assertEquals(view.list_groups(),['Applications', 'Connectivity', 'System', 'UI', 'Pre-Installed Content'])
+        self.assertEquals(view.list_features(),[])
+        group = view.get_group('Connectivity')
+        self.assertEquals(group.icon, 'connectivity_48_nav.png')
+        self.assertEquals(len(view.list_all_features()),130)
+
+
+    def test_load_booleans_confml_from_file(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/booleans.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        dview = obj.get_default_view()
+        boolfea = dview.get_feature('Booleans')
+        self.assertEquals(len(boolfea.list_features()),20)
+
+    def test_load_confml_with_properties(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/CVC_StartupShutdownAnimations.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        fea = obj.get_feature('CVC_StartupAnimationSequence.CVC_StartupAnimationTone')
+        self.assertEquals(fea.list_properties(),['maxSize'])
+        self.assertEquals(fea.properties['maxSize'].value,'100')
+
+        conffile = open(os.path.join(ROOT_PATH,"data/CVC_Preinstalled.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        fea = obj.get_feature('CVC_PreinstalledContent.CVC_PreInstalledMMSs.CVC_PreInstalledMMS')
+        self.assertEquals(fea.list_properties(),['maxFileSize'])
+        self.assertEquals(fea.properties['maxFileSize'].value,'35')
+
+    def test_load_voicemailbox_confml_from_file(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/voicemailbox.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        dview = obj.get_default_view()
+        stringfea = dview.get_feature('KCRUidVoiceMailbox.KVmbxNumberLinePrimary')
+        self.assertEquals(stringfea.type,'string')
+        self.assertEquals(stringfea.value,None)
+        
+    def test_load_facets(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        setting = obj.get_feature('Facets.MessageSize')
+        self.assertEquals(setting.minInclusive,'0')
+        self.assertEquals(setting.maxInclusive,'10')
+        setting = obj.get_feature('Facets.MessageSize2')
+        self.assertEquals(setting.minExclusive,'-1')
+        self.assertEquals(setting.maxExclusive,'11')
+        setting = obj.get_feature('Facets.StringPattern')
+        self.assertEquals(setting.pattern,"[a-zA-Z]{5,10}")        
+        setting = obj.get_feature('Facets.TotalDigits')
+        self.assertEquals(setting.totalDigits,'3')
+        dview = obj.get_default_view()
+        intfea = dview.get_feature('Facets.MessageSize')
+        self.assertEquals(intfea.type,'int')
+        self.assertEquals(intfea.value,9)
+             
+class TestConfigurationWriter(unittest.TestCase):    
+    def test_dump_simple_configuration(self):
+        config = api.Configuration("test.confml")
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        etree = writer.dumps(config)
+        self.assertEquals(etree.get('name'), 'test_confml')
+
+    def test_dump_configuration_with_include(self):
+        config = api.Configuration("test.confml")
+        config.include_configuration('path/to/config.confml')
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        self.assertEquals(etree.find('{http://www.w3.org/2001/XInclude}include').get('href'), 'path/to/config.confml')
+
+    def test_dump_configuration_with_feature_sequence(self):
+        config = api.Configuration("test.confml")
+        config.add_feature(api.Feature('test'))
+        config.add_feature(api.FeatureSequence('sequentialfeature'),'test')
+        config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting1'))
+        config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting2'))
+        config.test.sequentialfeature.add_feature(model.ConfmlSetting('setting3'))
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        self.assertEquals([elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')][0].get('ref'), 'sequentialfeature')
+
+    def test_dump_complex_configuration(self):
+        config = api.Configuration("test.confml")
+        config.include_configuration('path/to/config1.confml')
+        config.include_configuration('path/to/config2.confml')
+        config.include_configuration('path/to/config3.confml')
+        config.add( model.ConfmlMeta([model.ConfmlMetaProperty('test', '123'),\
+                                      model.ConfmlMetaProperty('model', 'foo')]))
+        config.add( model.ConfmlDescription( 'Description text' ) )
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        self.assertEquals([elem.get('href') for elem in etree.getiterator('{http://www.w3.org/2001/XInclude}include')], 
+                          ['path/to/config1.confml',
+                           'path/to/config2.confml',
+                           'path/to/config3.confml'
+                           ])
+        meta = etree.find('{http://www.s60.com/xml/confml/2}meta')
+        self.assertEquals(meta.find('{http://www.s60.com/xml/confml/2}test').text,'123')
+        self.assertEquals(meta.find('{http://www.s60.com/xml/confml/2}model').text,'foo')
+        self.assertEquals(etree.find('{http://www.s60.com/xml/confml/2}desc').text,'Description text')
+
+    def test_dump_load_configuration(self):
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        config = model.ConfmlConfiguration("test.confml")
+        config.include_configuration('path/to/config1.confml')
+        config.include_configuration('path/to/config2.confml')
+        config.include_configuration('path/to/config3.confml')
+        config.meta = model.ConfmlMeta([model.ConfmlMetaProperty('test', '123'),\
+                                      model.ConfmlMetaProperty('model', 'foo'),\
+                                      model.ConfmlMetaProperty('configuration-property', None, \
+                                                               'http://www.nokia.com/xml/cpf-id/1', \
+                                                               attrs ={"name":"123", "value": "234"})])
+        config.desc = 'Description text'
+        etree= writer.dumps(config)
+        xmlstr = ElementTree.tostring(etree)
+        config2 = persistentconfml.get_reader_for_elem("configuration").loads(ElementTree.fromstring(xmlstr))
+        self.assertEquals(config2.get_ref(),config.ref)
+        self.assertEquals(config2._list(),config._list())
+        self.assertEquals(config2.desc,'Description text')
+        elem = config2.meta.get_property_by_tag('test')
+        self.assertEquals(elem.tag, 'test')
+        self.assertEquals(elem.value, '123')
+
+        self.assertEquals(config2.meta[0].tag, 'test')
+        self.assertEquals(config2.meta[0].value, '123')
+        self.assertEquals(config2.meta[1].tag, 'model')
+        self.assertEquals(config2.meta[1].value, 'foo')
+        self.assertEquals(config2.meta[2].tag, 'configuration-property')
+        self.assertEquals(config2.meta[2].value, None)
+        self.assertEquals(config2.meta[2].ns, 'http://www.nokia.com/xml/cpf-id/1')
+        self.assertEquals(config2.meta[2].attrs, {"name":"123", "value": "234"})
+
+
+    def test_configuration_with_features_and_properties(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSetting('testfea11'))
+        config.testfea11.add_property(name='smaller',value='10')
+        config.testfea11.add_property(name='bigger',value='1', unit='B')
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.properties['smaller'].value,'10')
+        self.assertEquals(config2.testfea11.properties['bigger'].value,'1')
+
+    def test_configuration_with_features_and_minoccurs(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSequenceSetting('testfea11'))
+        config.testfea11.minOccurs = 1
+        config.testfea11.maxOccurs = 10
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.minOccurs,1)
+        self.assertEquals(config2.testfea11.maxOccurs,10)
+
+    def test_configuration_with_features_and_readonly(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSequenceSetting('testfea11'))
+        config.add_feature(model.ConfmlSetting('readme',readOnly=True))
+        config.add_feature(model.ConfmlSetting('writeme',readOnly=False))
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.readOnly,None)
+        self.assertEquals(config2.readme.readOnly,True)
+        self.assertEquals(config2.writeme.readOnly,False)
+
+    def test_configuration_with_features_and_constraint(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSequenceSetting('testfea11'))
+        config.add_feature(model.ConfmlSetting('const',constraint=". &gt; '1'"))
+        config.add_feature(model.ConfmlSetting('writeme',readOnly=False, constraint='foo bar'))
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.constraint,None)
+        self.assertEquals(config2.const.constraint,". &gt; '1'")
+        self.assertEquals(config2.writeme.readOnly,False)
+        self.assertEquals(config2.writeme.constraint,"foo bar")
+
+    def test_configuration_with_features_and_required_attr(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSequenceSetting('testfea11'))
+        config.add_feature(model.ConfmlSetting('requ',required=True))
+        config.add_feature(model.ConfmlSetting('writeme',required=False, readOnly=False))
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.required,None)
+        self.assertEquals(config2.requ.required,True)
+        self.assertEquals(config2.writeme.readOnly,False)
+        self.assertEquals(config2.writeme.required,False)
+
+    def test_configuration_with_features_and_relevant_attr(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSequenceSetting('testfea11'))
+        config.add_feature(model.ConfmlSetting('requ',relevant='testfea11'))
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea11.relevant,None)
+        self.assertEquals(config2.requ.relevant,'testfea11')
+
+    def test_configuration_with_features_and_maxlength(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSetting('testfea1', type='int'))
+        config.add_feature(model.ConfmlSetting('testfea2', type='int'))
+        config.add_feature(model.ConfmlSetting('testfea3', type='int',maxLength=100))
+        config.testfea1.maxLength = 10
+
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea1.maxLength,10)
+        self.assertEquals(config2.testfea2.maxLength,None)
+        self.assertEquals(config2.testfea3.maxLength,100)
+
+    def test_configuration_with_features_and_maxlength(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(model.ConfmlSetting('testfea1', type='int'))
+        config.add_feature(model.ConfmlSetting('testfea2', type='int'))
+        config.add_feature(model.ConfmlSetting('testfea3', type='int',minLength=100))
+        config.testfea1.minLength = 10
+
+        elem = persistentconfml.dumps(config)
+        config2 =  persistentconfml.loads(elem)
+        self.assertEquals(config2.testfea1.minLength,'10')
+        self.assertEquals(config2.testfea3.minLength,'100')
+        self.assertEquals(config2.testfea2.minLength,None)
+
+    def test_configuration_with_features(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(api.Feature('testfea1'))
+        config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
+        config.add_feature(api.Feature('testfea2'))
+        set1 = model.ConfmlSetting('testfea21', type='selection')
+        set1.create_option('pre', '1')
+        set1.create_option('normal', '2')
+        set1.create_option('post', '3')
+        config.add_feature(set1, 'testfea2')
+        config.add_feature(api.Feature('testfea4'))
+        config.add_feature(api.Feature('testfea5'))
+        config.add_feature(api.Feature('testfea6'))
+        set1.set_value('pre')
+        config.testfea1.set_value('foo:bar')
+        config.testfea4.set_value('4')
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        #print ElementTree.tostring(elem)
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
+        self.assertEquals(fea1.get('ref'),'testfea1')
+        self.assertEquals(fea1.find('{http://www.s60.com/xml/confml/2}setting').get('ref'),'testfea11')
+        config2 =  persistentconfml.get_reader_for_elem('configuration').loads(etree)
+        self.assertEquals(config2.testfea1.list_features(),['testfea11'])
+        self.assertEquals(config2.testfea2.list_features(),['testfea21'])
+        self.assertEquals(config2.testfea2.testfea21.get_type(),'selection')
+        self.assertTrue('1' in config2.testfea2.testfea21.get_valueset())
+        self.assertTrue('2' in config2.testfea2.testfea21.get_valueset())
+        self.assertEquals(config2.testfea2.testfea21.options['3'].get_name(), 'post')
+        self.assertEquals(config2.testfea2.testfea21.get_value(), 'pre')
+
+    def test_write_configuration_with_multiselections(self):
+        config = model.ConfmlConfiguration("test.confml")
+        config.add_feature(api.Feature('testfea1'))
+        config.testfea1.add_feature(model.ConfmlSetting('testfea11'))
+        config.add_feature(api.Feature('testfea2'))
+        set1 = model.ConfmlMultiSelectionSetting('testfea21')
+        set1.create_option('pre', '1')
+        set1.create_option('normal', '2')
+        set1.create_option('post', '3')
+        config.add_feature(set1, 'testfea2')
+        config.add_feature(api.Feature('testfea4'))
+        config.add_feature(api.Feature('testfea5'))
+        config.add_feature(api.Feature('testfea6'))
+        set1.value = ["pre","post"]       
+        self.assertEquals(set1.get_data().get_value(), '"pre" "post"')
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        self.assertEquals(ElementTree.tostring(elem), '<configuration name="test_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema"><feature name="testfea1" ref="testfea1"><setting name="testfea11" ref="testfea11" /></feature><feature name="testfea2" ref="testfea2"><setting name="testfea21" ref="testfea21" type="multiSelection"><option name="pre" value="1" /><option name="normal" value="2" /><option name="post" value="3" /></setting></feature><feature name="testfea4" ref="testfea4" /><feature name="testfea5" ref="testfea5" /><feature name="testfea6" ref="testfea6" /><data><testfea2><testfea21>"pre" "post"</testfea21></testfea2></data></configuration>')
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        fea1 = etree.find('{http://www.s60.com/xml/confml/2}feature')
+        self.assertEquals(fea1.get('ref'),'testfea1')
+        self.assertEquals(fea1.find('{http://www.s60.com/xml/confml/2}setting').get('ref'),'testfea11')
+        config2 =  persistentconfml.get_reader_for_elem('configuration').loads(etree)
+        self.assertEquals(config2.testfea2.list_features(),['testfea21'])
+        self.assertEquals(config2.testfea2.testfea21.get_type(),'multiSelection')
+        self.assertEquals(config2.testfea2.testfea21.get_value(), ['pre', 'post'])
+
+    def test_configuration_with_view(self):
+        config = api.Configuration("view.confml")
+        config.add_view('testing')
+        view = config.get_view('testing')
+        view.add_group('group1')
+        view.add_group('group2')
+        view.add_group('group3')
+        view.group1.add(api.FeatureLink('test.foo'))
+        view.group2.add(api.FeatureLink('foo.*'))
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(config)
+        etree = ElementTree.fromstring(ElementTree.tostring(elem))
+        view = etree.find('{http://www.s60.com/xml/confml/2}view')
+        groups = etree.getiterator('{http://www.s60.com/xml/confml/2}group')
+        listgroups = [elem for elem in groups]
+        
+        self.assertEquals(listgroups[0].get('name'), 'group1')
+        self.assertEquals(listgroups[1].get('name'), 'group2')
+        self.assertEquals(listgroups[2].get('name'), 'group3')
+        settings = [elem for elem in etree.getiterator('{http://www.s60.com/xml/confml/2}setting')]
+        self.assertEquals(settings[0].get('ref'), 'test/foo')
+        self.assertEquals(settings[1].get('ref'), 'foo/*')
+
+    def test_load_dump_reload_configuration_with_view(self):
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(simpleview)
+        obj = reader.loads(etree)
+        # Getting the view populates it and check that the writing still works
+        self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
+        self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
+        self.assertEquals(obj.get_view('Image creation').list_groups(), ['Imageproperties'])
+        writer = persistentconfml.get_writer_for_class("Configuration")
+        elem = writer.dumps(obj)
+        # Reload the configuration with view after dumping it to ensure data stays the same
+        elemstr = ElementTree.tostring(elem)      
+        etree = ElementTree.fromstring(elemstr)
+        obj = reader.loads(etree)
+        self.assertEquals(obj.get_view('Image creation').get_name(),'Image creation')
+        self.failUnlessEqual(obj.get_view('Image creation').id,'imakerimage', 'Known bug (#564)')
+        self.assertEquals(obj.get_view('Image creation').id,'imakerimage')
+        
+    def test_load_configuration_and_create_copy_and_dump(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/commsdatcreator.confml"))
+        #reader = persistentconfml.get_reader_for_elem("configuration")
+        #etree = ElementTree.fromstring(conffile.read())
+        obj = persistentconfml.loads(conffile.read())
+        copyconfig = api.Configuration('data/copy_commsdatcreator.confml')
+        
+        for child in obj._objects():
+            copyconfig._add(child)
+        output = persistentconfml.dumps(copyconfig)
+        ofile = open(os.path.join(ROOT_PATH,'data/copy_commsdatcreator.confml'),"wb")
+        ofile.write(output)
+        ofile.close()
+        newconfig = persistentconfml.loads(output)
+        orgview = obj.get_default_view()
+        newview = newconfig.get_default_view()
+        for fea in orgview.list_all_features():
+            orgval = orgview.get_feature(fea).get_value() 
+            newval = newview.get_feature(fea).get_value()
+            if not orgval == newval:
+                self.fail("Value of %s does not match. org = %s != new = %s" % (fea,orgval,newval))
+        
+    def test_create_configuration_with_meta_and_dump(self):
+        prj = api.Project(api.Storage.open('dump','w'))
+        testconf = prj.create_configuration('test.confml')
+        testconf.include_configuration('test/foo.confml')
+        testconf.save()
+        prj.close()
+        prj2 = api.Project(api.Storage.open('dump','a'))
+        testconf = prj2.get_configuration('test.confml')
+        testconf.meta = model.ConfmlMeta()
+        testconf.meta.append(model.ConfmlMetaProperty('test', 'foo one two'))
+        testconf.meta.append(model.ConfmlMetaProperty('owner', 'test erik'))
+        testconf.save()
+        prj2.close()
+        prj = api.Project(api.Storage.open('dump','a'))
+        testconf = prj.get_configuration('test.confml')
+        self.assertEquals(testconf.meta[0].tag, 'test')
+        self.assertEquals(testconf.meta[0].value,'foo one two')
+        self.assertEquals(testconf.meta[1].tag, 'owner')
+        self.assertEquals(testconf.meta[1].value,'test erik')
+        del testconf.meta[1]
+        del testconf.meta
+        testconf.save()
+        prj.close()
+        prj = api.Project(api.Storage.open('dump','a'))
+        testconf = prj.get_configuration('test.confml')
+        self.assertEquals(testconf.meta, None)
+        prj.close()
+        shutil.rmtree('dump')
+
+class TestMeta(unittest.TestCase):
+    def test_get_reader_for_meta(self):
+        reader = persistentconfml.get_reader_for_elem("meta")
+        self.assertTrue(isinstance(reader, persistentconfml.MetaReader))
+
+    def test_parse_meta_elem(self):
+        reader = persistentconfml.get_reader_for_elem("meta")
+        elem = ElementTree.Element('meta')
+        owner = ElementTree.Element('owner')
+        owner.text = 'Testing owner'
+        origin = ElementTree.Element('origin')
+        origin.text = 'just origin'
+        target = ElementTree.Element('target')
+        target.text = 'target hw'
+        elem.append(owner)
+        elem.append(origin)
+        elem.append(target)
+        data = reader.loads(elem)
+        self.assertEquals(data[0].tag, 'owner')
+        self.assertEquals(data[0].value, 'Testing owner')
+        self.assertEquals(data[1].tag, 'origin')
+        self.assertEquals(data[1].value, 'just origin')
+        self.assertEquals(data[2].tag, 'target')
+        self.assertEquals(data[2].value, 'target hw')
+
+    def test_write_meta_elem(self):
+        writer = persistentconfml.get_writer_for_class("ConfmlMeta")
+        celem = model.ConfmlMeta([model.ConfmlMetaProperty('test', 123),\
+                                 model.ConfmlMetaProperty('owner', "some ownername"),\
+                                 model.ConfmlMetaProperty('target', "hw")])
+        etree = writer.dumps(celem)
+        self.assertEquals(etree.find('test').text,123)
+        self.assertEquals(etree.find('owner').text,'some ownername')
+        self.assertEquals(etree.find('target').text,'hw')
+        
+#    
+class TestDesc(unittest.TestCase):
+    def test_get_reader_for_desc(self):
+        reader = persistentconfml.get_reader_for_elem("desc")
+        self.assertTrue(isinstance(reader, persistentconfml.DescReader))
+
+    def test_parse_desc_elem(self):
+        reader = persistentconfml.get_reader_for_elem("meta")
+        elem = ElementTree.Element('desc')
+        elem.text = 'Testing desc'
+        data = reader.loads(elem)
+
+    def test_write_desc_elem(self):
+        writer = persistentconfml.get_writer_for_class("ConfmlDescription")
+        celem = model.ConfmlDescription('testing')
+        etree = writer.dumps(celem)
+        self.assertEquals(etree.text,'testing')
+
+class TestFeature(unittest.TestCase):
+    def test_get_reader_for_feature(self):
+        reader = persistentconfml.get_reader_for_elem("feature")
+        self.assertTrue(isinstance(reader, persistentconfml.FeatureReader))
+
+    def test_parse_feature_elem(self):
+        reader = persistentconfml.get_reader_for_elem("feature")
+        elem = ElementTree.Element('feature', 
+                                   {'ref' : 'hiifoo',
+                                    'name': 'Some other name'})
+        fea = reader.loads(elem)
+        self.assertEquals(fea.get_ref(),'hiifoo')
+        self.assertEquals(fea.get_name(),'Some other name')
+
+    def test_write_feature_elem(self):
+        writer = persistentconfml.get_writer_for_class("Feature")
+        celem = api.Feature('testing')
+        etree = writer.dumps(celem)
+        self.assertEquals(etree.get('ref'),'testing')
+        self.assertEquals(etree.get('name'),'testing')
+
+
+class TestSetting(unittest.TestCase):
+    def test_get_reader_for_feature(self):
+        reader = persistentconfml.get_reader_for_elem("setting")
+        self.assertTrue(isinstance(reader, persistentconfml.ConfmlSettingReader))
+
+    def test_parse_elem(self):
+        reader = persistentconfml.get_reader_for_elem("setting")
+        elem = ElementTree.Element('setting', 
+                                   {'ref' : 'hiifoo',
+                                    'name': 'Some other name',
+                                    'type' :'int',
+                                    'readOnly': 'true'})
+        fea = reader.loads(elem)
+        self.assertEquals(fea.get_ref(),'hiifoo')
+        self.assertEquals(fea.get_name(),'Some other name')
+        self.assertEquals(fea.get_type(),'int')
+
+    def test_write_setting_elem(self):
+        writer = persistentconfml.get_writer_for_class("ConfmlSetting")
+        celem = model.ConfmlSetting('testing')
+        etree = writer.dumps(celem)
+        self.assertEquals(etree.get('ref'),'testing')
+        self.assertEquals(etree.get('name'),'testing')
+        self.assertEquals(etree.get('type'),None)
+
+    def test_write_setting_with_options(self):
+        writer = persistentconfml.get_writer_for_class("ConfmlSetting")
+        elem = model.ConfmlSetting('testing', type='selection')
+        elem.create_option('one','1')
+        elem.create_option('two','2')
+        elem.create_option('three','3')
+        elem.create_option('four','bar')
+        etree = writer.dumps(elem)
+
+        self.assertEquals(etree.get('ref'),'testing')
+        self.assertEquals(etree.get('name'),'testing')
+        self.assertEquals(etree.get('type'),'selection')
+        self.assertEquals(etree.find('option').get('name'),'one')
+        self.assertEquals(etree.find('option').get('value'),'1')
+
+    def test_write_setting_with_facets(self):
+        writer = persistentconfml.get_writer_for_class("ConfmlSetting")
+        setting = model.ConfmlIntSetting(name="Int Setting", ref='intSetting')
+        setting.minInclusive = 0
+        setting.maxInclusive = 10
+        setting.minExclusive = 0
+        setting.maxExclusive = 10
+        setting.totalDigits = 3
+        setting.pattern = "\d*{3}"
+        etree = writer.dumps(setting)
+        
+        self.assertEquals(etree.find('xs:minInclusive').get('value'),'0')
+        self.assertEquals(etree.find('xs:maxInclusive').get('value'),'10')
+        self.assertEquals(etree.find('xs:minExclusive').get('value'),'0')
+        self.assertEquals(etree.find('xs:maxExclusive').get('value'),'10')
+        self.assertEquals(etree.find('xs:totalDigits').get('value'),'3')
+        self.assertEquals(etree.find('xs:pattern').get('value'),'\d*{3}')
+        
+        conffile = open(os.path.join(ROOT_PATH,"data/facets.confml"))
+        obj = persistentconfml.loads(conffile.read())
+        
+        new_path = os.path.join(ROOT_PATH,"temp/facets_dumped.confml")
+        dir = os.path.dirname(new_path)
+        if dir and not os.path.exists(dir):
+            os.makedirs(dir)
+        f = open(new_path,"wb")
+        try:        f.write(persistentconfml.dumps(obj))
+        finally:    f.close()
+        
+    def test_read_setting_with_options(self):
+        reader = persistentconfml.get_reader_for_elem("setting")
+        elem = ElementTree.Element('setting', {'ref' : 'hii',
+                                               'name': 'hoo hii',
+                                               'type': 'selection'})
+        elem.append(ElementTree.Element('option', {'name': 'test1', 'value': '123'}))
+        elem.append(ElementTree.Element('option', {'name': 'test2', 'value': '456'}))
+        elem.append(ElementTree.Element('option', {'name': 'test3', 'value': '789'}))
+        setobj = reader.loads(elem)
+        vset = setobj.get_valueset()
+        self.assertTrue('123' in vset)
+        self.assertTrue('456' in vset)
+        self.assertTrue('789' in vset)
+        self.assertEquals(setobj.options['123'].get_value(),'123')
+        self.assertEquals(setobj.options['456'].get_value(),'456')
+        self.assertEquals(setobj.options['789'].get_value(),'789')
+
+    def test_read_sequence_setting(self):
+        reader = persistentconfml.get_reader_for_elem("setting")
+        elem = ElementTree.Element('setting', {'ref' : 'hii',
+                                               'name': 'hoo hii',
+                                               'type': 'sequence'})
+        elem.append(ElementTree.Element('setting', {'ref' : 'intsetting',
+                                               'name': 'intme',
+                                               'type': 'int'}))
+        elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
+                                               'name': 'strme',
+                                               'type': 'string'}))
+        setobj = reader.loads(elem)
+        self.assertEquals(setobj.list_features(), ['intsetting', 'strsetting'])
+        self.assertEquals(setobj.intsetting.fqr, 'hii.intsetting')
+
+    def test_read_sequence_setting_with_mapping(self):
+        reader = persistentconfml.get_reader_for_elem("setting")
+        elem = ElementTree.Element('setting', {'ref' : 'hii',
+                                               'name': 'hoo hii',
+                                               'type': 'sequence',
+                                               'mapKey': 'intsetting',
+                                               'mapValue': 'strsetting'})
+        elem.append(ElementTree.Element('setting', {'ref' : 'intsetting',
+                                               'name': 'intme',
+                                               'type': 'int'}))
+        elem.append(ElementTree.Element('setting', {'ref' : 'strsetting',
+                                               'name': 'strme',
+                                               'type': 'string'}))
+        setobj = reader.loads(elem)
+        self.assertEqual(setobj.get_map_key().name,"intme")
+        self.assertEqual(setobj.get_map_value().name,"strme")
+
+class TestSettingData(unittest.TestCase):
+    def test_get_reader_for_data(self):
+        reader = persistentconfml.get_reader_for_elem("data")
+        self.assertTrue(isinstance(reader, persistentconfml.DataReader))
+
+    def test_get_writer_for_data(self):
+        writer = persistentconfml.get_writer_for_class("Data")
+        self.assertTrue(isinstance(writer, persistentconfml.DataWriter))
+
+    def test_dump_data(self):
+        writer = persistentconfml.get_writer_for_class("Data")
+        dobj = api.Data(ref='foo', value=1)
+        elem = writer.dumps(dobj)
+        self.assertEquals(elem.text, 1)
+
+    def test_dump_data_with_subref(self):
+        writer = persistentconfml.get_writer_for_class("DataContainer")
+        base = api.DataContainer('foo')
+        base._add(api.Data(fqr='foo.bar', value='test'))
+        elem = writer.dumps(base)
+        self.assertEquals(elem.find('bar').text, 'test')
+
+    def test_dump_data_with_long_ref(self):
+        writer = persistentconfml.get_writer_for_class("Data")
+        base = api.Data(ref='foo')
+        base._add(api.Data(ref='bar'))
+        base._add_to_path('bar',api.Data(ref='test',  value='test'))
+        elem = writer.dumps(base)
+        self.assertEquals(elem.find('bar').find('test').text, 'test')
+
+    def test_dump_data_with_hierarchy(self):
+        writer = persistentconfml.get_writer_for_class("Data")
+        base = api.DataContainer('foo')
+        base._add(api.Data(fqr='foo.bar', value='test'))
+        elem = writer.dumps(base)
+        self.assertEquals(elem.find('bar').text, 'test')
+
+    def test_read_data_with_map(self):
+        reader = persistentconfml.get_reader_for_elem("data")
+        data = ElementTree.Element('data')
+        feature = ElementTree.Element('foo')
+        data.append(feature)
+        feature.append(ElementTree.Element('bar', {'map' : "foo/bar[@key='key 1']"}))
+        
+        obj = reader.loads(data)
+        bar = obj._get('foo.bar')
+        self.assertEqual(bar.get_map(),"foo/bar[@key='key 1']")
+
+    def test_load_confml_with_meta(self):
+        conffile = open(os.path.join(ROOT_PATH,"data/accessoryserver.confml"))
+        reader = persistentconfml.get_reader_for_elem("configuration")
+        etree = ElementTree.fromstring(conffile.read())
+        obj = reader.loads(etree)
+        self.assertEquals(obj.meta.get('type'), 'featurelist')
+
+class TestReadWriteConfml(BaseTestCase):
+    """
+    Test case for ensuring that reading in a ConfML file and then writing
+    it out again results in logically the same data (XML-wise) as the
+    original data was.
+    """
+    
+    def _normalize_xml_data(self, data):
+        """
+        Normalize XML data so that it can be compared using a binary
+        comparison.
+        """
+        etree = ElementTree.fromstring(data)
+        persistence.indent(etree)
+        normalized_data = ElementTree.tostring(etree)
+        return normalized_data
+    
+    def _run_read_and_write_test(self, file_name, input_dir, output_dir):
+        file_path = os.path.join(input_dir, file_name)
+        
+        f = open(file_path, "rb")
+        try:        original_data = f.read()
+        finally:    f.close()
+        
+        original_data_normalized = self._normalize_xml_data(original_data)
+        
+        model = persistentconfml.loads(original_data)
+        model_data = persistentconfml.dumps(model)
+        
+        model_data_normalized = self._normalize_xml_data(model_data)
+        
+        PATH_ORIGINAL = os.path.join(output_dir, 'original', file_name)
+        PATH_DUMPED   = os.path.join(output_dir, 'dumped', file_name)
+        
+        if original_data_normalized != model_data_normalized:
+            def write(file_path, data):
+                file_dir = os.path.dirname(file_path)
+                if not os.path.exists(file_dir):
+                    os.makedirs(file_dir)
+                f = open(file_path, "wb")
+                try:        f.write(data)
+                finally:    f.close()
+            
+            write(PATH_ORIGINAL, original_data_normalized)
+            write(PATH_DUMPED, model_data_normalized)
+            self.fail("Known bug (#506)")
+            self.fail("Read-write output for file '%s' is different, see the files in '%s'" % (file_name, output_dir))
+        else:
+            # Test was successful, remove any old files that might have been there,
+            # so that the output directories only contain files for the tests that
+            # failed
+            self.remove_if_exists(PATH_ORIGINAL)
+            self.remove_if_exists(PATH_DUMPED)
+    
+    def _run_test_for_file(self, file_path):
+        self._run_read_and_write_test(
+            file_name  = os.path.basename(file_path),
+            input_dir  = os.path.dirname(file_path),
+            output_dir = os.path.normpath(os.path.join(ROOT_PATH, 'temp/read_write_results')))
+
+# Create a separate test method for each ConfML file in the read-write test data
+_READ_WRITE_TESTDATA_DIR = os.path.join(ROOT_PATH, 'testdata/read_write')
+for filename in filter(lambda fn: fn.endswith('.confml'), os.listdir(_READ_WRITE_TESTDATA_DIR)):
+    path = os.path.join(_READ_WRITE_TESTDATA_DIR, filename)
+    test_method_name = 'test_read_write_file__%s' % filename.replace('.', '_')
+    
+    # Use a separate function to create and set the lambda function on the
+    # test class, because otherwise 'path' would be the last one value set to
+    # it in the for loop
+    def _register_test_method(path):
+        method = lambda self: self._run_test_for_file(path)
+        method.__name__ = test_method_name
+        setattr(TestReadWriteConfml, test_method_name, method)
+    _register_test_method(path)
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys,os
+
+__all__ = []
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+TESTAUTO_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../testautomation'))
+if SOURCE_ROOT not in sys.path:
+    sys.path.append(SOURCE_ROOT)
+if TESTAUTO_ROOT not in sys.path:
+    sys.path.insert(0,TESTAUTO_ROOT)
+    
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    sys.path.insert(0, ROOT_PATH)
+    try:
+        suite = unittest.TestSuite()
+        for test_module in __all__:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
\ No newline at end of file
Binary file configurationengine/source/cone/core/tests/testdata/multiroot_test.zip has changed
Binary file configurationengine/source/cone/core/tests/testdata/test_project.cpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/unittest_configuration.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,149 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+
+import __init__
+from cone.public import api, plugin
+from cone.core import *
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+test_project        = os.path.join(ROOT_PATH,"testdata/test_project.cpf")
+multiroot_project   = os.path.join(ROOT_PATH,"testdata/multiroot_test.zip")
+
+class TestConfiguration(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    # @test 
+    def test_create_configuration(self):
+        conf = api.Configuration("foobar/testmee.confml")
+        self.assertTrue(conf)
+    
+    def test_get_root(self):
+        conf = api.Configuration("foobar/testmee.confml")
+        self.assertEquals(conf.get_path(),"foobar/testmee.confml")
+    
+    def test_add_layer(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_configuration(api.Configuration("foo.confml",namespace="foo"))
+        self.assertEquals(conf.list_configurations(),["foo.confml"])
+    
+    def test_meta_desc(self):
+        conf = api.Configuration("test.confml")
+        conf.meta = {'test':'data','test2':'value'}
+        conf.desc = "Description osos"
+        self.assertEquals(conf.meta['test'],"data")
+        self.assertEquals(conf.meta['test2'],"value")
+        self.assertEquals(conf.desc,"Description osos")
+
+
+    def test_project_list_all_sequence_features(self):
+        fs = api.Storage.open(test_project)
+        p  = api.Project(fs)
+        config = p.get_configuration('root5.confml')
+        view = config.get_default_view()
+        print "Fealist %s." % len(view.list_all_features())
+        self.assertEquals(len(view.list_all_features()), 62)
+        for feaname in view.list_all_features():
+            fea = view.get_feature(feaname)
+            if fea.get_type() == 'sequence':
+                print "%s" % feaname,
+                print " = %s" % fea.get_value()
+
+    def test_get_implml_container(self):
+        fs = api.Storage.open(test_project)
+        p  = api.Project(fs)
+        config = p.get_configuration('root5.confml')
+        implcont = plugin.get_impl_set(config, 'foo$')
+        self.assertEquals(implcont.list_implementation(),[])
+    
+    def test_multiple_open_configurations_in_one_project(self):
+        prj = api.Project(api.Storage.open(multiroot_project, "r"))
+        
+        conf1 = prj.get_configuration('root1.confml')
+        
+        # Getting the same configuration again should return the same object
+        self.assertTrue(conf1 is prj.get_configuration('root1.confml'))
+        
+        conf2 = prj.get_configuration('root2.confml')
+        self.assertFalse(conf1 is conf2)
+        
+        # Test getting default views
+        dview1 = conf1.get_default_view()
+        dview2 = conf2.get_default_view()
+        dview3 = prj.get_configuration('root3.confml').get_default_view()
+        dview4 = prj.get_configuration('root4.confml').get_default_view()
+        dview5 = prj.get_configuration('root5.confml').get_default_view()
+        self.assertFalse(dview1 is dview2)
+        self.assertFalse(dview2 is dview3)
+        self.assertFalse(dview3 is dview4)
+        self.assertFalse(dview4 is dview5)
+        self.assertTrue(dview1 is conf1.get_default_view())
+        
+        # Test listing features from different configurations
+        self.assertEquals(dview1.list_all_features(), dview2.list_all_features())
+        self.assertEquals(dview2.list_all_features(), dview3.list_all_features())
+        # Layer 4 introduces a new feature
+        self.assertNotEquals(dview3.list_all_features(), dview4.list_all_features())        
+        self.assertTrue('Layer4Feature' in dview4.list_all_features())
+        self.assertTrue('Layer4Feature.RealSetting' in dview4.list_all_features())
+        self.assertEquals(dview4.list_all_features(), dview5.list_all_features())
+        
+        # Test getting the same feature from different configurations
+        FEATURE_REF = 'Feature1.StringSetting'
+        ss1 = dview1.get_feature(FEATURE_REF)
+        ss2 = dview2.get_feature(FEATURE_REF)
+        ss3 = dview3.get_feature(FEATURE_REF)
+        ss4 = dview4.get_feature(FEATURE_REF)
+        ss5 = dview5.get_feature(FEATURE_REF)
+        self.assertFalse(ss1 is ss2)
+        self.assertFalse(ss2 is ss3)
+        self.assertFalse(ss3 is ss4)
+        self.assertFalse(ss4 is ss5)
+        
+        # Test getting values for the features
+        self.assertEquals(ss1.get_value(), 'default string')
+        self.assertEquals(ss2.get_value(), 'layer 2 string')
+        self.assertEquals(ss3.get_value(), 'layer 3 string')
+        self.assertEquals(ss4.get_value(), 'layer 4 string')
+        # Layer 5 contains no data, so the value should be the same as on layer 4
+        self.assertEquals(ss5.get_value(), 'layer 4 string')
+
+
+#if __name__ == '__main__':
+#      unittest.main()
+
+
+def profile_project_list_all_features():
+    fs = api.Storage.open(configproject)
+    p  = api.Project(fs)
+    config = p.get_configuration('s60.confml')
+    view = config.get_default_view()
+    print "Fealist %s." % len(view.list_all_features())
+    #for fea in view.list_all_features():
+    #    if view.get_feature(fea).get_type() == 'sequence':
+    #        print "%s" % fea
+    #        print " = %s" % view.get_feature(fea).get_value()
+if __name__ == '__main__':
+    
+      import cProfile
+      cProfile.run('profile_project_list_all_features()',None,'time')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/unittest_configuration_project_export.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,214 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF configuration
+"""
+import unittest
+import string
+import sys,os,shutil
+import difflib, zipfile
+
+import __init__
+
+from cone.public import exceptions,utils, api
+from cone.storage.filestorage import FileStorage
+from cone.storage.zipstorage import ZipStorage
+from testautomation import unzip_file
+from testautomation.base_testcase import BaseTestCase
+
+ROOT_PATH       = os.path.dirname(os.path.abspath(__file__))
+temp_dir        = os.path.join(ROOT_PATH,"temp/export")
+test_cpf        = os.path.join(ROOT_PATH,"testdata/test_project.cpf")
+datafolder      = os.path.join(ROOT_PATH,"../../storage/tests/data")
+tempzip         = os.path.join(temp_dir, "exported.zip")
+
+class TestConeProjectExport(BaseTestCase):
+    def setUp(self):
+        if not os.path.exists(temp_dir):
+            os.makedirs(temp_dir)
+
+    def test_export_to_zipstorage(self):
+        test_project_dir = os.path.join(temp_dir, "test_project_1")
+        unzip_file.unzip_file(test_cpf, test_project_dir, delete_if_exists=True)
+        
+        export_zip = os.path.join(temp_dir, "configexport.zip")
+        
+        fs = FileStorage(test_project_dir)
+        p  = api.Project(fs)
+        conf = p.get_configuration('root5.confml')
+        zs = ZipStorage(export_zip,"w")
+        zp  = api.Project(zs)
+        conf_files = conf.list_resources()
+        files1 = ['.metadata']
+        files1.extend(conf_files)
+        p.export_configuration(conf,zs)
+        zp.close()
+        self.assertTrue(os.path.exists(export_zip))
+        zfile = zipfile.ZipFile(export_zip,"r")
+        files2 = zfile.namelist()
+        zfile.close()
+        files1.sort()
+        files2.sort()
+        for i in range(len(files1)):
+            self.assertEquals(files1[i],files2[i])
+        os.unlink(export_zip)
+
+    def test_export_from_files_to_zipstorage_add(self):
+        test_project_dir = os.path.join(temp_dir, "test_project_1")
+        unzip_file.unzip_file(test_cpf, test_project_dir, delete_if_exists=True)
+        
+        export_zip = os.path.join(temp_dir, "configexport2.zip")
+        
+        fs = FileStorage(test_project_dir)
+        p  = api.Project(fs)
+        exportconf = p.get_configuration('root4.confml')
+        compareconf = p.get_configuration('root5.confml')
+        zs = ZipStorage(export_zip,"w")
+        zp  = api.Project(zs)
+        conf_files = compareconf.list_resources()
+        files1 = ['.metadata']
+        files1.extend(conf_files)
+        p.export_configuration(exportconf,zs)
+        zp.close()        
+        self.assertTrue(os.path.exists(export_zip))
+        
+        #Re-opening in append mode for adding new layers.
+        zs = ZipStorage(export_zip,"a")
+        zp  = api.Project(zs)
+        conf = p.get_configuration('Layer5/root.confml')
+        p.export_configuration(conf,zs)
+        zp.save()
+        zp.close() 
+        
+        zfile = zipfile.ZipFile(export_zip,"r")
+        files2 = zfile.namelist()
+        #Root file renaming.
+        files2[files2.index('root4.confml')] = 'root5.confml'
+        zfile.close()
+        files1.sort()
+        files2.sort()
+        
+        for i in range(len(files1)):
+            self.assertEquals(files1[i],files2[i])
+        os.unlink(export_zip)
+
+
+    def test_export_from_zip_to_zipstorage_add(self):
+        export_zip = os.path.join(temp_dir, "configexport2.zip")        
+        zs_source = ZipStorage(test_cpf,'r')
+        p  = api.Project(zs_source)
+        exportconf = p.get_configuration('root4.confml')
+        compareconf = p.get_configuration('root5.confml')        
+        
+        zs_target = ZipStorage(export_zip,"w")
+        zp  = api.Project(zs_target)
+        conf_files = compareconf.list_resources()
+        files1 = ['.metadata']
+        files1.extend(conf_files)
+        p.export_configuration(exportconf,zs_target)
+        zp.close()
+        self.assertTrue(os.path.exists(export_zip))
+        
+        #Re-opening in append mode for adding new layers.
+        zs_target = ZipStorage(export_zip,"a")
+        zp  = api.Project(zs_target)
+        conf = p.get_configuration('Layer5/root.confml')
+        p.export_configuration(conf,zs_target)
+        zp.save()
+        zp.close() 
+        
+        zfile = zipfile.ZipFile(export_zip,"r")
+        files2 = zfile.namelist()
+        #Root file renaming.
+        files2[files2.index('root4.confml')] = 'root5.confml'
+        zfile.close()
+        files1.sort()
+        files2.sort()
+        
+        for i in range(len(files1)):
+            self.assertEquals(files1[i],files2[i])
+        os.unlink(export_zip)
+
+
+    def test_export_from_zipstorage(self):
+        output_dir = os.path.join(temp_dir, "export_from_zipstorage")
+        self.remove_if_exists(output_dir)
+        
+        zs = ZipStorage(test_cpf,"r")
+        p  = api.Project(zs)
+        fs = FileStorage(output_dir,"w")
+        r  = api.Project(fs)
+        conf = p.get_configuration('root5.confml')
+        conf_files = conf.list_resources()
+        conf_files.append('.metadata')
+        p.export_configuration(conf,fs)
+        p.close()
+        r.close()
+        self.assertTrue(os.path.exists(output_dir))
+
+    # Temporarly hacked to pass, because feature is not supported  
+#    def test_export_to_zipstorage_multiple_configurations(self):
+#        try:
+#            fs = FileStorage(datafolder)
+#            p  = api.Project(fs)
+#            zs = ZipStorage(tempzip,"w")
+#            zp  = api.Project(zs)
+#            conf = p.get_configuration('morestuff.confml')
+#            conf_files = conf.list_resources()
+#            p.export_configuration(conf,zs)
+#            conf = p.get_configuration('prodX.confml')
+#            conf_files2 = conf.list_resources()
+#            conf_files.extend(conf_files2)
+#            conf_files = utils.distinct_array(conf_files) 
+#            p.export_configuration(conf,zs)
+#            zp.close()
+#            self.assertTrue(os.path.exists(tempzip))
+#            zfile = zipfile.ZipFile(tempzip,"r")
+#            files = zfile.namelist()
+#            files.remove('.metadata')
+#            self.assertEquals(sorted(conf_files),sorted(files))
+#        except exceptions.NotSupportedException:
+#            pass
+
+    def test_export_to_filestorage_multiple_configurations(self):
+        fs = FileStorage(datafolder)
+        p  = api.Project(fs)
+        fs2 = FileStorage("temp/exported","w")
+        p2  = api.Project(fs2)
+        conf = p.get_configuration('morestuff.confml')
+        conf_files = conf.list_resources()
+        p.export_configuration(conf,fs2)
+        conf = p.get_configuration('prodX.confml')
+        conf_files.extend(conf.list_resources())
+        
+        p.export_configuration(conf,fs2)
+        p2.close()
+        self.assertTrue(os.path.exists("temp/exported"))
+        
+        files = fs2.list_resources("/",True)
+        conf_files = utils.distinct_array(conf_files)
+        files.sort()
+        conf_files.append('.metadata')
+        conf_files.sort()
+        self.assertEquals(conf_files,files)
+        shutil.rmtree("temp")
+
+        
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/unittest_configuration_project_import.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,147 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF configuration
+"""
+import unittest
+import string
+import sys,os,shutil
+import difflib, zipfile
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+            
+import __init__
+from testautomation import unzip_file
+
+from cone.public import exceptions, utils, api
+from cone.storage.filestorage import FileStorage
+from cone.storage.zipstorage import ZipStorage
+
+ROOT_PATH  = os.path.dirname(os.path.abspath(__file__))
+temp_dir   = os.path.join(ROOT_PATH, "temp/import")
+test_cpf   = os.path.join(ROOT_PATH,"testdata/test_project.cpf")
+datafolder = os.path.join(ROOT_PATH,"../../storage/tests/data")
+
+
+class TestConeProjectImport(unittest.TestCase):    
+    def setUp(self):
+        if not os.path.exists(temp_dir):
+            os.makedirs(temp_dir)
+            
+    def test_import_to_zipstorage(self):
+        test_project_dir = os.path.join(temp_dir, "test_project_1")
+        unzip_file.unzip_file(test_cpf, test_project_dir, delete_if_exists=True)
+        
+        imported_zip = os.path.join(temp_dir, "imported1.zip")
+        
+        fs = FileStorage(test_project_dir)
+        p  = api.Project(fs)
+        zs = ZipStorage(imported_zip,"w")
+        zp  = api.Project(zs)
+        conf = p.get_configuration('root5.confml')
+        conf_files = conf.list_resources()
+        conf_files.append('.metadata')
+        zp.import_configuration(conf)
+        zp.close()
+        p.close()
+        self.assertTrue(os.path.exists(imported_zip))
+        zfile = zipfile.ZipFile(imported_zip,"r")
+        files = zfile.namelist()
+        conf_files.sort()
+        files.sort()
+        self.assertEquals(conf_files,files)
+        zfile.close()
+        os.unlink(imported_zip)
+
+    def test_import_to_zipstorage_multiple_configurations(self):
+        imported_zip = os.path.join(temp_dir, "imported2.zip")
+        fs = FileStorage(datafolder)
+        p  = api.Project(fs)
+        zs = ZipStorage(imported_zip,"w")
+        zp  = api.Project(zs)
+        conf = p.get_configuration('morestuff.confml')
+        conf_files = conf.list_resources()
+        zp.import_configuration(conf)
+        conf = p.get_configuration('prodX.confml')
+        conf_files.extend(conf.list_resources())
+        zp.import_configuration(conf)
+        zp.close()
+        p.close()
+        self.assertTrue(os.path.exists(imported_zip))
+        zfile = zipfile.ZipFile(imported_zip,"r")
+        files = zfile.namelist()
+        files.remove('.metadata')
+        conf_files = utils.distinct_array(conf_files)
+        conf_files.sort()
+        files.sort()
+        for i in range(len(conf_files)):
+            self.assertEquals(conf_files[i], files[i])        
+        zfile.close()
+        os.unlink(imported_zip)
+
+    def test_import_to_filestorage_multiple_configurations(self):        
+        fs = FileStorage(datafolder)
+        p  = api.Project(fs)
+        fs2 = FileStorage("temp/imported","w")
+        p2  = api.Project(fs2)
+        conf = p.get_configuration('morestuff.confml')
+        conf_files = conf.list_resources()
+        p2.import_configuration(conf)
+        conf = p.get_configuration('prodX.confml')
+        conf_files.extend(conf.list_resources())
+        
+        p2.import_configuration(conf)
+        p2.close()
+        self.assertTrue(os.path.exists("temp/imported"))
+        files = fs2.list_resources("/",True)
+        
+        conf_files = utils.distinct_array(conf_files)
+        conf_files.append('.metadata')
+        files.sort()
+        conf_files.sort()
+        self.assertEquals(conf_files,files)
+        shutil.rmtree("temp")
+
+    def test_import_from_zipstorage_to_filestorage(self):
+        imported_folder = os.path.join(temp_dir, 'imported1_folder')
+        p  = api.Project(api.Storage.open(test_cpf))
+        rp  = api.Project(api.Storage.open(imported_folder,"w"))
+        conf = p.get_configuration(p.get_storage().get_active_configuration())
+        conf_files = conf.list_resources()
+        conf_files.append('.metadata')
+        rp.import_configuration(conf)
+        rp.close()
+        p.close()
+        self.assertTrue(os.path.exists(imported_folder))
+        store = api.Storage.open(imported_folder)
+        files = store.list_resources('',True)
+        conf_files.sort()
+        files.sort()
+        self.assertEquals(conf_files,files)
+        shutil.rmtree(imported_folder)
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/unittest_configuration_project_on_filestorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,284 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF configuration
+"""
+import unittest
+import string
+import sys,os
+import shutil
+import __init__
+from testautomation.base_testcase import BaseTestCase
+
+from cone.public import exceptions, api
+from cone.confml.model import ConfmlMeta, ConfmlDescription
+from cone.storage.filestorage import FileStorage
+from cone.confml import model
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+temp_dir  = os.path.join(ROOT_PATH, "temp/project_on_filestorage")
+datafolder= os.path.join(ROOT_PATH,"../../storage/tests/data")
+
+class TestConeProjectOpen(unittest.TestCase):    
+    def setUp(self):
+        pass
+    
+    def test_open_storage(self):
+        p = api.Storage.open(datafolder)
+        self.assertTrue(p)
+        
+    def test_open_project_of_non_storage(self):
+        fs = "foobar_dummy"
+        try:
+            p = api.Storage.open(fs)
+            self.fail("Opening on top of non storage succeeds!!")
+        except exceptions.StorageException:
+            self.assertTrue(True)
+        
+
+class TestConeProjectMethodsRead(unittest.TestCase):    
+    def setUp(self):
+        self.project = api.Project(api.Storage.open(datafolder))
+
+    def test_list_configurations(self):
+        confs =  self.project.list_configurations()
+        self.assertTrue(confs)
+        self.assertEquals(confs[0],"morestuff.confml")
+
+    def test_get_configuration(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        self.assertTrue(conf)
+        self.assertTrue(isinstance(conf,api.ConfigurationProxy))
+
+    def test_get_configuration_non_existing(self):
+        try:
+            conf =  self.project.get_configuration("foo.confml")
+            self.fail("Opening non existing configuration succeeds!")
+        except exceptions.NotFound,e:
+            self.assertTrue(True)
+
+    def test_get_configuration_and_list_layers(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        layers = conf.list_configurations()
+        self.assertTrue(layers)
+        self.assertEquals(layers[0],'platform/s60/root.confml')
+        self.assertEquals(layers[1],'familyX/root.confml')
+
+    def test_get_is_configuration(self):
+        self.assertTrue(self.project.is_configuration("morestuff.confml"))
+        # TODO: this is not working at the moment due to performance problem in
+        # Project.list_all_configurations()
+        #self.assertTrue(self.project.is_configuration("platform/s60/root.confml"))
+        #self.assertFalse(self.project.is_configuration("platform/foo/root.confml"))
+
+    def test_get_configuration_and_get_layer(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60layer = conf.get_configuration('platform/s60/root.confml')
+        self.assertTrue(s60layer)
+        self.assertTrue(isinstance(s60layer.get_layer(),api.Layer))
+    
+    def test_get_configuration_and_get_layer_path(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60layer = conf.get_configuration('platform/s60/root.confml')
+        self.assertEquals(s60layer.get_path(),'platform/s60/root.confml')
+    
+    def test_get_configuration_and_get_layer_and_get_layer_resources(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60layer = conf.get_configuration('platform/s60/root.confml')
+        files = s60layer.list_resources()
+        self.assertEquals(files[0],'platform/s60/root.confml')
+    
+    def test_get_configuration_and_get_layer_and_get_a_layer_resource(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60layer = conf.get_configuration('platform/s60/root.confml')
+        res = s60layer.get_resource('root.confml')
+        self.assertTrue(res)
+    
+    def test_get_configuration_and_list_all_configuration_resources(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        resources = conf.list_resources()
+        self.assertEquals(resources[0],'morestuff.confml')
+
+    def test_get_configuration_and_get_first_layer_by_index(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60config = conf.get_configuration_by_index(0)
+        self.assertEquals(s60config.get_path(),'platform/s60/root.confml')
+
+    def test_get_configuration_and_get_last_layer_by_index(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        config = conf.get_configuration_by_index(-1)
+        self.assertEquals(config.get_path(),'familyX/prodX/root.confml')
+    
+    def test_get_all_resources(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        resources = conf.get_all_resources()
+        self.assertEquals(resources[0].get_path(),'morestuff.confml')
+        self.assertEquals(resources[1].get_path(),'platform/s60/root.confml')
+
+    def test_list_confmls(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        confmls = conf.list_resources()
+        self.assertEquals(confmls[0],'morestuff.confml')
+        self.assertEquals(confmls[1],'platform/s60/root.confml')
+    
+    def test_list_implmls(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        implmls = conf.get_configuration('platform/s60/root.confml').get_layer().list_implml()
+        self.assertEquals(implmls[0],'implml/accessoryserver_1020505A.crml')
+
+#    def test_list_content(self):
+#        conf =  self.project.get_configuration("morestuff.confml")
+#        contents = conf.list_content()
+#        self.assertEquals(contents[0],'platform/s60/content/.svn/all-wcprops')
+            
+    def test_layered_content(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        contents = conf.layered_content()
+        self.assertEquals(contents.get_value('test/s60.txt'),'platform/s60/content/test/s60.txt')
+        self.assertEquals(contents.get_value('test/override.txt'),'familyX/content/test/override.txt')
+        self.assertEquals(contents.get_value('test/shout.txt'),'familyX/content/test/shout.txt')
+
+    def test_layer_name(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        s60layer = conf.get_configuration('platform/s60/root.confml')
+        self.assertEquals(s60layer.get_ref(),'platform__s60__root_confml')
+
+
+    def test_layered_content_with_one_layer(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        contents = conf.layered_content([-2])
+        self.assertEquals(contents.get_value('test/override.txt'),'familyX/content/test/override.txt')
+        self.assertEquals(contents.get_value('test/shout.txt'),'familyX/content/test/shout.txt')
+        try:
+            contents.get_value('test/s60.txt')
+            self.fail("Fetching content from s60 layer succeeds!")
+        except KeyError:
+            pass
+
+    def test_layered_content_with_two_layers(self):
+        conf =  self.project.get_configuration("morestuff.confml")
+        contents = conf.layered_content([-2,-1])
+        self.assertEquals(contents.get_value('test/override.txt'),'familyX/content/test/override.txt')
+        self.assertEquals(contents.get_value('test/shout.txt'),'familyX/content/test/shout.txt')
+        self.assertEquals(contents.get_value('prodX/jee/ProdX_specific.txt'),'familyX/prodX/content/prodX/jee/ProdX_specific.txt')
+        try:
+            contents.get_value('test/s60.txt')
+            self.fail("Fetching content from s60 layer succeeds!")
+        except KeyError:
+            pass
+
+
+
+        
+class TestConeProjectMethodsWrite(BaseTestCase):    
+    def setUp(self):
+        if not os.path.exists(temp_dir):
+            os.makedirs(temp_dir)
+        
+        if not os.path.exists('newtempproject'):
+            os.mkdir('newtempproject')
+        fs = api.Storage.open("newtempproject","a")
+        self.project = api.Project(fs)
+
+    def tearDown(self):
+        self.project.close()
+        shutil.rmtree('newtempproject')
+        pass
+
+    def test_create_configuration(self):
+        conf = self.project.create_configuration("dummy.confml")
+        self.assertTrue(conf)
+        self.assertEquals(conf.get_ref(),'dummy_confml')
+        self.assertTrue(isinstance(conf,api.Configuration))
+        conf.close()
+        
+    def test_create_close_open_configuration(self):
+        tempdir_orig = os.path.normpath(os.path.join(temp_dir, "temp1_orig"))
+        tempdir_copy = os.path.normpath(os.path.join(temp_dir, "temp1_copy"))
+        self.remove_if_exists([tempdir_orig, tempdir_copy])
+        
+        project = api.Project(api.Storage.open(tempdir_orig,"w"))
+        conf = project.create_configuration("dummy2.confml")
+        conf.set_name("dummy")
+        prop1 = model.ConfmlMetaProperty('owner', 'some guy')
+        prop2 = model.ConfmlMetaProperty('purpose', 'for testing')
+        conf.meta = model.ConfmlMeta([prop1, prop2])
+        conf.desc = "Testing to see a configuration created"
+        conf.create_configuration("test/path/to/somewhere/r.confml")
+        conf.create_configuration("test/path/to/elsewhere/r.confml")
+        conf.save()
+        project.save()
+        project.close()
+        
+        # Make a copy of the created directory
+        shutil.copytree(tempdir_orig, tempdir_copy)
+        # If everything has been closed properly, the original directory
+        # should now be removable
+        shutil.rmtree(tempdir_orig)
+        
+        project2 = api.Project(api.Storage.open(tempdir_copy))
+        conf2 = project2.get_configuration("dummy2.confml")
+        
+        self.assertEquals(conf.get_name(),conf2.get_name())
+        self.assertEquals(conf2.get_name(),'dummy')
+        self.assertEquals(conf2.meta[0].tag ,'owner')
+        self.assertEquals(conf2.meta[0].value ,'some guy')
+        self.assertEquals(conf.desc,conf2.desc)
+        self.assertEquals(conf.list_configurations(),conf2.list_configurations())
+        project2.close()
+    
+    def test_remove_configuration_non_existing(self):
+        try:
+            self.project.remove_configuration("dummystring.txt")
+            self.fail("Removing non existing configuration succeds!")
+        except exceptions.NotFound,e:
+            self.assertTrue(True)
+            
+    def test_create_remove_configuration(self):
+        conf = self.project.create_configuration("remove.confml")
+        conf.save()
+        conf.close()
+        
+        self.project.remove_configuration("remove.confml")
+        try:
+            conf =  self.project.get_configuration("remove.confml")
+            self.fail("Opening of removed configuration succeeds!")
+        except exceptions.NotFound,e:
+            self.assertTrue(True)
+
+    def test_create_configuration_in_sub_configuration(self):
+        fs = api.Storage.open("newproject","w")
+        project = api.Project(fs)
+        conf = project.create_configuration("croot.confml")
+        subconf = conf.create_configuration("test/root.confml")
+        subconf.create_configuration('confml/data.confml')
+        conf.save()
+        self.assertTrue(project.get_storage().is_resource('test/confml/data.confml'))
+        conf = project.get_configuration("croot.confml")
+        subconf = conf.create_configuration("test2\\root.confml")
+        subconf.create_configuration('confml/data.confml')
+        subconf.close()
+        conf.save()
+        self.assertTrue(project.get_storage().is_resource('test2/confml/data.confml'))
+        project.close()
+        shutil.rmtree("newproject")
+
+    
+    
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/core/tests/unittest_configuration_project_on_zipstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,182 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF configuration
+"""
+import unittest
+import string
+import sys,os, shutil
+import __init__
+
+from cone.public import exceptions, api
+from cone.core import *
+from testautomation.base_testcase import BaseTestCase
+from cone.confml import model
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+temp_dir  = os.path.join(ROOT_PATH, "temp/project_on_zipstorage")
+datazip   = os.path.join(ROOT_PATH,"testdata/test_project.cpf")
+
+class TestConeProjectOpenZip(unittest.TestCase):    
+    def test_open_project(self):        
+        fs = api.Storage.open(datazip,"r")
+        p = api.Project(fs)
+        self.assertTrue(p)
+        
+    def test_open_project_of_non_storage(self):
+        fs = ""
+        try:
+            p = api.Project(fs)
+            self.fail("Opening on top of non storage succeeds!!")
+        except exceptions.StorageException:
+            self.assertTrue(True)
+      
+
+class TestConeProjectMethodsReadZip(unittest.TestCase):
+    def setUp(self):
+        fs = api.Storage.open(datazip,"r")
+        self.project = api.Project(fs)
+        
+    def test_list_configurations(self):
+        confs =  self.project.list_configurations()
+        self.assertEquals(
+            sorted(confs),
+            ["root1.confml",
+             "root2.confml",
+             "root3.confml",
+             "root4.confml",
+             "root5.confml"])
+        
+    def test_get_configuration(self):
+        conf =  self.project.get_configuration("/root5.confml")
+        self.assertTrue(conf)
+        self.assertTrue(isinstance(conf,api.ConfigurationProxy))
+            
+    def test_get_configuration_non_existing(self):
+        try:
+            conf =  self.project.get_configuration("foo")
+            self.fail("Opening non existing configuration succeeds!")
+        except exceptions.NotFound,e:
+            self.assertTrue(True)
+
+    def test_get_configuration_and_list_layers(self):
+        conf =  self.project.get_configuration("root5.confml")
+        layers = conf.list_configurations()    
+        self.assertEquals(
+            layers,
+            ['Layer1/root.confml',
+             'Layer2/root.confml',
+             'Layer3/root.confml',
+             'Layer4/root.confml',
+             'Layer5/root.confml'])
+
+    def test_get_configuration_and_get_layer(self):
+        conf =  self.project.get_configuration("root5.confml")
+        layer1 = conf.get_configuration('Layer1/root.confml')
+        self.assertTrue(layer1)
+        self.assertTrue(isinstance(layer1,api.ConfigurationProxy))
+
+    def test_get_configuration_and_get_layer_path(self):
+        conf =  self.project.get_configuration("root5.confml")
+        layer1 = conf.get_configuration('Layer1/root.confml')
+        self.assertEquals(layer1.get_path(),'Layer1/root.confml')
+    
+    def test_get_configuration_and_get_layer_and_get_layer_resources(self):
+        conf =  self.project.get_configuration("root5.confml")
+        layer1 = conf.get_configuration('Layer1/root.confml')
+        files = layer1.list_resources()
+        self.assertTrue('Layer1/root.confml' in files)
+        self.assertTrue('Layer1/confml/feature1.confml' in files)
+        self.assertTrue('Layer1/implml/feature1_12341001.crml' in files)
+        self.assertTrue('Layer1/content/default_file.txt' in files)
+
+    def test_get_configuration_and_get_layer_and_get_a_layer_resource(self):
+        conf =  self.project.get_configuration("root5.confml")
+        layer1 = conf.get_configuration('Layer1/root.confml')
+        res = layer1.get_resource('implml/feature1_12341001.crml')
+        self.assertTrue(res)
+
+    def test_get_configuration_and_list_all_configuration_resources(self):
+        conf =  self.project.get_configuration("root5.confml")
+        resources = conf.list_resources()
+        self.assertTrue('root5.confml' in resources)
+        self.assertTrue('Layer1/root.confml' in resources)
+        self.assertTrue('Layer2/root.confml' in resources)
+        self.assertTrue('Layer3/root.confml' in resources)
+        self.assertTrue('Layer4/root.confml' in resources)
+        self.assertTrue('Layer5/root.confml' in resources)
+        self.assertTrue('Layer1/confml/feature1.confml' in resources)
+        self.assertTrue('Layer1/implml/feature1_12341001.crml' in resources)
+        self.assertTrue('Layer1/content/default_file.txt' in resources)
+        self.assertTrue('Layer2/content/layer2_file.txt' in resources)
+
+class TestConeProjectMethodsWriteZip(BaseTestCase):
+    def setUp(self):
+        if not os.path.exists(temp_dir):
+            os.makedirs(temp_dir)
+            
+    def test_create_configuration(self):
+        tempzip = os.path.normpath(os.path.join(temp_dir, "temp1.zip"))
+        self.remove_if_exists(tempzip)
+        
+        prj = None
+        conf = None
+        try:
+            prj = api.Project(api.Storage.open(tempzip,"w"))
+            conf = prj.create_configuration("dummy.confml")
+            conf.set_name("dummy")
+            self.assertTrue(conf)
+            self.assertEquals(conf.get_name(),'dummy')
+            self.assertTrue(isinstance(conf,api.Configuration))
+        finally:
+            if conf != None: conf.close()
+            if prj != None:  prj.close()
+
+    def test_create_close_open_configuration(self):
+        tempzip_orig = os.path.normpath(os.path.join(temp_dir, "temp2_orig.zip"))
+        tempzip_copy = os.path.normpath(os.path.join(temp_dir, "temp2_copy.zip"))
+        self.remove_if_exists([tempzip_orig, tempzip_copy])
+        
+        prj = api.Project(api.Storage.open(tempzip_orig,"w"))
+        conf = prj.create_configuration("dummy2.confml")
+        conf.set_name("dummy")
+        prop1 = model.ConfmlMetaProperty('owner', 'teemu rytkonen', 'http://www.s60.com/xml/confml/2')
+        prop2 = model.ConfmlMetaProperty('purpose', 'for testing', 'http://www.s60.com/xml/confml/2')
+        conf.meta = model.ConfmlMeta([prop1, prop2])        
+        conf.desc = "Testing to see a configuration created"
+        conf.create_configuration("test/path/to/somewhere/r.confml")
+        conf.create_configuration("test/path/to/elsewhere/r.confml")
+        conf.save()
+        prj.save()
+        prj.close()
+        
+        # Make a copy of the created zip file
+        shutil.copy2(tempzip_orig, tempzip_copy)
+        # If everything has been closed properly, the original zip file
+        # should now be removable
+        os.remove(tempzip_orig)
+        
+        # Read back data from the copy
+        prj = api.Project(api.Storage.open(tempzip_copy,"r"))
+        conf2 = prj.get_configuration("dummy2.confml")        
+        self.assertEquals(conf.get_name(),conf2.get_name())
+        self.assertEquals(conf.meta,conf2.meta)
+        self.assertEquals(conf.desc,conf2.desc)
+        self.assertEquals(conf.list_configurations(),conf2.list_configurations())
+    
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/nose_unittests.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+[nosetests]
+verbosity=3
+include=unittest
+with-xunit=1
+xunit-file=cone-unittests.xml
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+__all__ = ["api","plugin","exceptions","container","utils","persistence", "settings", "rules"]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/_etree_wrapper.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,245 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# 
+
+from xml.parsers import expat
+
+# Import ElementTree (should always be available)
+try:
+    from elementtree import ElementTree
+except ImportError:
+    from xml.etree import ElementTree
+
+import exceptions
+
+
+class ElementTreeBackendWrapperBase(object):
+    def get_module(self):
+        raise NotImplementedError()
+    
+    def get_lineno(self, element):
+        raise NotImplementedError()
+
+class ElementTreeBackendWrapper(ElementTreeBackendWrapperBase):
+    
+    class CustomTreeBuilder(ElementTree.TreeBuilder):
+        """
+        Custom TreeBuilder for ElementTree that records line numbers
+        of the elements.
+        """
+        def start(self, tag, attrs):
+            elem = ElementTree.TreeBuilder.start(self, tag, attrs)
+            lineno = self._xmltreebuilder._parser.CurrentLineNumber
+            #print "Tag: %s, line: %r" % (tag, lineno)
+            elem.sourceline = lineno
+            return elem
+    
+    def get_module(self):
+        return ElementTree
+    
+    def fromstring(self, text):
+        try:
+            treebuilder = self.CustomTreeBuilder()
+            parser = ElementTree.XMLTreeBuilder(target=treebuilder)
+            treebuilder._xmltreebuilder = parser
+            parser.feed(text)
+            return parser.close()
+        except expat.ExpatError, e:
+            raise exceptions.XmlParseError(
+                "XML parse error on line %d: %s" % (e.lineno, e),
+                e.lineno, str(e))
+    
+    def tostring(self, etree, encoding=None):
+        return ElementTree.tostring(etree, encoding)
+    
+    def get_lineno(self, element):
+        return element.sourceline
+
+
+class CElementTreeBackendWrapper(ElementTreeBackendWrapperBase):
+    def __init__(self):
+        try:
+            from cElementTree import cElementTree
+        except ImportError:
+            from xml.etree import cElementTree
+        
+        self.cElementTree = cElementTree
+    
+    def get_module(self):
+        return self.cElementTree
+    
+    def fromstring(self, text):
+        try:
+            return self.cElementTree.fromstring(text)
+        except SyntaxError, e:
+            # cElementTree raises a SyntaxError, but does not set
+            # its lineno attribute, so look for the line number
+            # in the exception text
+            import re
+            match = re.search(r'line (\d+)\, column \d+$', str(e))
+            if match:   lineno = int(match.group(1))
+            else:       lineno = None
+            
+            raise exceptions.XmlParseError(
+                "XML parse error on line %s: %s" % (lineno, e),
+                lineno, str(e))
+    
+    def tostring(self, etree, encoding=None):
+        return self.cElementTree.tostring(etree, encoding)
+    
+    def get_lineno(self, element):
+        # cElementTree does not support line numbers
+        return None
+
+
+class LxmlBackendWrapper(ElementTreeBackendWrapperBase):
+    
+    def __init__(self):
+        import lxml.etree
+        self.lxml = lxml
+    
+    def get_module(self):
+        return self.lxml.etree
+    
+    def fromstring(self, text):
+        try:
+            elem = self.lxml.etree.fromstring(text)
+            
+            # lxml parses also comments, but ConE does not expect those,
+            # so remove them to prevent any errors on that account
+            def remove_comments(elem):
+                # Find the comments under this element
+                comments = []
+                for x in elem:
+                    if isinstance(x, self.lxml.etree._Comment):
+                        comments.append(x)
+                
+                # Remove them
+                for c in comments:
+                    elem.remove(c)
+                
+                # Recurse to sub-elements
+                for subelem in elem:
+                    remove_comments(subelem)
+            
+            remove_comments(elem)
+            
+            return elem
+        except self.lxml.etree.XMLSyntaxError, e:
+            raise exceptions.XmlParseError(
+                "XML parse error on line %d: %s" % (e.position[0], e),
+                e.position[0], str(e))
+    
+    def tostring(self, etree, encoding=None):
+        return self.lxml.etree.tostring(etree, encoding=encoding)
+    
+    def get_lineno(self, element):
+        return element.sourceline
+
+# ============================================================================
+#
+# ============================================================================
+
+class ElementTreeWrapper(object):
+    """
+    ElementTree wrapper class for providing a unified interface to different
+    ElementTree implementations.
+    
+    Currently supported are the pure Python ElementTree implementation,
+    cElementTree and lxml.etree
+    """
+    BACKEND_ELEMENT_TREE     = 'ElementTree'
+    BACKEND_C_ELEMENT_TREE   = 'cElementTree'
+    BACKEND_LXML             = 'lxml'
+    
+    # Import order for the default back-end. The list is traversed
+    # top-down and the first back-end whose importing is successful is
+    # used as the default back-end
+    DEFAULT_BACKEND_IMPORT_ORDER = [BACKEND_C_ELEMENT_TREE,
+                                    BACKEND_ELEMENT_TREE]
+    
+    _backend_mapping = {BACKEND_ELEMENT_TREE:     ElementTreeBackendWrapper,
+                        BACKEND_C_ELEMENT_TREE:   CElementTreeBackendWrapper,
+                        BACKEND_LXML:             LxmlBackendWrapper}
+    
+    _backend_id = None
+    _backend_wrapper = None
+
+    def get_backend_id(self):
+        """
+        Return the ID of the currently used ElementTree back-end.
+        """
+        # Make sure that the default back-end is set, so _backend_id
+        # will not be None
+        self._get_backend()
+        assert self._backend_id is not None
+        return self._backend_id
+    
+    def set_backend_id(self, backend_id):
+        """
+        Set the used ElementTree back-end by back-end ID.
+        """
+        if backend_id not in self._backend_mapping:
+            raise ValueError("Invalid ElementTree back-end ID: %r" % backend_id)
+        
+        if backend_id == self._backend_id:
+            return
+        
+        backend_wrapper_class = self._backend_mapping[backend_id]
+        self._backend_wrapper = backend_wrapper_class()
+        self._backend_id = backend_id
+    
+    def _get_backend(self):
+        """
+        Return the currently set ElementTree back-end wrapper object.
+        """
+        if self._backend_wrapper is None:
+            # Back-end not set, so set the default back-end.
+            # The default is the C version of ElementTree, but if that
+            # is not available, the pure Python version is used
+            for backend_id in self.DEFAULT_BACKEND_IMPORT_ORDER:
+                try:
+                    self.set_backend_id(backend_id)
+                except ImportError:
+                    pass
+            
+            if self._backend_wrapper is None:
+                raise RuntimeError("Failed to set any ElementTree backend! Tried these: %r" % self.DEFAULT_BACKEND_IMPORT_ORDER)
+        
+        return self._backend_wrapper
+    
+    def get_lineno(self, element):
+        """
+        Return the source line number of the given XML element.
+        
+        Note that for the cElementTree parser this will always return
+        None, since that parser does not support line numbers.
+        """
+        return self._get_backend().get_lineno(element)
+    
+    def __getattribute__(self, attrname):
+        try:
+            # Try to get the attribute from this object (the top-level wrapper)
+            return object.__getattribute__(self, attrname)
+        except AttributeError:
+            # If not overridden here, try to get it from the back-end wrapper
+            backend = self._get_backend()
+            try:
+                return getattr(backend, attrname)
+            except AttributeError:
+                # Last resort: try to get it from the module
+                # the back-end wrapper wraps
+                backend_module = backend.get_module()
+                return getattr(backend_module, attrname)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/_plugin_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,568 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import copy
+import logging
+import plugin, exceptions, api, utils
+import cone.confml.model
+
+log = logging.getLogger('cone')
+
+# The XML namespace for common ImplML definitions
+COMMON_IMPLML_NAMESPACE = "http://www.symbianfoundation.org/xml/implml/1"
+
+# Name of the marker variable used to mark a feature as a temporary
+# feature
+TEMP_FEATURE_MARKER_VARNAME = '__plugin_temp_feature_marker'
+
+class TempVariableDefinition(object):
+    """
+    Class representing a temporary variable definition in an implementation file.
+    """
+    
+    def __init__(self, ref, type, value):
+        self.ref = ref
+        self.type = type
+        self.value = value
+    
+    def create_feature(self, config):
+        """
+        Add a feature based on this temp feature definition to the given configuration.
+        """
+        if '.' in self.ref:
+            pos = self.ref.rfind('.')
+            ref = self.ref[pos + 1:]
+            namespace = self.ref[:pos]
+        else:
+            ref = self.ref
+            namespace = ''
+        
+        mapping = {'string' : cone.confml.model.ConfmlStringSetting,
+                   'int'    : cone.confml.model.ConfmlIntSetting,
+                   'real'   : cone.confml.model.ConfmlRealSetting,
+                   'boolean': cone.confml.model.ConfmlBooleanSetting}
+        feature = mapping[self.type](ref)
+        setattr(feature, TEMP_FEATURE_MARKER_VARNAME, True)
+        config.add_feature(feature, namespace)
+        
+        value = utils.expand_refs_by_default_view(self.value, config.get_default_view())
+        config.add_data(api.Data(fqr=self.ref, value=value))
+    
+    def __eq__(self, other):
+        if type(self) is type(other):
+            for varname in ('ref', 'type', 'value'):
+                if getattr(self, varname) != getattr(other, varname):
+                    return False
+            return True
+        else:
+            return False
+        
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __repr__(self):
+        return "TempFeatureDefinition(ref=%r, type=%r, value=%r)" % (self.ref, self.type, self.value)
+
+class TempVariableSequenceDefinition(object):
+    """
+    Class representing a temporary variable sequence definition in an implementation file.
+    """
+    
+    def __init__(self, ref, sub_items):
+        self.ref = ref
+        self.sub_items = sub_items
+    
+    def create_feature(self, config):
+        if '.' in self.ref:
+            pos = self.ref.rfind('.')
+            ref = self.ref[pos + 1:]
+            namespace = self.ref[:pos]
+        else:
+            ref = self.ref
+            namespace = ''
+        
+        # Creature the sequence feature
+        seq_fea = api.FeatureSequence(ref)
+        setattr(seq_fea, TEMP_FEATURE_MARKER_VARNAME, True)
+        config.add_feature(seq_fea, namespace)
+        
+        # Create the sub-features
+        mapping = {'string' : cone.confml.model.ConfmlStringSetting,
+                   'int'    : cone.confml.model.ConfmlIntSetting,
+                   'real'   : cone.confml.model.ConfmlRealSetting,
+                   'boolean': cone.confml.model.ConfmlBooleanSetting}
+        sub_features = []
+        for sub_item in self.sub_items:
+            sub_feature = mapping[sub_item[1]](sub_item[0])
+            seq_fea.add_feature(sub_feature)
+    
+    def __eq__(self, other):
+        if type(self) is type(other):
+            return self.ref == other.ref and self.sub_items == other.sub_items
+        else:
+            return False
+        
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __repr__(self):
+        return "TempSeqFeatureDefinition(ref=%r, sub_items=%r)" % (self.ref, self.sub_items)
+
+class SettingRefsOverride(object):
+    """
+    Class representing a setting reference override for an implementation.
+    """
+    def __init__(self, refs=None):
+        """
+        @param refs: The reference overrides, can be a list of references or None.
+        """
+        self.refs = refs
+    
+    def get_refs(self):
+        return self.refs
+
+    def __eq__(self, other):
+        if type(self) is type(other):
+            return self.refs == other.refs
+        else:
+            return False
+        
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __repr__(self):
+        return "SettingRefsOverride(refs=%r)" % self.refs
+
+class CommonImplmlData(object):
+    """
+    Class representing the common ImplML namespace data read from
+    an XML element.
+    """
+    
+    def __init__(self):
+        self.phase = None
+        self.tags = None
+        self.tempvar_defs = []
+        self.setting_refs_override = None
+        self.output_root_dir = None
+        self.output_sub_dir = None
+    
+    def apply(self, impl):
+        """
+        Apply the data on the given implementation instance.
+        """
+        if self.phase:
+            impl.set_invocation_phase(self.phase)
+        if self.tags:
+            impl.set_tags(self.tags)
+        if self.setting_refs_override:
+            # Override the get_refs() method of the implementation
+            impl.get_refs = self.setting_refs_override.get_refs
+            # Override also the has_ref() method in case it is overridden
+            # in the implementation sub-class
+            impl.has_ref = lambda refs: plugin.ImplBase.has_ref(impl, refs)
+        if self.output_root_dir:
+            impl.set_output_root_override(self.output_root_dir)
+        if self.output_sub_dir:
+            impl.output_subdir = self.output_sub_dir
+    
+    def extend(self, other):
+        """
+        Extend this object with the contents of another CommonImplmlData object.
+        """
+        if other.phase:
+            self.phase = other.phase
+        if other.tags:
+            self.tags = other.tags
+        self.tempvar_defs.extend(other.tempvar_defs)
+        if other.setting_refs_override:
+            self.setting_refs_override = other.setting_refs_override
+        if other.output_root_dir:
+            self.output_root_dir = other.output_root_dir
+        if other.output_sub_dir:
+            self.output_sub_dir = other.output_sub_dir
+    
+    def copy(self):
+        result = CommonImplmlData()
+        result.phase = self.phase
+        if result.tags is not None:
+            result.tags = self.tags.copy()
+        result.tempvar_defs = list(self.tempvar_defs)
+        result.setting_refs_override = copy.deepcopy(self.setting_refs_override)
+        result.output_root_dir = self.output_root_dir
+        result.output_sub_dir = self.output_sub_dir
+        return result
+    
+    def __eq__(self, other):
+        if type(self) is type(other):
+            for varname in ('phase', 'tags', 'tempvar_defs', 'setting_refs_override', 'output_root_dir', 'output_sub_dir'):
+                if getattr(self, varname) != getattr(other, varname):
+                    return False
+            return True
+        else:
+            return False
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __repr__(self):
+        return "CommonImplmlData(phase=%r, tags=%r, tempvar_defs=%r, setting_refs_override=%r, output_root_dir=%r, output_sub_dir=%r)" \
+            % (self.phase,
+               self.tags,
+               self.tempvar_defs,
+               self.setting_refs_override,
+               self.output_root_dir,
+               self.output_sub_dir)
+
+class ImplReader(object):
+    """
+    Internal reader class for reading implementations from a file in a configuration.
+    """
+    
+    # The reader class list loaded using ImplFactory
+    __loaded_reader_classes = None
+    __reader_classes = None
+    __supported_file_extensions = None
+    __ignored_namespaces = None
+    
+    def __init__(self, resource_ref, configuration):
+        self.resource_ref = resource_ref
+        self.configuration = configuration
+    
+    @classmethod
+    def _load_data_from_plugins(cls):
+        """
+        Load all data needed for implementation parsing from the plug-ins.
+        
+        The actual loading is only done the first time this method is called.
+        """
+        # Load the data only if the reader class list has not been loaded
+        # yet or it has changed
+        loaded_reader_classes = plugin.ImplFactory.get_reader_classes()
+        if cls.__loaded_reader_classes is loaded_reader_classes:
+            return
+        
+        reader_classes = [plugin.ReaderBase]
+        reader_classes.extend(loaded_reader_classes)
+        
+        cls.__reader_classes = {}
+        cls.__ignored_namespaces = []
+        cls.__supported_file_extensions = []
+        
+        for rc in reader_classes:
+            # Reader class
+            ns = rc.NAMESPACE
+            if ns is not None:
+                if ns in cls.__reader_classes:
+                    raise RuntimeError("Multiple reader classes registered for ImplML namespace '%s': at least %s and %s"\
+                                       % (ns, rc, cls.__reader_classes[ns]))
+                cls.__reader_classes[ns] = rc
+            
+            # Ignored namespaces
+            for ns in rc.IGNORED_NAMESPACES:
+                if ns not in cls.__ignored_namespaces:
+                    cls.__ignored_namespaces.append(ns)
+            
+            # Supported file extensions
+            for fe in rc.FILE_EXTENSIONS:
+                fe = fe.lower()
+                if fe not in cls.__supported_file_extensions:
+                    cls.__supported_file_extensions.append(fe)
+            
+        cls.__loaded_reader_classes = loaded_reader_classes
+    
+    @classmethod
+    def _get_namespaces(cls, etree):
+        """
+        Return a list of XML namespaces in the given element tree.
+        """
+        namespaces = []
+        namespaces.append(utils.xml.split_tag_namespace(etree.tag)[0])
+        for elem in etree:
+            ns = utils.xml.split_tag_namespace(elem.tag)[0]
+            if ns not in namespaces:
+                namespaces.append(ns)
+        return filter(lambda ns: ns is not None, namespaces)
+    
+    def _read_impls_from_file_root_element(self, root, namespaces):
+        impls = []
+        reader_classes = self.get_reader_classes()
+        
+        # Go through the list of XML namespaces encountered in the
+        # file and read an implementation using the corresponding
+        # reader for each namespace
+        impl_count = 0
+        common_data = CommonImplmlDataReader.read_data(root)
+        for ns in namespaces:
+            if ns not in reader_classes: continue
+            
+            rc = reader_classes[ns]
+            impl = self._read_impl(rc, root)
+            if impl:
+                impl.index = impl_count
+                impl_count += 1
+                if common_data: common_data.apply(impl)
+                impls.append(impl)
+        
+        # Add temp feature definitions to the first implementation
+        if common_data and impls:
+            impls[0]._tempvar_defs.extend(common_data.tempvar_defs)
+        return impls
+    
+    def _read_impls_from_file_sub_elements(self, root):
+        impls = []
+        
+        # Collect common ImplML namespace data
+        common_data = CommonImplmlData()
+        for elem in root:
+            ns = utils.xml.split_tag_namespace(elem.tag)[0]
+            if ns == COMMON_IMPLML_NAMESPACE:
+                cd = CommonImplmlDataReader.read_data(elem)
+                if cd: common_data.extend(cd)
+        
+        # Go through all sub-elements and read an implementation instance
+        # from each if possible
+        impl_count = 0
+        reader_classes = self.get_reader_classes()
+        for elem in root:
+            ns = utils.xml.split_tag_namespace(elem.tag)[0]
+            if ns != COMMON_IMPLML_NAMESPACE and ns in reader_classes:
+                reader_class = reader_classes[ns]
+                impl = self._read_impl(reader_class, elem)
+                if impl:
+                    cd = CommonImplmlDataReader.read_data(elem)
+                    if cd is not None:
+                        impl._tempvar_defs.extend(cd.tempvar_defs)
+                        data = common_data.copy()
+                        data.extend(cd)
+                        data.apply(impl)
+                    else:
+                        common_data.apply(impl)
+                    
+                    impl.index = impl_count
+                    impl_count += 1
+                    impls.append(impl)
+        
+        # Add temporary feature definitions to the first implementation instance
+        if impls:
+            impls[0]._tempvar_defs = common_data.tempvar_defs + impls[0]._tempvar_defs
+        
+        return impls
+    
+    def _read_impl(self, reader_class, elem):
+        """
+        Read an implementation with the given reader class from the given element.
+        
+        If an exception is raised during reading, the exception is logged
+        and None returned. 
+        
+        @return: The read implementation or None.
+        """
+        try:
+            return reader_class.read_impl(self.resource_ref, self.configuration, elem)
+        except exceptions.ParseError, e:
+            log.error("Error reading implementation '%s': %s", (self.resource_ref, e))
+        except Exception, e:
+            utils.log_exception(log, e)
+            
+        return None
+
+    @classmethod
+    def get_reader_classes(cls):
+        """
+        Return a dictionary of all possible implementation reader classes.
+        
+        Dictionary key is the XML namespace and the value is the corresponding
+        reader class.
+        """
+        cls._load_data_from_plugins()
+        return cls.__reader_classes
+    
+    @classmethod
+    def get_supported_file_extensions(cls):
+        """
+        Return a list of all supported implementation file extensions.
+        """
+        cls._load_data_from_plugins()
+        return cls.__supported_file_extensions
+    
+    @classmethod
+    def get_ignored_namespaces(cls):
+        """
+        Return a list of all ignored XML namespaces.
+        """
+        cls._load_data_from_plugins()
+        return cls.__ignored_namespaces
+
+    def read_implementations(self):
+        try:
+            root = plugin.ReaderBase._read_xml_doc_from_resource(self.resource_ref, self.configuration)
+            return self.read_implementation(root)
+        except exceptions.ParseError, e:
+            # Invalid XML data in the file
+            log.error(e)
+            return []
+
+    def read_implementation(self, xmlroot):
+        root = xmlroot
+        
+        # Check if the implementations should all be read from the
+        # document root, or each from its own sub-element under the root
+        read_from_root = False
+        ns = utils.xml.split_tag_namespace(root.tag)[0]
+        if ns: read_from_root = True
+        
+        # Collect namespaces from the file and check that all are supported or ignored
+        namespaces = self._get_namespaces(root)
+        for ns in namespaces:
+            if ns != COMMON_IMPLML_NAMESPACE \
+                and ns not in self.get_reader_classes() \
+                and ns not in self.get_ignored_namespaces():
+                log.error("Unsupported XML namespace '%s' in file '%s'" % (ns, self.resource_ref))
+                return []
+        
+        if read_from_root:
+            impls = self._read_impls_from_file_root_element(root, namespaces)
+        else:
+            impls = self._read_impls_from_file_sub_elements(root)
+        return impls
+
+
+class CommonImplmlDataReader(object):
+    """
+    Internal reader class for reading common ImplML namespace data from and element.
+    """
+    
+    VALID_PHASES = ('pre', 'normal', 'post')
+    VALID_TYPES = ('string', 'int', 'real', 'boolean')
+    
+    @classmethod
+    def read_data(cls, etree):
+        """
+        Read common ImplML data from the given XML element.
+        @return: A CommonImplmlData instance or None if no common namespace
+            elements were found.
+        """
+        result = CommonImplmlData()
+        
+        reader_methods = {'phase'                   : cls._read_phase,
+                          'tag'                     : cls._read_tag,
+                          'tempVariable'            : cls._read_tempvar,
+                          'tempVariableSequence'    : cls._read_tempvarseq,
+                          'settingRefsOverride'     : cls._read_setting_refs_override,
+                          'outputRootDir'           : cls._read_output_root_dir,
+                          'outputSubDir'            : cls._read_output_sub_dir}
+        
+        found = False
+        for elem in etree:
+            ns, tag = utils.xml.split_tag_namespace(elem.tag)
+            if ns != COMMON_IMPLML_NAMESPACE:   continue
+            if tag not in reader_methods:       continue
+            
+            reader_methods[tag](elem, result)
+            found = True
+        
+        if found:   return result
+        else:       return None
+    
+    @classmethod
+    def _read_phase(cls, elem, result):
+        phase = elem.get('name')
+        if phase is None:
+            cls._raise_missing_attr(elem, 'name')
+        if phase not in cls.VALID_PHASES:
+            raise exceptions.ParseError("Invalid invocation phase '%s' defined." % phase)
+        
+        result.phase = phase
+    
+    @classmethod
+    def _read_tag(cls, elem, result):
+        name = elem.get('name')
+        value = elem.get('value')
+        if name is not None:
+            if result.tags is None:     result.tags = {}
+            if name not in result.tags: result.tags[name] = []
+            result.tags[name].append(value)
+    
+    @classmethod
+    def _read_tempvar(cls, elem, result):
+        ref = elem.get('ref')
+        type = elem.get('type', 'string')
+        value = elem.get('value', '')
+        
+        if ref is None:
+            cls._raise_missing_attr(elem, 'ref')
+        if type not in cls.VALID_TYPES:
+            cls._raise_invalid_type(ref, type)
+        
+        result.tempvar_defs.append(TempVariableDefinition(ref, type, value))
+    
+    @classmethod
+    def _read_tempvarseq(cls, elem, result):
+        ref = elem.get('ref')
+        if ref is None:
+            cls._raise_missing_attr(elem, 'ref')
+        
+        sub_items = []
+        for sub_elem in elem.findall('{%s}tempVariable' % COMMON_IMPLML_NAMESPACE):
+            sub_ref = sub_elem.get('ref')
+            sub_type = sub_elem.get('type', 'string')
+            
+            if sub_ref is None:
+                cls._raise_missing_attr(sub_elem, 'ref')
+            if sub_type not in cls.VALID_TYPES:
+                cls._raise_invalid_type(sub_ref, sub_type)
+            
+            sub_items.append((sub_ref, sub_type))
+        
+        if not sub_items:
+            raise exceptions.ParseError("Temporary variable sequence '%s' does not have any sub-items" % ref)
+        
+        result.tempvar_defs.append(TempVariableSequenceDefinition(ref, sub_items))
+    
+    @classmethod
+    def _read_setting_refs_override(cls, elem, result):
+        if elem.get('refsIrrelevant', 'false').lower() in ('1', 'true'):
+            refs = None
+        else:
+            refs = []
+            for sub_elem in elem.findall('{%s}settingRef' % COMMON_IMPLML_NAMESPACE):
+                ref = sub_elem.get('value')
+                
+                if ref is None:
+                    cls._raise_missing_attr(sub_elem, 'value')
+                
+                refs.append(ref)
+                
+        result.setting_refs_override = SettingRefsOverride(refs)
+    
+    @classmethod
+    def _read_output_root_dir(cls, elem, result):
+        value = elem.get('value')
+        if value: result.output_root_dir = value
+    
+    @classmethod
+    def _read_output_sub_dir(cls, elem, result):
+        value = elem.get('value')
+        if value: result.output_sub_dir = value
+
+    @classmethod
+    def _raise_missing_attr(cls, elem, attrname):
+        raise exceptions.ParseError("XML element %s does not contain the mandatory '%s' attribute." % (elem.tag, attrname))
+    
+    @classmethod
+    def _raise_invalid_type(cls, ref, type):
+        raise exceptions.ParseError("Invalid feature type '%s' specified for temporary ConfML feature '%s'." % (type, ref))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/api.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3020 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+"""
+Cone public API.
+The core interface to the ConE functionality.
+"""
+
+import os
+import re
+import sys
+import logging
+import copy
+import sets
+
+import exceptions, utils, container, mapping
+
+class Base(container.ObjectContainer):
+    """
+    The Base class is intended for capturing same kind of naming scheme.
+    """
+    
+    
+    def __init__(self, ref="", **kwargs):
+        if len(utils.dottedref.split_ref(ref)) > 1:
+            raise exceptions.InvalidRef("Invalid reference for Base object %s!" % ref)
+        self.ref = ref
+        container.ObjectContainer.__init__(self, ref)
+        for arg in kwargs.keys():
+            if kwargs.get(arg) != None:
+                setattr(self, arg, kwargs.get(arg))
+
+    def __repr__(self):
+        dict = self._dict()
+        return "%s(%s)" % (self.__class__.__name__, dict)
+
+    def _get_mapper(self,modelname):
+        """
+        Return a instance of appropriate mapper for given model.
+        """
+        return mapping.BaseMapper()
+
+    def _compare(self, other, dict_keys=None):
+        """ 
+        Compare the attributes of elements 
+        """
+        if isinstance(other, Base):
+            keys = dict_keys or self._dict().keys() 
+            for key in keys:
+                self_attr = None
+                other_attr = None
+                try:
+                    self_attr = getattr(self, key)
+                    other_attr = getattr(other, key)
+                except AttributeError:
+                    # If the attribute is not found from either elements
+                    # ignore it entirely
+                    if self_attr == None and other_attr == None: 
+                        continue
+                if  self_attr != other_attr:
+                    return False
+            # If all given keys match report this as as similar element
+            return True
+        else:
+            return False
+
+    def _clone(self, **kwargs):
+        """
+        A generic implementation for cloning the object.
+        Copies all (public) members in dictionary.
+        To clone objects recursively set the recursion level with recursion param.
+        @param recursion: Boolean to define recursion on or off
+        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
+        perform recursion to all objects.
+        """
+        dict = self._dict()
+        if kwargs.get('class_instance'):
+            class_instance = kwargs.get('class_instance')
+            del kwargs['class_instance']
+        else:
+            class_instance = self.__class__
+        obj = class_instance(**dict)
+        # Remove all children created at the construction phase 
+        # This is needed when the recursion adds children to the object so that there are not duplicates
+        obj._order = []
+        obj._children = {}
+        
+        # handle the recursion argument
+        recursion = kwargs.get('recursion', False)
+        if recursion:
+            recursion_depth = kwargs.get('recursion_depth', -1)
+            if recursion_depth < 0 or recursion_depth > 0:
+                # decrease the recursion
+                kwargs['recursion_depth'] = recursion_depth - 1 
+                for child in self._objects():
+                    obj._add(child._clone(**kwargs), container.APPEND)
+        return obj
+
+    def _dict(self):
+        """
+        Return the public variables in a dictionary
+        """
+        dict = {}
+        for key in self.__dict__.keys():
+            if key.startswith('_'):
+                continue
+            else:
+                dict[key] = self.__dict__[key]
+        return dict
+
+    def _default_object(self, name):
+        return Base(name)
+
+    @property
+    def fqr(self):
+        """
+        Return a Fully Qualified Ref, which is the full name of the reference. 
+        Joins the namespace and ref to one string.
+        @return: A string 
+        """
+        return utils.dottedref.join_refs([self.namespace, self.get_ref()])
+
+    @property
+    def namespace(self):
+        """
+        @return: The namespace of the object.
+        """
+        containerpath = ""
+        path = ""
+        parentcontainer = self.find_parent(container=True)
+        parent = self.find_parent(type=Base)
+        paths = []
+        while parent and parent != parentcontainer:
+            """ Skip the element if it is supposed to be hidden. Begins with _. """
+            if not parent.get_ref().startswith('_'):
+                paths.append(parent.get_ref())
+            parent = parent._get_parent()
+        if parentcontainer:
+            paths.append(parentcontainer.namespace)
+        paths.reverse()
+        return utils.dottedref.join_refs(paths)
+
+    def get_fullref(self):
+        """
+        Return a full reference, reference including a 
+        possible index of the object in list. 
+        e.g. ref can be bar[1] or just the normal bar. 
+        
+        @return: The full reference of the object.
+        """
+        if self.parent and utils.is_list(self.parent._get(self.ref)):
+            return "%s[%s]" % (self.ref, self.get_index())
+        else:
+            return self.ref
+
+    def get_fullfqr(self):
+        """
+        Return a full reference, reference including a 
+        possible index of the object in list. 
+        ref and adds index.
+        @return: A string 
+        """
+        return utils.dottedref.join_refs([self.get_fullnamespace(), self.get_fullref()])
+
+    def get_fullnamespace(self):
+        """
+        @return: The full namespace of the object with possible indexes of the parent objects
+        """
+        containerpath = ""
+        path = ""
+        parentcontainer = self.find_parent(container=True)
+        parent = self.find_parent(type=Base)
+        paths = []
+        while parent and parent != parentcontainer:
+            paths.append(parent.get_fullref())
+            parent = parent.parent
+        if parentcontainer:
+            paths.append(parentcontainer.namespace)
+        paths.reverse()
+        return utils.dottedref.join_refs(paths)
+
+    def get_storage(self):
+        """
+        Get the root storage from the root object.
+        """
+        if self._find_parent():
+            return self._find_parent().get_storage()
+        else:
+            raise exceptions.StorageException("Storage is not found from root!")
+
+    def get_project(self):
+        """
+        Get the root project from the root object.
+        """
+        if isinstance(self, Project):
+                return self
+        elif self._find_parent():
+            return self._find_parent().get_project()
+        else:
+            raise exceptions.NotFound("Project not found!!")
+
+    def get_default_view(self):
+        """
+        Get the default view from the root object.
+        """
+        try:
+            return self._find_parent().get_default_view()
+        except exceptions.NotFound:
+            raise exceptions.NotFound("Default View is not found! No root configuration?")
+
+    def get_root(self):
+        """
+        Get the root object
+        """
+        try:
+            return self._find_parent().get_root()
+        except exceptions.NotFound:
+            return self
+
+    def get_root_configuration(self):
+        """
+        Get the root object
+        """
+        if self.find_parent(type=Configuration):
+            return self.find_parent(type=Configuration).get_root_configuration()
+        elif isinstance(self, Configuration):
+            return self
+        else:
+            return None
+
+    def get_index(self):
+        """
+        @return : the index of the data element for sequential data defined inside the same configuration.
+        0 for normal data.
+        """
+        # Get the list of items from parent which contains this element and ask my own index
+        # Make sure that the returned element is a list with get_list
+        selflist = utils.get_list(self._get_parent()._get(self.get_ref()))
+        return selflist.index(self)
+
+    def find_parent(self, **kwargs):
+        """
+        find the closest parent object of given type.
+        e.g. find_parent(type=Configuration) returns the closest parent 
+        Configuration parent instance
+        @param type: class definitiob
+        """
+        type = kwargs.get('type', None)
+        container = kwargs.get('container', False)
+        try:
+            parent = self._find_parent()
+            if type and isinstance(parent, type):
+                    return parent
+            elif container and hasattr(parent, 'container'):
+                    return parent
+            else:
+                return parent.find_parent(**kwargs)
+        except exceptions.NotFound:
+            return None
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        raise exceptions.NotSupportedException("Cannot add %s object to %s" % (child, self))
+
+    def get_elem(self, fqr):
+        """
+        A generic get function to get child objects and members. The function uses getattr
+        to traverse downwards the the object tree. The returned object is the final object or attribute 
+        if it is found. Raises AttributeError if the child is not found.
+        
+        Example: obj.get('test.bar'), returns child obj.test.bar
+        @param fqr: the fully qualified ref to the object
+        @raise AttributeError: if the given ref is not found.  
+        """
+        return None
+
+
+class Project(Base):
+    """
+    A project is a container that can hold several Configuration objects.
+    """
+
+    def __init__(self, storage, **kwargs):
+        """
+        Project constructor
+        """
+        Base.__init__(self, "")
+        """ Try to set the model and tet the actual configuration class """
+        try:
+            self._model = storage.persistentmodule.MODEL
+        except AttributeError:
+            self._model = None
+        
+        self.set_storage(storage)
+        self.update()
+        self.loaded = {}
+
+    def __add_loaded__(self, ref, obj):
+        """
+        Add the object to loaded 
+        """
+        self.loaded[ref] = {'counter': 0, 'obj': obj}
+
+    def __get_loaded__(self, ref):
+        """
+        Get a loaded object if it is existing and increase the reference counter
+        @param ref: 
+        @return: The loaded object if it exists. None if it does not. 
+        """
+        if self.loaded.has_key(ref):
+            return self.loaded[ref]['obj']
+        else:
+            return None
+
+    def __loaded__(self, ref):
+        """
+        Get a loaded object if it is existing and increase the reference counter
+        @param ref: 
+        @return: The loaded object if it exists. None if it does not. 
+        """
+        if self.loaded.has_key(ref):
+            self.loaded[ref]['counter'] += 1
+        else:
+            raise exceptions.NotFound("ref %s is not found from loaded!" % ref)
+
+    def __unloaded__(self, ref):
+        """
+        returns True when the reference count is zero and object can be released.
+        """
+        if self.loaded.has_key(ref):
+            self.loaded[ref]['counter'] -= 1
+            if self.loaded[ref]['counter'] == 0:
+                del self.loaded[ref]
+                return True
+            else: 
+                return False
+        else: 
+            return True
+        
+    def _supported_type(self, obj):
+        if isinstance(obj, Configuration) \
+        or isinstance(obj, ConfigurationProxy): 
+            return True
+        else:
+            return False
+
+
+    def update(self):
+        """
+        update the root confml files as configurations
+        """
+        root_confmls = self.get_storage().list_resources(".")
+        root_confmls = utils.resourceref.filter_resources(root_confmls, "\.confml")
+        for rootml in root_confmls:
+            self._add(ConfigurationProxy(rootml))
+    
+    def get_storage(self):
+        """
+        Get the Storage instance of this Project.
+        """
+        return self.storage
+
+    def set_storage(self, storage):
+        """
+        Set the Storage instance of this Project.
+        """
+        if isinstance(storage, Storage):
+            self.storage = storage
+        else:
+            raise exceptions.StorageException("The given storage is not a instance of Storage!")
+
+    def list_configurations(self, filter_or_filters=None):
+        """
+        List the direct child objects of the project (Root configurations)
+        @param filter_or_filters: A regular expression or list of regular expressions
+            used for filtering the configuration paths. If None, all configurations are
+            returned.
+        @return: a list for configuration file paths
+        """
+        filters = None
+        if isinstance(filter_or_filters, basestring):   filters = [filter_or_filters]
+        elif filter_or_filters is not None:             filters = filter_or_filters
+        
+        configs = [obj.get_path() for obj in self._objects()]
+        
+        if filters is not None:
+            result = []
+            for config in configs:
+                for filter in filters:
+                    if re.match(filter, config) is not None:
+                        result.append(config)
+                        break
+            return result
+        else:
+            return configs
+
+    def list_all_configurations(self):
+        """
+        List all configuration objects of the project (all configurations)
+        @return: a list for configuration file paths
+        """
+        return [obj.get_path() for obj in self._traverse(type=(Configuration, ConfigurationProxy))]
+
+    def get_configuration(self, path):
+        """
+        Get a configuration object from the given path
+        @param path: path to configuration 
+        @return: a instance of Configuration.
+        """
+        # Load the configuration object if it is not already loaded
+        try:
+            return self._get(utils.resourceref.to_objref(utils.resourceref.norm(path)))
+        except exceptions.NotFound, e:
+            if self.storage.is_resource(utils.resourceref.norm(path)):
+                proxy = ConfigurationProxy(utils.resourceref.norm(path))
+                proxy._set_parent(self)
+                return proxy
+            else:
+                raise e
+
+    def is_configuration(self, path):
+        """
+        Return true if the given path is a configuration object in this Project.
+        @param path: path to configuration 
+        @return: Boolean return value.
+        """
+        # Changed from list_all_configurations to list_configurations
+        # (list_all_configurations causes a insane performance problem with _traverse)
+        return path in self.list_configurations()
+
+    def add_configuration(self, config):
+        """
+        Add a Configuration object to this project
+        """
+        if isinstance(config, Configuration):
+            if self.is_configuration(config.get_path()):
+                raise exceptions.AlreadyExists("%s" % config.get_path())
+            self._add(config)
+            self.__add_loaded__(config.get_path(), config)
+            self.__loaded__(config.get_path())
+        else:
+            raise exceptions.IncorrectClassError("Only Configuration instance can be added to Project!")
+
+    def create_configuration(self, path, namespace=""):
+        """
+        Create a Configuration object to this project
+        """
+        config = self.get_configuration_class()(utils.resourceref.norm(path), namespace=namespace)
+        self.add_configuration(config)
+        return config
+
+    def remove_configuration(self, path):
+        """
+        Remove a Configuration by its reference
+        """
+        # remove configuration as an object and try to remove it from the storage
+        self._remove(utils.resourceref.to_objref(path))
+        try:
+            self.storage.delete_resource(path)
+        except exceptions.NotSupportedException:
+            pass
+        return
+
+    def import_configuration(self, configuration):  
+        """
+        Import a configuration object from another storage
+        """
+        self.storage.import_resources(configuration.list_resources(), configuration.get_storage())
+        return
+
+    def export_configuration(self, configuration, export_storage, empty_folders=False):
+        """
+        Export a configuration object to another storage
+        """
+        # First clone the configuration and then import the rest of the configuration resources
+        if isinstance(configuration, ConfigurationProxy):
+            configuration = configuration._get_obj()
+        
+        export_storage.unload(configuration.get_full_path(),configuration)
+        for child in configuration._traverse(type=Configuration):
+            export_storage.unload(child.get_full_path(),child)
+        
+        #If the configuration is not in the root of the project adding the path 
+        #to final exporting source path.
+        #l = []
+        cpath = utils.resourceref.get_path(configuration.get_path()) 
+        resr = [utils.resourceref.join_refs([cpath,related]) \
+                for related in configuration.get_layer().list_all_related(empty_folders)]        
+        self.storage.export_resources(resr ,export_storage, empty_folders)
+        return
+
+    def get_configuration_class(self):
+        """
+        return the default configuration class that is used with the model. 
+        """
+        return utils.get_class(self._model, Configuration)
+
+    def save(self):
+        """
+        Save the object to the permanent Storage object. Calls the save operation for 
+        all the children and also for the Storage.
+        """
+        for child in self._objects():
+            if isinstance(child, (Configuration, ConfigurationProxy)):
+                child.save()
+        self.storage.save()
+
+    def close(self):
+        """
+        Close the Project.
+        """
+        for child in self._objects():
+            if isinstance(child, (Configuration, ConfigurationProxy)):
+                child.close()
+        self.storage.close()
+
+    def load(self, path):
+        """
+        Load an object from a reference. The given reference is loaded once from storage
+        and stored as a loaded object to the Project. Sequential loads to the same ref will
+        return the same object.
+        @param path: The reference where to load the object 
+        @raise StorageException: if the given object cannot be loaded as an 
+        object from this storage 
+        """
+        if not self.__get_loaded__(path):
+            configuration = self.get_storage().load(path)
+            if configuration.get_ref() == 'unknown':
+                 configuration.set_ref(utils.resourceref.to_dref(path))
+            self.__add_loaded__(path, configuration)
+        """ increase the ref counter """
+        self.__loaded__(path)
+        return self.__get_loaded__(path)
+
+    def unload(self, path, object):
+        """
+        Release the given ref, which decreases the reference counter of the given ref.
+        @param path: The reference where to store the object 
+        @param object: The object instance to dump 
+        @raise StorageException: if the given object cannot be dumped to this storage 
+        """
+        if self.__unloaded__(path):
+            self.get_storage().unload(path, object)
+
+    def get_path(self):
+        """
+        Return the path of the project, which is always root
+        """
+        return ""
+
+
+class CompositeConfiguration(Base):
+    """
+    A base class for composite Configuration objects.  
+    """
+    def __init__(self, ref="", **kwargs):
+#        self.meta       = {}
+#        self.desc       = ""
+        super(CompositeConfiguration, self).__init__(ref, **kwargs)
+        self.container = True
+
+    def add_configuration(self, config):
+        """
+        Add an existing Configuration to this configuration
+        @param config: A Configuration instance:
+        @return: None 
+        """
+        """
+        Merge the default view features from added config to this configs _default_view.
+        """
+        self._add(config)
+
+    def include_configuration(self, configref):
+        """
+        Add an existing Configuration to this configuration by its resource reference
+        @param config: A Configuration instance:
+        @return: None 
+        """
+        # add the configuration load proxy to this configuration instead 
+        # adding the configuration directly
+        self._add(ConfigurationProxy(configref))
+
+    def create_configuration(self, path):
+        """
+        Create a new configuration by its name to the Configuration. 
+        1. Create new Configuration object
+        2. Create new ConfigurationProxy 
+        3. Add proxy to this object
+        4. Set proxy to point to the created Configuration object
+        @param path: The reference of the configuration to create
+        @return: The new configuration object.
+        """
+        # normalise the path
+        normpath = utils.resourceref.norm(path)
+        cklass = self.get_configuration_class()
+        conf = cklass(normpath, namespace=self.namespace)
+        proxy = ConfigurationProxy(normpath)
+        self.add_configuration(proxy)
+        proxy._set_obj(conf)
+        return conf
+
+    def remove_configuration(self, path):
+        """
+        Remove a Layer object from the Configuration by its reference.
+        """
+        self._remove(utils.resourceref.to_objref(path))
+
+    def list_configurations(self):
+        """
+        List all Layer objects in the Configuration
+        @return: a copy array of layer references.
+        """
+        return [config.get_path() for config in self._objects(type=(Configuration, ConfigurationProxy))] 
+
+    def list_all_configurations(self):
+        """
+        List all Layer objects in the Configuration
+        @return: a copy array of layer references.
+        """
+        # TODO
+        # huge performance problem 
+        return [config.get_path() for config in self._traverse(type=(Configuration, ConfigurationProxy))] 
+
+    def get_configuration(self, path):
+        """
+        Get a Layer object by if path
+        @return: a Layer object
+        """
+        return self._get(utils.resourceref.to_objref(path))
+
+    def get_configuration_by_index(self, index):
+        """
+        Get a Layer object by if indexing number
+        @return: a Layer object
+        """
+        configs = self._objects(type=(Configuration, ConfigurationProxy))
+        return configs[index]
+
+    def get_last_configuration(self):
+        """
+        Get the last Layer object from this configuration hierarchy.
+        @return: a Layer object
+        """
+        last_config = self
+        try: 
+            last_config = last_config.get_configuration_by_index(-1)
+            return last_config.get_last_configuration()
+        except IndexError:
+            return self 
+
+    def get_configuration_class(self):
+        """
+        return the default configuration class retrieved from the project if it is found.
+        Otherwise return cone.public.api.Configuration. 
+        """
+        try:
+            return self.get_project().get_configuration_class()
+        # catch the Parent/Project NotFound exception
+        except exceptions.NotFound:
+            return Configuration
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, Configuration):
+            self.add_configuration(child)
+        elif isinstance(child, ConfigurationProxy):
+            self.add_configuration(child)
+        elif isinstance(child, Base):
+            self._add(child)
+        else:
+            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
+
+    def layered_content(self, layers=None):
+        """
+        fetch content from first to last and override content 
+        if it is found from a later layer 
+        Create an array of the layers based on the layer indexes.
+        """
+        configuration_array = []
+        if layers == None:
+            configuration_array = self.list_configurations()
+        else:
+            all = self.list_configurations()
+            for i in layers:
+                configuration_array.append(all[i])
+
+        content = container.DataContainer()
+        for configuration_path in configuration_array:
+            content_folder = self.get_configuration(configuration_path).get_layer().content_folder()
+            content_path = content_folder.get_current_path()
+            for content_file in content_folder.list_resources("", True):
+                source_file = utils.resourceref.join_refs([content_path, content_file])
+                content.add_value(content_file, source_file)
+                
+        return content
+
+
+class Configuration(CompositeConfiguration):
+    """
+    A Configuration is a container that can hold several Layer objects.
+    """
+
+    def __init__(self, ref="", **kwargs):
+        self.path = kwargs.get('path') or ref
+        self.namespace = kwargs.get('namespace', '')
+        self.name = utils.resourceref.to_objref(self.path)
+        super(Configuration, self).__init__(utils.resourceref.to_objref(self.path))
+        self.container = True
+
+    def _default_object(self, name):
+        return Feature(name)
+
+    def _supported_type(self, obj):
+        if isinstance(obj, Configuration) \
+        or isinstance(obj, Feature) \
+        or isinstance(obj, Data) \
+        or isinstance(obj, ConfigurationProxy) \
+        or isinstance(obj, View) \
+        or isinstance(obj, Base): 
+            return True
+        else:
+            return False
+
+    def _dict(self):
+        """
+        Return the public variables in a dictionary
+        """
+        dict = {}
+        for key in self.__dict__.keys():
+            if key.startswith('_'):
+                continue
+            else:
+                dict[key] = self.__dict__[key]
+        dict['namespace'] = self.namespace
+        return dict
+    
+    def get_name(self):
+        """
+        Return the name of the configuration
+        """
+        return self.name
+
+    def set_name(self, name):
+        """
+        Set the name
+        """
+        self.name = name
+
+    def get_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        return self.path
+
+    def set_path(self, path):
+        """
+        Set the path of the configuration resource, and update the name and ref to correspond
+        """
+        self.path = path
+        #self.name = utils.resourceref.to_objref(self.path)
+        self.set_ref(utils.resourceref.to_objref(self.path))
+
+    #@property
+    def get_full_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        try:
+            parentconfig = self._find_parent(type=Configuration)
+            parent_path = utils.resourceref.get_path(parentconfig.get_path()) 
+        except exceptions.NotFound:
+            parent_path = ""
+
+        return utils.resourceref.join_refs([parent_path, self.path])
+
+    def get_layer(self):
+        """
+        Get the layer object where this Configuration is located. 
+        """
+        if not hasattr(self, "layer"):
+            layerpath = utils.resourceref.get_path(self.get_path())
+            # hardcoded removal of confml folder from the layer path it is there
+            layerpath = utils.resourceref.remove_end(layerpath, '/confml')
+            self.layer = Layer(self.get_storage(), layerpath)
+            """ Add the sublayers to this layer if they are different from this configuration """
+            for configpath in self.list_configurations():
+                sublayer_path = utils.resourceref.get_path(self.get_configuration(configpath).get_full_path())
+                sublayer_path = utils.resourceref.remove_end(sublayer_path, '/confml')
+                if sublayer_path != utils.resourceref.get_path(self.get_path()):
+                    self.layer.add_layer(self.get_configuration(configpath).get_layer())
+        return self.layer
+
+    def set_namespace(self, namespace):
+        """
+        @param namespace: The new namespace of the object
+        """
+        self._namespace =  namespace
+        #self.root.set_namespace(namespace)
+
+    def get_namespace(self):
+        """
+        @return: The reference of the object.
+        """
+        return self._namespace
+
+    def del_namespace(self):
+        """
+        @return: The reference of the object.
+        """
+        self._namespace = None
+    namespace = property(get_namespace, set_namespace, del_namespace)
+
+    def list_resources(self, empty_folders=False):
+        """
+        List all resources used in this configuration
+        """
+        """
+        1. First ensure that all configuration resource files are added 
+        2. Then add all layer resources 
+        3. Make the list distinct
+        """
+        
+        
+        resources = [self.get_full_path()]
+        for config in self._traverse(type=Configuration):
+            resources.append(config.get_full_path())
+        layer = self.get_layer()
+        for resref in layer.list_all_resources(empty_folders):
+            resources.append(utils.resourceref.join_refs([layer.get_current_path(), resref]))
+    
+        return utils.distinct_array(resources)
+
+    def get_resource(self, ref, mode="r"):
+        """
+        Get the given resource as a Resource object. The resource is searched relative to the 
+        Configuration path, e.g. Configuration('test/foo/root.confml') => searches from 'test/foo'.
+        @param ref: the reference path to the requested resource
+        @return: a instance of Resource. 
+        """
+        mypath = utils.resourceref.get_path(self.path)
+        myref = utils.resourceref.join_refs([mypath, ref])
+        return self.get_storage().open_resource(myref, mode)
+
+    def get_all_resources(self):
+        """
+        Get all resources in resource list of Resource objects
+        """
+        resources = []
+        res_list = self.list_resources()
+        for res in res_list:
+            resources.append(self.get_storage().open_resource(res))
+        return resources
+
+    def get_root_resource(self):
+        """
+        Get the configuration reference resource.
+        """
+        return self.get_storage().open_resource(self.get_path())
+
+    def get_feature(self, ref):
+        """
+        Get a feature object by its reference.
+        @param ref: The reference to the feature object.
+        @return: A Feature object
+        """
+        return self._get(ref)
+
+    def add_feature(self, feature, namespace=""):
+        """
+        Add a feature object to the configuration.
+        @param feature: The Feature object to add.
+        @param namespace: The sub namespace for the feature. 
+        e.g. to add fea2 under fea1 add_feature(fea2, 'fea1')
+        @return: None
+        """
+        self._add_to_path(namespace, feature)
+
+    def remove_feature(self, ref):
+        """
+        remove feature by its reference
+        @param ref: 
+        """
+        self._remove(ref)
+
+    def list_features(self):
+        """
+        List immediate features found under the this configuration (the top nodes). 
+        The features are also available via the _default_view of the configuration.
+        @return: a list of feature references. 
+        """
+        return [fea.get_ref() for fea in self._objects(type=Feature)]
+
+    def list_all_features(self):
+        """
+        List all features found under the this configuration. The features are also 
+        available via the _default_view of the configuration.
+        @return: a list of feature references. 
+        """
+        return [fea.fqr for fea in self._traverse(type=Feature)]
+
+    def add_data(self, data, policy=container.REPLACE):
+        """
+        Add a data object to this configuration object.
+        @param data: The Data object to add.
+        @return: None
+        """ 
+        if not self._has(data.attr):
+            self._add(DataContainer(data.attr, container=True))
+        (namespace, name) = utils.dottedref.psplit_ref(data.get_fearef())
+        self._get(data.attr)._add_to_path(namespace, data, policy)
+
+    def get_data(self, ref):
+        """
+        Get a data object by its reference.
+        @param ref: The reference to the data object.
+        @return: A Data object
+        """
+        return self.data._get(ref)
+
+    def remove_data(self, ref):
+        """
+        remove feature by its reference
+        @param ref: 
+        """
+        self.data._remove(ref)
+
+    def list_datas(self):
+        """
+        List all datas found under the this configuration. 
+        @return: a list of Data references. 
+        """
+        if self._has('data'):
+            return [dataelem.fqr for dataelem in self.data._objects(type=Data)]
+        else:
+            return []
+
+    def get_datas(self):
+        """
+        List immediate datas found under the this configuration (the top nodes). 
+        @return: a list of Data references. 
+        """
+        if self._has('data'):
+            return [dataelem for dataelem in self.data._objects(type=Data)]
+        else:
+            return []
+
+    def list_all_datas(self):
+        """
+        List all Data elements found under the this configuration (or subconfigurations). 
+        @return: a list of Data references. 
+        """
+        return [dataelem.fqr for dataelem in self._traverse(type=Data)]
+
+    def get_all_datas(self):
+        """
+        List all Data elements found under the this configuration (or subconfigurations). 
+        @return: a list of Data references. 
+        """
+        return [dataelem for dataelem in self._traverse(type=Data)]
+
+    def list_leaf_datas(self):
+        """
+        List all leaf Data elements (i.e. actually modified settings) found under this configuration (or subconfigurations). 
+        @return: A list of Data references. 
+        """
+        return [dataelem.fqr for dataelem in self._find_leaves(type=Data)]
+    
+    def get_leaf_datas(self):
+        """
+        Get all leaf Data elements (i.e. actually modified settings) found under this configuration (or subconfigurations). 
+        @return: A list of Data objects. 
+        """
+        return [dataelem for dataelem in self._find_leaves(type=Data)]
+
+    def get_view(self, ref):
+        """
+        Get a view object by its reference.
+        @param ref: The reference to the view object.
+        @return: A View object
+        """
+        # Populate the view object before returning it
+        view = self._get(ref)
+        view.populate()
+        return view
+
+    def add_view(self, viewname):
+        """
+        Add a view object to the configuration.
+        @param viewname: The name of the view to add. 
+        @return: None
+        """
+        return self._add(View(viewname))
+
+    def remove_view(self, ref):
+        """
+        Remove a view object from the configuration.
+        @param ref: The reference to the View. 
+        @return: None
+        @raise NotFound: when view is not found.
+        """
+        return self._remove(ref)
+
+    def list_views(self):
+        """
+        List all views found under the this configuration.
+        @return: a list of view references. 
+        """
+        return [view._path(self) for view in self._traverse(type=View)]
+
+    def save(self):
+        """
+        Save the object to the permanent Storage object. Calls the save operation of 
+        all the children.
+        """
+        for child in self._objects():
+            if isinstance(child, (Configuration,ConfigurationProxy)):
+                child.save()
+        self.get_project().unload(self.get_full_path(), self)
+
+    def close(self):
+        """
+        Close the configuration
+        """
+        for child in self._objects():
+            if isinstance(child, (Configuration, ConfigurationProxy)):
+                child.close()
+#        if self.get_full_path() != "":
+#            self.get_project().unload(self.get_full_path(), self)
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, Feature):
+            self.add_feature(child)
+        elif isinstance(child, View):
+            self._add(child)
+        elif isinstance(child, (Data)):
+            self.add_data(child)
+        else:
+            super(Configuration, self).add(child)
+
+    def get_default_view(self):
+        """
+        Get the default view from this configuration hierarchy.
+        This returns always the view from the Root configuration point of view.
+        """
+        try:
+            parent = self._find_parent_or_default() 
+            if parent and isinstance(parent, Configuration):
+                return parent.get_default_view()
+            else:
+                if not hasattr(self, '_default_view'):
+                    self._create_default_view()
+                return self._default_view
+        except exceptions.NotFound, e:
+            raise e
+        # raise exceptions.NotFound("Default View is not found! No root configuration?")
+    
+    def recreate_default_view(self):
+        try:
+            parent = self._find_parent_or_default() 
+            if parent and isinstance(parent, Configuration):
+                parent.recreate_default_view()
+            else:
+                self._create_default_view()
+        except exceptions.NotFound, e:
+            raise e
+        # raise exceptions.NotFound("Default View is not found! No root configuration?")
+    
+    def _create_default_view(self):
+        # Rebuild the default view for this Configuration
+        self._default_view = View("_default_view", data=True)
+        self._default_view._parent= self
+        # First add all features of the configuration to the view. 
+        # Then add all data elements under the features
+        for child in self._traverse(type=Feature):
+            self._default_view.add_feature(child, child.namespace)
+        for child in self._traverse(type=Data):
+            #parent_config = child._find_parent_or_default(type=Configuration)
+            #print "Adding data %s: fqr: %s from file %s." % (child.get_value(), child.fqr, parent_config.get_path())
+            try:
+                fea = self._default_view.get_feature(child.fqr)
+                fea.add_data(child)
+            except exceptions.NotFound, e:
+                data_parent_config = child._find_parent_or_default(type=Configuration)
+                logging.getLogger('cone').info("Warning: Feature '%s' for data in %s not found." % (child.fqr, data_parent_config.get_path()))
+
+class ConfigurationProxy(container.LoadProxy):
+    """
+    Configuration loading proxy. Loads the configuration from the given reference, when needed.
+    """
+    def __init__(self, path, **kwargs):
+        """
+        The ConfigurationProxy that represents a configuration that is included in another configuration.
+        @param ref: the reference to the storage resource 
+        The ConfigurationProxy trust to get the store_interface from the parent object with get_storage() function.
+        
+        """
+        container.LoadProxy.__init__(self, path)
+        self.set('_name', utils.resourceref.to_objref(path))
+
+    def _clone(self, **kwargs):
+        """
+        A ConfigurationProxy specific implementation for cloning.
+        Copies all (public) members in dictionary.
+        To clone call the actual object that is proxied as well if the reqursion is on.
+        @param recursion: Boolean to define recursion on or off
+        @param recursion_depth: positive integer to define recursion depth. default is -1 which will 
+        perform recursion to all objects.
+        """
+        dict = self._dict()
+        obj = self.__class__(**dict)
+        # handle the recursion argument
+        recursion = kwargs.get('recursion', False)
+        if recursion:
+            recursion_depth = kwargs.get('recursion_depth', -1)
+            if recursion_depth < 0 or recursion_depth > 0:
+                # decrease the recursion
+                kwargs['recursion_depth'] = recursion_depth - 1
+                newobj = self._get_obj()._clone(**kwargs) 
+                obj._set_obj(newobj)
+        return obj
+
+    def _dict(self):
+        """
+        Return the public variables in a dictionary
+        """
+        dict = {}
+        for key in self.__dict__.keys():
+            if key.startswith('_'):
+                continue
+            else:
+                dict[key] = self.__dict__[key]
+        return dict
+
+    def _get_mapper(self,modelname):
+        """
+        Return a instance of appropriate mapper for given model.
+        """
+        return mapping.BaseMapper()
+
+class Group(Base):
+    """
+    A Group class. Group is used in View to group up other Group/Feature objects.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(Group, self).__init__(ref, **kwargs)
+        self.name = ref
+        self.support_data = kwargs.get("data", False)
+
+    def _supported_type(self, obj):
+        if isinstance(obj, (Group, \
+                           Base, \
+                           _FeatureProxy, \
+                           FeatureLink)): 
+            return True
+        else:
+            return False
+
+    def _default_object(self, name):
+        return Group(name)
+
+    def get_name(self):
+        """
+        Return the name of the configuration
+        """
+        return self.name
+
+    def set_name(self, name):
+        """
+        Set the name
+        """
+        self.name
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, (Group, \
+                              Base, \
+                              _FeatureProxy, \
+                              FeatureLink)):
+            self._add(child)
+        else:
+            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
+
+    def get_name(self):
+        """
+        Return the name of the configuration
+        """
+        return self.name
+
+    def set_name(self, name):
+        """
+        Set the name
+        """
+        self.name = name
+
+    def add_feature(self, feature, path=""):
+        """
+        Add feature to this Group.
+        """
+        if not isinstance(feature, Feature):
+            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
+        if not self.support_data:
+            self._add_to_path(path, _FeatureProxy(feature._name, feature))
+        else:
+            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
+
+    def remove_feature(self, ref):
+        """
+        remove a given feature from this view by reference. 
+        @param ref: 
+        """
+        self._remove(ref)
+
+    def get_feature(self, ref):
+        """
+        @param path: The path (ref) to the given feature 
+        """
+        try:
+            return self._get(ref)
+        except exceptions.NotFound:
+            raise exceptions.NotFound("Feature '%s' not found." % ref)
+
+    def get_features(self, ref, **kwargs):
+        """
+        Get a list of features that match the ref. 
+        Example1: get_features('foo.bar') would be the same as get_feature('foo.bar'), but this returns 
+        always a list [<Feature>].
+        Example2: get_features('foo.*') would try to retrieve a list of all foo children.
+        Example3: get_features('foo.*', type='') would try to retrieve a list of all foo children, 
+        that have a defined type.
+        @param path: The path (ref) to the given feature or xpath like expression 
+        @return: A list of features.
+        """
+        (startref, last) = utils.dottedref.psplit_ref(ref)
+        startelem = self._get(startref)
+        if last == '**':
+            return [fea for fea in startelem._traverse(**kwargs)]
+        elif last == '*':
+            return [fea for fea in startelem._objects(**kwargs)] 
+        else:
+            return [self._get(ref)]
+
+    def list_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [fea.get_ref() for fea in self._objects(type=(_FeatureProxy))]
+
+    def list_all_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [fea.fqr for fea in self._traverse(type=(_FeatureProxy))]
+
+    def add_group(self, groupname):
+        """
+        """
+        self._add(Group(groupname))
+
+    def remove_group(self, ref):
+        """
+        remove a given feature from this view by reference. 
+        @param ref: 
+        """
+        self._remove(ref)
+
+    def get_group(self, ref):
+        """
+        @param path: The path (ref) to the given feature 
+        """
+        return self._get(ref)
+
+    def list_groups(self):
+        """
+        """
+        return [group.get_name() for group in self._objects(type=Group)]
+
+    def populate(self):
+        """
+        Populate or fetch the link to the actual feature for this featureproxy.
+        This method fetches the feature to the _obj member variable and populates also 
+        subfeatures. 
+        """
+        for child in self._traverse(type=FeatureLink):
+            child.populate()
+        
+
+
+class View(Group):
+    """
+    A View class. View is intended to create new or different hierarchies of existing features. A View can contain Group and/or Feature objects.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(View, self).__init__(self.to_ref(ref), **kwargs)
+        self.name = ref
+        self.container = True
+
+    @classmethod
+    def to_ref(cls, ref):
+        """ 
+        return a view reference converted from name 
+        """
+        return ref.replace('.', '').replace('/', '')
+
+
+class Feature(Base):
+    """
+    A Feature class. Feature is the base for all Configurable items in a Configuration.
+    """
+    PROPERTIES = ['value']
+    def __init__(self, ref="", **kwargs):
+        super(Feature, self).__init__(ref, **kwargs)
+        self.name = kwargs.get('name', ref)
+        self.type = kwargs.get('type', None)
+        self._dataproxy = None
+
+    def __copy__(self):
+        dict = {}
+        for key in self.__dict__.keys():
+            if key.startswith('_') or key == 'ref':
+                continue
+            else:
+                dict[key] = self.__dict__[key]
+        fea = self.__class__(self.ref, **dict)
+        return fea
+
+
+    def _supported_type(self, obj):
+        # For now support added for desc element via support for Base
+        if isinstance(obj, (Feature, Option, Base)):
+            return True
+        else:
+            return False
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, Feature):
+            self.add_feature(child)
+        elif isinstance(child, Option):
+            self._add(child, policy)
+        elif isinstance(child, Base):
+            self._add(child, policy)
+        else:
+            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
+
+    def get_name(self):
+        """
+        Return the name of the configuration
+        """
+        return self.name
+
+    def set_name(self, name):
+        """
+        Set the name
+        """
+        self.name = name
+
+    def get_type(self):
+        return self.type
+
+    def set_type(self, type):
+        self.type = type
+
+    def add_feature(self, feature, path=""):
+        """
+        @param feature: The Feature object to add 
+        """
+        configuration = self.find_parent(type=Configuration)
+        if configuration:
+            feapath = utils.dottedref.join_refs([self._path(configuration), path])
+            configuration.add_feature(feature, feapath)
+        else:
+            self._add_to_path(path, feature)
+
+    def get_feature(self, path):
+        """
+        @param path: The path (ref) to the given feature 
+        """
+        return self._get(path)
+
+    def remove_feature(self, ref):
+        """
+        remove a given feature from this view by reference. 
+        @param ref: 
+        """
+        configuration = self.find_parent(type=Configuration)
+        if configuration:
+            fullfqr = utils.dottedref.join_refs([self._path(configuration), ref])
+            configuration.remove_feature(fullfqr)
+        else:
+            self._remove(ref)
+
+    def list_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [fea.get_ref() for fea in self._objects(type=Feature)]
+
+    def list_all_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [fea._path(self) for fea in self._traverse(type=Feature)]
+
+    def add_option(self, option):
+        """
+        @param option: option object
+        """
+        if not isinstance(option, Option):
+            raise TypeError("%r is not an instance of Option!" % option)
+        self._add(option)
+    
+    def create_option(self, name, value):
+        """
+        @param name: option name
+        @param value: option value
+        """
+        self._add(Option(name, value))
+
+    def get_option(self, ref):
+        """
+        @param name: The option reference of the option (as returned by list_options()) 
+        """
+        real_ref = 'opt_' + ref
+        obj = self._get(real_ref)
+        if not isinstance(obj, Option):
+            raise TypeError('Object %r is not an instance of Option (%r instead)' % (real_ref, type(obj)))
+        return obj
+
+    def remove_option(self, ref):
+        """
+        remove a given option from this feature by option reference. 
+        """
+        real_ref = 'opt_' + ref
+        obj = self._get(real_ref)
+        if not isinstance(obj, Option):
+            raise TypeError('Trying to remove option with ref %r, but object with ref %r is not an instance of Option (%s instead)' % (ref, real_ref, type(obj)))
+        self._remove(real_ref)
+
+    def list_options(self):
+        """
+        Return a array of all Option children references under this object.
+        """
+        # Return option refs without the leading 'opt_'
+        return [opt.ref[4:] for opt in self._objects(type=Option)]
+
+    def get_value(self, attr=None):
+        """
+        Get the current value of the feature
+        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
+        """
+        # Do not allow getting of setting of sequence values directly with Feature object
+        if not self.is_sequence():
+            return self.get_value_cast(self.dataproxy._get_value(attr), attr)
+        else:
+            """ get the feature specific data from sequence => a column of data table """
+            coldata =  []
+            feasequence = self.get_sequence_parent()
+            feapath = self._path(feasequence)
+            for row in feasequence.data:
+                feadata = row.get_feature(feapath)
+                coldata.append(feadata.value)
+            return coldata
+
+    def set_value(self, value, attr=None):
+        """
+        Set the current value for this feature. Set the value on the topmost layer.
+        @param value: the value to set
+        """
+        # Do not allow setting of setting of sequence values directly with Feature object
+        if not self.is_sequence():
+            value = self.set_value_cast(value, attr)
+            self.dataproxy._set_value(value, attr)
+
+    def del_value(self, attr=None):
+        """
+        Delete the topmost value for this feature.
+        """
+        if not self.is_sequence():
+            self.dataproxy._del_value(attr)
+
+    def get_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in get operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        return value 
+    
+    def set_value_cast(self, value, attr=None):
+        """
+        A function to perform the value type casting in the set operation  
+        @param value: the value to cast 
+        @param attr: the attribute which is fetched from model (normally in confml either None='data' or 'rfs')
+        """
+        return value 
+
+    def get_original_value(self, attr=None):
+        """
+        Get the current value of the feature
+        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
+        """
+        # Do not allow getting of setting of sequence values directly with Feature object
+        if not self.is_sequence():
+            return self.dataproxy._get_value(attr)
+        else:
+            """ get the feature specific data from sequence => a column of data table """
+            coldata =  []
+            feasequence = self.get_sequence_parent()
+            feapath = self._path(feasequence.data)
+            for row in feasequence.data:
+                feadata = row.get_feature(feapath)
+                coldata.append(feadata.value)
+            return coldata
+
+    def add_data(self, data):
+        """
+        Add a data value.
+        @param data: A Data object  
+        """
+        try:
+            return self.dataproxy._add_data(data)
+        except AttributeError:
+            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
+            return self.dataproxy._add_data(data)
+
+    def get_data(self, attr=None):
+        """
+        Helper function to get the topmost data value from the default view.
+        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
+        """
+        try:
+            return self.dataproxy._get_data(attr)
+        except AttributeError:
+            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
+            return self.dataproxy._get_data(attr)
+
+    def get_datas(self):
+        """
+        Helper function to get the data values from the default view.
+        """
+        try:
+            return self.dataproxy._get_datas()
+        except AttributeError:
+            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr()) 
+            return self.dataproxy._get_datas()
+
+    def get_valueset(self):
+        """
+        Get the ValueSet object for this feature, that has the list of available values.
+        """
+        if self.get_type() == 'boolean':
+            return ValueSet([True, False])
+        elif self.get_type() == 'int':
+            return ValueRange(0, sys.maxint)
+        elif self.get_type() == 'string':
+            return ValueRe('.*')
+        elif self.get_type() in ('selection', 'multiSelection'):
+            values = []
+            for opt in self._objects(type=Option):
+                v = opt.get_value()
+                if v is not None: values.append(v)
+            return ValueSet(values)
+
+    def is_sequence(self):
+        """ Return true if the feature is a sequence or part of a sequence """
+        try:
+            return self._parent.is_sequence()
+        except AttributeError:
+            return False
+
+    def get_sequence_parent(self):
+        """ Try to get a FeatureSequence object for this Feature if it is found """
+        try:
+            return self._parent.get_sequence_parent()
+        except AttributeError:
+            return None
+
+    def getdataproxy(self): 
+        if self._dataproxy == None:
+            self.dataproxy = self.get_default_view().get_feature(self.get_fullfqr())
+        return self._dataproxy
+    def setdataproxy(self, value): self._dataproxy = value
+    def deldataproxy(self): self._dataproxy = None
+    dataproxy = property(getdataproxy, setdataproxy, deldataproxy)
+    value = property(get_value, set_value, del_value)
+
+class FeatureSequence(Feature):
+    POLICY_REPLACE = 0
+    POLICY_APPEND = 1
+    POLICY_PREPEND = 2
+    """
+    A Feature class. Feature is the base for all Configurable items in a Configuration.
+    """
+    dataelem_name = '?datarows'
+    template_name = '?template'
+    def __init__(self, ref="", **kwargs):
+        super(FeatureSequence, self).__init__(ref)
+        self.name = kwargs.get('name', ref)
+        self.type = 'sequence'
+        self.mapKey   = kwargs.get('mapKey')
+        self.mapValue = kwargs.get('mapValue')
+        self._templatedata = None
+
+    def _get_policy(self, data):
+        """
+        parse the policy from a policy string and return a constant
+        @return: POLICY_* constant
+        """
+        try:
+            containerdata = utils.get_list(data._get_parent()._get(data.get_ref()))
+            firstdata = containerdata[0]
+        except AttributeError:
+            firstdata = data
+        
+        if firstdata.policy == 'append':
+            return self.POLICY_APPEND
+        elif firstdata.policy == 'prefix':
+            return self.POLICY_PREPEND
+        elif firstdata == data:
+             # otherwise the policy is either replace or undefined
+             # (firstdata.policy == 'replace' or firstdata.policy == ''):
+            return self.POLICY_REPLACE
+        else:
+            return self.POLICY_APPEND
+        
+    def _set_template_data(self, data=None):
+        """
+        Set the template of the feature sequence  
+        """
+        # If template data is not existing, create it
+        if data != None:
+            self._templatedata = data
+            for feaname in self.list_features():
+                if self._templatedata._has(feaname):
+                    self.get_feature(feaname)._templatedata = self._templatedata._get(feaname)
+                else:
+                    subdata = Data(ref=feaname)
+                    self.get_feature(feaname)._templatedata = subdata
+                    self._templatedata._add(subdata) 
+
+    def _add_datarow(self, dataobj=None, policy=POLICY_APPEND):
+        """
+        Add a feature data row for a new data in this sequence 
+        """
+        if dataobj == None:
+            dataobj = Data(fqr=self.fqr)
+        elif dataobj.attr != 'data':
+            # Add data rows only for data objects (not e.g. RFS)
+            return
+        fea = FeatureSequenceSub(self.dataelem_name)
+        rowproxy = _FeatureDataProxy(fea._name, fea)
+        """ the imaginary features share the parent relation of the proxy objects """
+        self.dataproxy._add(rowproxy, policy)
+        fea._parent = rowproxy._parent
+        rowproxy._add_data(dataobj)
+        """ update the FeatureSequenceSub index from the index number of dataproxy """
+        fea._index = utils.get_list(self.dataproxy._get(self.dataelem_name)).index(rowproxy)
+        # Create a the subfeatures / columns for the parent feature and 
+        # add a data element under each feature.
+        for feaname in self.list_all_features():
+            (pathto_fea, fearef) = utils.dottedref.psplit_ref(feaname)
+            rowproxy.add_feature(FeatureSequenceSub(fearef), pathto_fea)
+            subproxy = rowproxy.get_feature(feaname)
+            subproxy._obj._parent = subproxy._parent 
+            if not dataobj._has(feaname):
+                dataobj._add_to_path(pathto_fea, Data(ref=fearef))
+            subproxy._add_data(dataobj._get(feaname))
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, Feature):
+            self.add_feature(child)
+        elif isinstance(child, Option):
+            self._add(child)
+        elif isinstance(child, Base):
+            self._add(child)
+        else:
+            raise exceptions.IncorrectClassError("Cannot add %s to %s" % (child, self))
+
+    def add_sequence(self, data=None, policy=POLICY_APPEND):
+        """
+        Add a feature data row for a new data in this sequence 
+        """
+        self._add_datarow(None, policy)
+        # set the initial data if it is given
+        rowproxy = utils.get_list(self.dataproxy._get(self.dataelem_name))[-1]
+        if data != None:
+            for index in range(len(data)):
+                rowproxy[index].set_value(data[index])
+        # add the new data sequence/row to the last configuration layer
+        dataobj = rowproxy._get_data()
+        last_config = self.get_root_configuration().get_last_configuration()
+        last_config.add_data(dataobj, container.APPEND)
+        return dataobj
+
+    def set_template(self, data=None):
+        """
+        Set the template of the feature sequence  
+        """
+        # If template data is not existing, create it
+        if self._templatedata == None:
+            self._set_template_data(Data(ref=self.ref, template=True))
+            # Add the template data to parent config
+            pconfig = self.find_parent(type=Configuration)
+            pconfig.add_data(self._templatedata)
+
+        if data != None:
+            templdatas = self._templatedata._objects()
+            for index in range(len(data)):
+                templdatas[index].set_value(data[index])
+
+    def get_template(self):
+        """
+        Add a feature data row for a new data in this sequence 
+        """
+        #self._set_template(None)
+        # set the initial data if it is given
+        if self._templatedata:
+            return [data.get_value() for data in self._templatedata._objects()]
+        else:
+            return None
+
+    def get_data(self):
+        """
+        Helper function to get the topmost data value from the default view.
+        """
+        if self.dataproxy._has(self.dataelem_name):
+            return utils.get_list(self.dataproxy._get(self.dataelem_name))
+        else:
+            return []
+
+    def add_data(self, data):
+        """
+        Add a data value.
+        @param data: A Data object  
+        """
+        # Skip template data adding
+        if data.template:
+            self._set_template_data(data)
+        else:
+            # Get the data index
+            self._add_datarow(data, self._get_policy(data))
+        return
+    
+    def get_map_key(self):
+        """
+        Returns the setting that corresponds to mapKey attribute of this sequence feature.
+        """
+        if self.mapKey != None:
+            mapkey = self.get_feature(self.mapKey)
+            return mapkey
+        else:
+            return None
+
+    def get_map_key_value(self,key):
+        """
+        Returns the setting that corresponds to mapKey attribute of this sequence feature.
+        """
+        value = None
+        if self.mapKey != None and self.mapValue != None:
+            data = self.get_data()
+            for item in data:
+                kv = item.get_feature(self.mapKey).get_value()
+                if kv == key:
+                    value = item.get_feature(self.mapValue).get_value()
+        return value
+
+    def get_map_value(self):
+        """
+        Returns the setting that corresponds to mapValue attribute of this sequence feature.
+        """
+        if self.mapValue != None:
+            mapvalue = self.get_feature(self.mapValue)
+            return mapvalue
+        else:
+            return None
+        
+    def get_value(self, attr=None):
+        """
+        Helper function to get the topmost data value from the default view.
+        """
+        datatable =  self.get_data()
+        rettable = [] 
+        for row in datatable:
+            rowvalues = row.value
+            rettable.append(rowvalues)
+        return rettable
+
+    def set_value(self, value, attr=None):
+        """
+        Set the current value for this feature. Set the value on the topmost layer.
+        @param value: the value to set. The value must be a two dimensional array (e.g. matrix)
+        """
+        # sets the first data element to replace policy
+        try:
+            self.add_sequence(value.pop(0), self.POLICY_REPLACE)
+        # ignore the index error of an empty list
+        except IndexError:
+            pass
+        for row in value:
+            self.add_sequence(row)
+
+    def is_sequence(self):
+        """ Return always true from a sequence object """
+        return True
+
+    def get_sequence_parent(self):
+        """ Return this object as a sequence parent """
+        return self
+
+    value = property(get_value, set_value)
+    data = property(get_data)
+
+class FeatureSequenceCell(Feature):
+    """
+    A Feature class. Feature is the base for all Configurable items in a Configuration.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(Feature, self).__init__(ref)
+        self.name = kwargs.get('name', ref)
+        self.type = 'seqcell'
+ 
+    def get_value(self, attr=None):
+        """
+        Get the current value of the feature
+        @param attr: The attribute name of the data. E.g. attr='data', attr='rfs' 
+        """
+        return self.dataproxy._get_value(attr)
+
+    def set_value(self, value):
+        """
+        Set the current value for this feature. Set the value on the topmost layer.
+        @param value: the value to set
+        """
+        # The sequence cell only updates the latest value in the proxy  
+        self.dataproxy.get_data().set_value(value)
+
+    value = property(get_value, set_value)
+
+class FeatureSequenceSub(Feature):
+    """
+    A Feature class. Feature is the base for all Configurable items in a Configuration.
+    """
+    def __init__(self, ref="", **kwargs):
+        super(Feature, self).__init__(ref)
+        self.name = kwargs.get('name', ref)
+        self.type = 'subseq'
+        self._index = 0
+
+    def get_index(self):
+        """
+        @return : the index of the data element for sequential data defined inside the same configuration.
+        0 for normal data.
+        """
+        return self._index
+
+    def set_value(self, value, attr=None):
+        """
+        Set the current value for this sequence row.
+        @param value: the value row to set
+        """
+        if utils.is_list(value):
+            for subindex in range(0, len(value)):  
+                self.dataproxy[subindex].get_data().set_value(value[subindex])
+        else: 
+            self.dataproxy.get_data().set_value(value)
+
+    def get_value(self, attr=None):
+        """
+        Set the current value for this feature. Set the value on the topmost layer.
+        @param value: the value to set
+        """
+        # dataproxy = self.get_default_view().get_feature(self.get_fullfqr())
+        # The sequence cell only updates the latest value in the proxy
+        childdatas = self.dataproxy._objects()
+        if len(childdatas) > 0:
+            return [subdata.value for subdata in childdatas]
+        else: 
+            return self.dataproxy._get_value(attr=attr)
+
+    value = property(get_value, set_value)
+
+
+class FeatureLink(Base):
+    """
+    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
+    link to the actual Feature object. 
+    """
+    def __init__(self, link="", **kwargs):
+        # Store the fully qualified reference to this object
+        self.link = link
+        ref = link.replace('.', '_')
+        super(FeatureLink, self).__init__(ref)
+        self._obj = None
+        self._populated = False
+
+    @property
+    def fqr(self):
+        return self.link
+
+    def populate(self):
+        """
+        Populate or fetch the link to the actual feature for this featureproxy.
+        This method fetches the feature to the _obj member variable and populates also 
+        subfeatures. 
+        """
+        try:
+            if not self._populated:
+                feas = self.get_default_view().get_features(self.link)
+                # add the found features to the parent
+                for fea in feas:
+                    self._get_parent().add_feature(fea._obj)
+        except exceptions.NotFound, e:
+                parent_view = self._find_parent_or_default(type=View)
+                view_name = parent_view.get_name()
+                logging.getLogger('cone').info("Warning: Feature '%s' in view '%s' not found." % (self.link, view_name))
+
+
+class _FeatureProxy(container.ObjectProxyContainer, Base):
+    """
+    A _FeatureProxy class. _FeatureProxy is the object that is added to View as a 
+    link to the actual Feature object. 
+    """
+    def __init__(self, ref="", obj=None, **kwargs):
+        super(_FeatureProxy, self).__init__(obj, ref)
+        Base.__init__(self, ref)
+        self.support_data = False
+
+    def __getattr__(self, name):
+        """
+        First check if the requested attr is a children then 
+        direct all not found attribute calls to the sub object getattr
+        """
+        try:
+            return self.__dict__['_children'][name] 
+        except KeyError:
+            return getattr(self._obj, name)
+
+    def __getitem__(self, index):
+        return self._objects()[index]
+
+    def __setitem__(self, index, value):
+        raise exceptions.NotSupported()
+
+    def __delitem__(self, index):
+        item = self.__getitem__(index)
+        return self._remove(item.get_ref())
+
+    def __len__(self):
+        return len(self._order)
+
+    def _supported_type(self, obj):
+        if isinstance(obj, _FeatureProxy):
+            return True
+        else:
+            return False
+
+    def _default_object(self, name):
+        return Group(name)
+
+    def _set_parent(self, newparent):
+        """
+        @param newparent:  The new parent object
+        @return: None
+        """
+        self._parent = newparent
+
+    def add_feature(self, feature, path=""):
+        """
+        """
+        if not isinstance(feature, Feature):
+            raise exceptions.IncorrectClassError("add_feature requires instance of Feature!! Given %s" % feature)
+        if not self.support_data:
+            self._add_to_path(path, _FeatureProxy(feature._name, feature))
+        else:
+            self._add_to_path(path, _FeatureDataProxy(feature._name, feature))
+
+    def remove_feature(self, ref):
+        """
+        remove a given feature from this view by reference. 
+        @param ref: 
+        """
+        self._remove(ref)
+
+    def get_feature(self, path):
+        """
+        @param path: The path (ref) to the given feature 
+        """
+        return self._get(path)
+
+    def list_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return self._list()
+
+    def list_all_features(self):
+        """
+        Return a array of all Feature children references under this object.
+        """
+        return [fea._path(self) for fea in self._traverse(type=_FeatureProxy)]
+
+    def populate(self):
+        """
+        Dummy implementation of populate
+        """
+        pass
+
+
+class _FeatureDataProxy(_FeatureProxy):
+    """
+    A Feature class. Feature is the base for all Configurable items in a Configuration.
+    """
+    DEFAULT_KEY = 'data'
+    def __init__(self, ref="", obj=None, **kwargs):
+        # Initialize _obj to None, because __getattr__(), __setattr__()
+        # and __delattr__() access it.
+        # Note that we cannot use self._obj = None here, since that would
+        # invoke __setattr__(), causing a kind of a chicken-and-egg problem
+        object.__setattr__(self, '_obj', None)
+        
+        super(_FeatureDataProxy, self).__init__(ref, obj)
+        self.support_data = True
+        """ Create the data container of all types of data. Add the key for the default key. """
+        
+        self.defaultkey = _FeatureDataProxy.DEFAULT_KEY
+        self.datas = {self.defaultkey : []}
+
+    def __getattr__(self, name):
+        """
+        """
+        if object.__getattribute__(self, '_obj') is not None:
+            self._obj.dataproxy = self
+        
+        if name in Feature.PROPERTIES:
+            return getattr(self._obj, name)
+        else:
+            return super(_FeatureDataProxy, self).__getattr__(name)
+    
+    def __setattr__(self, name, value):
+        """
+        """
+        if object.__getattribute__(self, '_obj') is not None:
+            self._obj.dataproxy = self
+            
+        if name in Feature.PROPERTIES:
+            return setattr(self._obj, name, value)
+        else:
+            super(_FeatureDataProxy, self).__setattr__(name, value)
+
+    def __delattr__(self, name):
+        """
+        """
+        if name in Feature.PROPERTIES:
+            return delattr(self._obj, name)
+        else:
+            return super(_FeatureDataProxy, self).__delattr__(name)
+
+    def _add_data(self, data):
+        """
+        Add a data value.
+        @param data: A Data object  
+        """
+        try:
+            self.datas[data.attr].append(data)
+        except KeyError:
+            """ Create a list object for missing attribute """ 
+            self.datas[data.attr] = []
+            self.datas[data.attr].append(data)
+
+    def _get_data(self, attr=None):
+        """
+        Get the data value. in sequence setting cases returns an array of data.
+        """
+        dataattr = attr or self.defaultkey
+        try:
+            if len(self.datas[dataattr]) > 0:
+                return self.datas[dataattr][-1]
+            else:
+                return None
+        except KeyError:
+            """ return None for missing attribute """ 
+            return None
+
+    def _get_datas(self, attr=None):
+        """
+        Get the entire data array.
+        """
+        dataattr = attr or self.defaultkey
+        return self.datas[dataattr]
+
+    def _get_value(self, attr=None):
+        """
+        Get the topmost data value.
+        """
+        if self._get_data(attr):
+            return self._get_data(attr).get_value()
+        else:
+            return None
+
+    def _set_value(self, datavalue, attr=None):
+        """
+        Set the value for the feature the last configuration in the current hierarchy
+        @param value: The value for the feature.
+        @return: The created Data object.  
+        """
+        # Make sure that data value exists only once the the last configuration layer
+        # So if last_data exists on last layer, update the value of that data element.
+        # otherwise create a new data elem to the topmost layer
+        dataobj = self._get_data(attr)
+        last_config = self.get_root_configuration().get_last_configuration()
+        if dataobj and dataobj.find_parent(type=Configuration) == last_config:
+            dataobj.set_value(datavalue)
+        else:
+            dataobj = Data(fqr=self.fqr, value=datavalue, attr=attr)
+            last_config.add_data(dataobj)
+            self._add_data(dataobj)
+        return dataobj
+
+    def _del_value(self, attr=None):
+        """
+        Remove the 
+        """
+        data = self._get_data(attr)
+        if data:
+            dataattr = attr or self.defaultkey
+            parentconfig = data.find_parent(type=Configuration)
+            if parentconfig:
+                parentconfig.remove_data(data.get_fullfqr())
+            del self.datas[dataattr][-1]
+
+    def _get_values(self, attr=None):
+        """
+        Get the topmost data value.
+        """
+        dataattr = attr or self.defaultkey
+        return [dataelem.get_value() for dataelem in self.datas[dataattr]]
+
+
+class DataBase(Base):
+    def __init__(self, ref="", **kwargs):
+        super(DataBase, self).__init__(ref, **kwargs)
+
+    def _supported_type(self, obj):
+        if isinstance(obj, (DataContainer, DataBase)):
+            return True
+        else:
+            return False
+
+    def _default_object(self, name):
+        return Data(ref=name)
+
+    def count(self):
+        return len(self._objects())
+
+    def add(self, child, policy=container.REPLACE):
+        """
+        A generic add function to add child objects. The function is intended to act as
+        proxy function that call the correct add function based on the child objects class.
+        
+        Example: obj.add(Feature("test")), actually obj.add_feature(Feature("test"))
+        @param child: the child object to add
+        @raise IncorrectClassError: if the given class cannot be added to this object.  
+        """
+        if isinstance(child, (Data)):
+                self._add(child, container.APPEND)
+        else:
+            raise exceptions.IncorrectClassError("Cannot add %s object to %s" % (child, self))
+
+
+class DataContainer(DataBase):
+    def __init__(self, ref="", **kwargs):
+        super(DataContainer, self).__init__(ref, **kwargs)
+
+
+class Data(DataBase):
+    """
+    The data element can contain any data setting for a feature. The data element can be 
+    a value definition for any type of data. It basically just links some data to a feature. 
+    The default Data attribute is 'data', but it can be any string. For example current use case 
+    is 'rfs'.
+    """
+    def __init__(self, **kwargs):
+        """
+        @param ref: the reference to the feature. E.g. foo
+        @param fqr: the full reference to the feature. E.g. 'foo.bar' 
+        @param value: the value of the data
+        @param attr: the attribute which the Data object defines. e.g. default is 'data'. But could be 
+        for example 'rfs'
+        """
+        name = kwargs.get('ref', '')
+        self.fearef = kwargs.get('fqr', None)
+        if self.fearef:
+            (namespace, name) = utils.dottedref.psplit_ref(self.fearef)
+        super(Data, self).__init__(name)
+        self.value  = kwargs.get('value', None)
+        self.attr   = kwargs.get('attr') or 'data'
+        self.policy = kwargs.get('policy', '')
+        self.template = kwargs.get('template', False)
+        self.map    = kwargs.get('map')
+
+    def get_fearef(self):
+        if self.fearef:
+            return self.fearef
+        else:
+            return self.fqr
+
+    def get_value(self):
+        if self.map != None:
+            ref = utils.resourceref.to_dref(self.get_map_ref())
+            key = self.get_map_key_value()
+            dview = self.get_root_configuration().get_default_view()
+            fea = dview.get_feature(ref)
+            return fea.get_map_key_value(key)
+        else:
+            return self.value
+
+    def get_map(self):
+        return self.map
+
+    def set_map(self, map):
+        self.map = map
+        if self.value:
+            #Either value or mapping can be defined. Not both.
+            self.value = None
+
+    def get_map_ref(self):
+        if self.map != None:
+            return utils.DataMapRef.get_feature_ref(self.map)
+        else:
+            return None
+
+    def get_map_key_value(self):
+        if self.map != None:
+            return utils.DataMapRef.get_key_value(self.map)
+        else:
+            return None
+
+    def set_value(self, value):
+        self.value = value
+        if self.map:
+            #Either value or mapping can be defined. Not both.
+            self.map = None
+
+    def get_policy(self): return self._policy
+    def set_policy(self, value): self._policy = value
+    def del_policy(self):  self._policy = None
+    policy = property(get_policy, set_policy, del_policy)
+
+
+class ValueSet(sets.Set):
+    """
+    A value set object to indicate a set of possible values for a feature. 
+    e.g. A boolean feature ValueSet([True, False])
+    """
+    def __init__(self, initial_set=None):
+        super(ValueSet, self).__init__(initial_set or [])
+
+
+class ValueRange(object):
+    """
+    """
+    def __init__(self, fromvalue, tovalue, step=1):
+        self.fromvalue = fromvalue
+        self.tovalue = tovalue
+        self.step = step
+
+    def __contains__(self, value):
+        return self.fromvalue <= value and value <= self.tovalue and (value-self.fromvalue) % self.step == 0
+
+
+class ValueRe(object):
+    """
+    """
+    def __init__(self, regexp):
+        self.regexp = re.compile(regexp)
+
+    def __contains__(self, value):
+        if isinstance(value, str):
+            return self.regexp.match(value)
+        else:
+            return False
+    
+
+class Option(Base):
+    """
+    Confml option class.
+    """
+    def __init__(self, name, value, **kwargs):
+        super(Option, self).__init__(Option.to_optref(value, kwargs.get('map', None)))
+        self.name = name
+        self.value = value
+        self.map = kwargs.get('map', None)
+        self.relevant = kwargs.get('relevant', None)
+
+    @classmethod
+    def to_optref(cls, value, map):
+        """ 
+        @return: An option reference converted from value or map, depending
+            on which one is not None.
+        """
+        if value is not None:
+            return "opt_value_%s" % value.replace('.', '').replace('/', '').replace(' ', '')
+        elif map is not None:
+            return "opt_map_%s" % map.replace('.', '').replace('/', '').replace(' ', '')
+        else:
+            raise ValueError("Both value and map are None!")
+
+    def get_name(self):
+        return self.name
+
+    def get_value(self):
+        return self.value
+
+    def __cmp__(self, other):
+        try:
+            ref = getattr(other, 'ref')
+        except AttributeError:
+            ref = other
+        if self.ref < ref:
+            return -1
+        elif self.ref == ref:
+            return 0
+        else:
+            return 1
+
+
+class Storage(object):
+    """
+    A general base class for all storage type classes
+    """
+    """ File open modes """ 
+    MODE_UNKNOWN= -1
+    MODE_READ   = 1
+    MODE_WRITE  = 2
+    MODE_APPEND = 3
+    MODE_DELETE = 4
+
+    def __init__(self, path):
+        """
+        @param path: the reference to the root of the storage.
+        """
+        self.rootpath = path
+        self.curpath = ""
+        self.container = True
+        self.__opened_res__ = {}
+
+    def __opened__(self, res):
+        """
+        Internal function to add a newly opened Resource object to the list of open resources.
+        @param res: The resource object 
+        """
+        if self.__opened_res__.has_key(res.path):
+            self.__opened_res__[res.path].append(res)
+        else:
+            self.__opened_res__[res.path] = [res]
+
+    def __closed__(self, res):
+        """
+        Internal function to remove a Resource object from the list of open resources.
+        @param res: The resource object to remove
+        @raise StorageException if the given resource object is not found: 
+        """
+        try:
+            self.__opened_res__[res.path].remove(res)
+            if len(self.__opened_res__[res.path]) == 0:
+                del self.__opened_res__[res.path]
+        except KeyError, e:
+            raise exceptions.StorageException("No such %s open resource! %s" % (res, e))
+
+    def __has_open__(self, ref):
+        """
+        Internal function to find out if any Resource objects are open from given ref.
+        @param ref: The resource ref
+        @return: True if resources found. Otherwise False.   
+        """
+        return self.__opened_res__.has_key(ref)
+
+    def __get_open__(self, path):
+        """
+        Internal function to get all resource opened on a certain ref .
+        @param ref: The resource ref
+        @return: A list of open resources. Empty list if nothing is found   
+        """
+        if self.__has_open__(path):
+            # return a copy of currently open resources
+            return self.__opened_res__[path][:]
+        else:
+            return []
+
+    def __has_resource__(self, res):
+        """
+        Internal function to find out if the given Resource objects is open in this storage.
+        @param ref: The resource object
+        @return: True if resources found. Otherwise False.   
+        """
+        try:
+            res = self.__opened_res__[res.path].index(res)
+            return True
+        except KeyError, e:
+            return False
+
+    @classmethod
+    def open(cls,path, mode="r", **kwargs):
+        """
+        Class method for opening an instance of Storage
+        @param path: path to storage, which will determine what type of storage is initiated. 
+        """
+        # import all storage instances
+        from cone.storage import storages
+        for storagename in storages:
+            storagemodule = 'cone.storage.'+storagename
+            module = __import__(storagemodule)
+        for storage_class in utils.all_subclasses(Storage):
+            if storage_class.supported_storage(path):
+                if hasattr(storage_class, '__open__'):
+                    return storage_class.__open__(path, mode, **kwargs)
+                else:
+                    return storage_class(path, mode, **kwargs)
+        
+        obj = Storage(path)
+        return obj
+
+    @classmethod
+    def supported_storage(cls, path):
+        """
+        Class method for determing if the given clas supports a storage by given path. 
+        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
+        @param path:
+        @return: Boolean value. True if the storage of the path is supported. False if not.  
+        """
+        return False
+
+    def set_path(self, path):
+        """
+        """
+        self.rootpath = path
+
+    def get_path(self):
+        """
+        """
+        return self.rootpath
+
+    def set_current_path(self, path):
+        """
+        @param path: the current path under the Storage. 
+        """
+        self.curpath = utils.resourceref.remove_end_slash(utils.resourceref.remove_begin_slash(path))
+
+    def get_current_path(self):
+        """
+        get the current path under the Storage. 
+        """
+        return self.curpath
+
+    def close(self):
+        """
+        Close the repository, which will save and close all open resources.  
+        """
+        for openref in self.__opened_res__.keys():
+            for res in self.__get_open__(openref):
+                self.close_resource(res)
+
+    def save(self):
+        """
+        Flush changes from all resources to the repository.  
+        """        
+        for openref in self.__opened_res__.keys():
+            for res in self.__get_open__(openref):
+                self.save_resource(res)
+
+    def open_resource(self, path, mode="r"):
+        """
+        Open the given resource and return a File object.
+        @param path : reference to the resource 
+        @param mode : the mode in which to open. Can be one of r = read, w = write, a = append.
+        raises a NotResource exception if the ref item is not a resource.
+        """  
+        raise exceptions.NotSupportedException()
+
+    def delete_resource(self, path):
+        """
+        Delete the given resource from storage
+        @param path: reference to the resource 
+        raises a NotSupportedException exception if delete operation is not supported by the storage
+        """  
+        raise exceptions.NotSupportedException()
+
+    def close_resource(self, path):
+        """
+        Close a given resource instance. Normally this is called by the Resource object 
+        in its own close.
+        @param path the reference to the resource to close. 
+        """
+        raise exceptions.NotSupportedException()
+
+    def is_resource(self, path):
+        """
+        Return true if the ref is a resource
+        @param ref : reference to path where resources are searched
+        """
+        raise exceptions.NotSupportedException()
+
+    def list_resources(self, path, recurse=False):
+        """
+        find the resources under certain ref/path 
+        @param ref : reference to path where resources are searched
+        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
+        Default value is False. Set to True to enable recursion.
+        """  
+        return []
+
+    def import_resources(self, paths, storage):
+        """
+        import resources from a list of resources to this storage
+        @param paths : a list of Resourse objects.
+        @param storage : the external storage from which files are imported.
+        """  
+        raise exceptions.NotSupportedException()
+
+    def export_resources(self, paths, storage):
+        """
+        export resources from this storage based on a list of reference to this storage
+        @param path : a list of resource paths in this storage (references).
+        @param storage : the external storage where to export.
+        """  
+        raise exceptions.NotSupportedException()
+
+    def close_resource(self, path):
+        """
+        Close a given resource instance. Normally this is called by the Resource object 
+        in its own close.
+        @param ref the reference to the resource to close. 
+        """
+        raise exceptions.NotSupportedException()
+
+    def save_resource(self, path):
+        """
+        Flush the changes of a given resource instance. Normally this is called by the Resource object 
+        in its own save.
+        @param ref the reference to the resource to close. 
+        """
+        raise exceptions.NotSupportedException()
+
+    def create_folder(self, path):
+        """
+        Create a folder entry to a path
+        @param path : path to the folder
+        """  
+        raise exceptions.NotSupportedException()
+
+    def delete_folder(self, path):
+        """
+        Delete a folder entry from a path. The path must be empty.
+        @param path : path to the folder
+        """  
+        raise exceptions.NotSupportedException()
+
+    def is_folder(self, path):
+        """
+        Check if the given path is an existing folder in the storage
+        @param path : path to the folder
+        """
+        raise exceptions.NotSupportedException()
+
+    def get_mode(self, mode_str):
+        if mode_str.find("w") != -1: 
+            return self.MODE_WRITE
+        elif mode_str.find("r") != -1:
+            return self.MODE_READ
+        elif mode_str.find("a") != -1:
+            return self.MODE_APPEND
+        elif mode_str.find("d") != -1:
+            return self.MODE_DELETE
+        else:
+            return self.MODE_UNKNOWN
+
+    def unload(self, path, object):
+        """
+        Dump a given object to the storage 
+        @param object: The object to dump to the storage, which is expected to be an instance 
+        of Base class.
+        @param path: The reference where to store the object 
+        @param object: The object instance to dump 
+        @raise StorageException: if the given object cannot be dumped to this storage 
+        """
+        raise exceptions.NotSupportedException()
+
+    def load(self, path):
+        """
+        Load an object from a reference.
+        @param path: The reference where to load the object 
+        @raise StorageException: if the given object cannot be loaded as an object from this storage 
+        """
+        raise exceptions.NotSupportedException()
+
+    path = property(get_path, set_path)
+
+class Resource(object):
+    STATE_OPEN = 0
+    STATE_CLOSE = 1
+    def __init__(self, storage, path, mode=Storage.MODE_READ):
+        self.storage = storage
+        self.path = path
+        self.mode = mode
+        self.state = Resource.STATE_OPEN
+        self.content_info = None
+
+    def get_path(self):
+        return self.path
+
+    def close(self):
+        """
+        Close the resource. 
+        Note1: the resource object cannot be accessed anymore after it has been closed.
+        Note2: the changes are not automatically saved. The save operation must be explicitly called, 
+        to save data. 
+        """
+        self.storage.close_resource(self.path)
+        self.state = Resource.STATE_OPEN
+
+    def read(self, bytes=0):
+        """
+        Read data.
+        """
+        raise exceptions.NotSupportedException()
+
+    def write(self, string):
+        """
+        Write data.
+        """
+        raise exceptions.NotSupportedException()
+
+    def truncate(self, size=0):
+        """
+        Trunkate this resource data to the given size.
+        @param size: The size to trunkate. Default value is zero, which make the resource empty. 
+        """
+        raise NotSupportedException()
+
+    def save(self, size=0):
+        """
+        Save all changes to data to storage.
+        """
+        raise NotSupportedException()
+
+    def get_mode(self):
+        return self.storage.get_mode(self.mode)
+    
+    def get_size(self):
+        """
+        Return the size of this resource in bytes.
+        
+        Note that this does not work in write mode.
+        @return: The resource size in bytes:
+        @raise exceptions.StorageException: The resource was opened in write mode.
+        """
+        raise exceptions.NotSupportedException()
+    
+    def get_content_info(self):
+        """
+        Return the ContentInfo class that contains content information about
+        resource.
+        """
+        raise exceptions.NotSupportedException()
+        
+class ContentInfo(object):
+    """
+    A ContentInfo object is used to describe content of Resource. 
+    """
+    logger = logging.getLogger('cone.contentinfo')
+
+    
+    def __init__(self, mimetype, mimesubtype):
+        #: MIME Media type (http://www.iana.org/assignments/media-types/)
+        #: as a string. E.g. 'image' or 'application'
+        self.mimetype = mimetype
+        #: MIME Media subtype as a string. E.g. 'svg+xml' or 'bmp'.
+        self.mimesubtype = mimesubtype
+    
+    @property
+    def content_type(self):
+        """
+        Returns MIME Media type (http://www.iana.org/assignments/media-types/) 
+        and subtype as a string. E.g. 'image/bmp'. 
+        """
+        return self.mimetype + '/' + self.mimesubtype
+
+class ImageContentInfo(ContentInfo):
+    
+    """
+    A ImageContentInfo object is used to describe content of image Resources.
+    """
+    def __init__(self):
+        ContentInfo.__init__(self, 'image', '')
+
+class BmpImageContentInfo(ImageContentInfo):
+    """
+    A BmpImageContentInfo object is used to describe content of bmp image 
+    Resources.
+    """
+    
+    _BMP_BITS_PER_PIXEL_OFFSET_ = int('0x1C', 16)
+    
+    def __init__(self, resource, data):
+        ContentInfo.__init__(self, 'image', 'bmp')
+        
+        #: Color depth as bits per pixel.
+        self.color_depth = None
+        if (resource != None):
+            try:
+                self.color_depth = ord(data[self._BMP_BITS_PER_PIXEL_OFFSET_])
+            except Exception, e:
+                self.logger.warning("Invalid BMP-file: %s" % resource.get_path())
+        
+class Folder(object):
+    """
+    A Folder object is a subfolder of a Storage, offering access to part of the Storages resources.
+    """
+    def __init__(self, storage, path):
+        """
+        Create a layer folder to the storage if it does not exist.
+        """
+        #if not storage.is_folder(path):
+        #    storage.create_folder(path)
+        self.storage = copy.copy(storage)
+        self.storage.set_current_path(path)
+
+    def __getattr__(self, name):
+        return getattr(self.storage, name)
+
+class CompositeLayer(object):
+    """
+    A base class for composite Configuration objects.  
+    """
+    def __init__(self, path="", **kwargs):
+        self.layers = kwargs.get('layers', [])
+        self.path = path
+
+    def add_layer(self, layer):
+        self.layers.append(layer)
+
+    def remove_layer(self, path):
+        if self.get_layer(path):
+            self.layers.remove(self.get_layer(path))
+        else:
+            raise exceptions.NotFound('Layer with given path %s not found!' % path)
+
+    def get_layer(self, path):
+        for layer in self.layers:
+            if layer.get_current_path() == path:
+                return layer
+        return None
+
+    def list_layers(self):
+        return [layer.get_current_path() for layer in self.layers]
+
+    def list_confml(self):
+        """
+        @return: array of confml file references.
+        """
+        lres = []
+        for layerpath in self.list_layers():
+            for respath in self.get_layer(layerpath).list_confml():
+                lres.append(utils.resourceref.join_refs([layerpath, respath]))
+        return lres
+
+    def list_implml(self):
+        """
+        @return: array of implml file references.
+        """
+        lres = []
+        for layerpath in self.list_layers():
+            for respath in self.get_layer(layerpath).list_implml():
+                lres.append(utils.resourceref.join_refs([layerpath, respath]))
+        return lres
+
+    def list_content(self):
+        """
+        @return: array of content file references.
+        """
+        lres = []
+        for layerpath in self.list_layers():
+            for respath in self.get_layer(layerpath).list_content():
+                lres.append(utils.resourceref.join_refs([layerpath, respath]))
+        return lres
+
+    def list_doc(self):
+        """
+        @return: array of document file references.
+        """
+        lres = []
+        for layerpath in self.list_layers():
+            for respath in self.get_layer(layerpath).list_doc():
+                lres.append(utils.resourceref.join_refs([layerpath, respath]))
+        return lres
+
+    def list_all_resources(self, empty_folders=False):
+        """
+        Returns a list of all layer related resource paths with full path in the storage.
+        """
+        lres = []
+        for layerpath in self.list_layers():
+            sublayer = self.get_layer(layerpath)
+            for respath in sublayer.list_all_resources(empty_folders):
+                lres.append(utils.resourceref.join_refs([layerpath, respath]))
+                
+        return lres
+
+class Layer(CompositeLayer):
+    """
+    A Layer object is a subfolder of a Storage, offering access to part of the Storages resources.
+    """
+    def __init__(self, storage, path, **kwargs):
+        """
+        Create a layer folder to the storage if it does not exist.
+        @param storage: a reference to the Storage object
+        @param path: path for the layer 
+        @param confml_path: optional parameter for confml files path (give in confml_path="something") 
+        @param imlpml_path: optional parameter for implml files path (give in implml_path="something")
+        @param content_path: optional parameter for content files path (give in content_path="something")
+        @param doc_path: optional parameter for doc files path (give in doc_path="something")
+        """
+        super(Layer, self).__init__(path, **kwargs)
+        #if not storage.is_folder(path):
+        #    storage.create_folder(path)
+        self.storage = copy.copy(storage)
+        self.storage.set_current_path(path)
+        self.predefined = {'confml_path' : 'confml', 
+                           'implml_path' : 'implml', 
+                           'content_path' : 'content', 
+                           'doc_path' : 'doc'}
+        # list through all "hardcoded" paths and check whether the 
+        # hardcoded or given path exists under this Layer. 
+        # if it does then create a folder instance to that path 
+        for (pretag, prevalue) in self.predefined.items():
+            self.predefined[pretag] = kwargs.get(pretag, prevalue)
+
+    def __getattr__(self, name):
+        return getattr(self.storage, name)
+
+    def list_confml(self):
+        """
+        @return: array of confml file references.
+        """
+        res = self.storage.list_resources(self.predefined['confml_path'], True)
+        res += super(Layer, self).list_confml()
+        return res 
+
+    def list_implml(self):
+        """
+        @return: array of implml file references.
+        """
+        res = self.storage.list_resources(self.predefined['implml_path'], True)
+        res += super(Layer, self).list_implml()
+        return res 
+
+    def list_content(self):
+        """
+        @return: array of content file references.
+        """
+        res = self.storage.list_resources(self.predefined['content_path'], True)
+        res += super(Layer, self).list_content()
+        return res
+
+    def list_doc(self):
+        """
+        @return: array of document file references.
+        """
+        res = self.storage.list_resources(self.predefined['doc_path'], True)
+        res += super(Layer, self).list_doc()
+        return res
+
+    def confml_folder(self):
+        cpath = self.storage.get_current_path()
+        spath = self.predefined['confml_path']
+        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
+
+    def implml_folder(self):
+        cpath = self.storage.get_current_path()
+        spath = self.predefined['implml_path']
+        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
+
+    def content_folder(self):
+        cpath = self.storage.get_current_path()
+        spath = self.predefined['content_path']
+        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
+
+    def doc_folder(self):
+        cpath = self.storage.get_current_path()
+        spath = self.predefined['doc_path']
+        return Folder(self.storage,  utils.resourceref.join_refs([cpath, spath]))
+
+    def list_all_resources(self, empty_folders=False):
+        """
+        Returns a list of all layer related resource paths with full path in the storage.
+        """
+        lres = []
+        mypath = self.get_current_path()
+        
+        for folderpath in sorted(self.predefined.values()):
+            lres += self.storage.list_resources(folderpath, recurse=True, empty_folders=empty_folders)
+                 
+        lres += super(Layer, self).list_all_resources(empty_folders)
+        
+        return lres
+
+    def list_all_related(self, empty_folders=False):
+        """
+        Returns a list of all (non confml) layer related resource paths with full path in the storage.
+        """
+        lres = []
+        predef = self.predefined.copy()
+        del predef['confml_path']
+        mypath = self.get_current_path()
+        for folderpath in sorted(predef.values()):
+            lres += self.storage.list_resources(folderpath, recurse=True, empty_folders=empty_folders)
+        lres += super(Layer, self).list_all_resources(empty_folders=empty_folders)
+       
+        return lres
+
+
+class Rule(object):
+    """
+    Base class for Rules in the system.
+    """
+    def __init__(self):
+        raise exceptions.NotSupportedException()
+            
+
+class FactoryBase(object):
+    pass
+
+class Factory(object):
+    def __getattr__(self, name):
+        """
+        The Factory getattr find all subclasses for the Factory and searches for given attr 
+        in those.
+        """
+        for sub_factory in utils.all_subclasses(FactoryBase):
+            try:
+                return getattr(sub_factory(), name)
+            except AttributeError:
+                continue 
+        raise AttributeError("type object %s has no attribute '%s'" % (self.__class__, name))
+
+def get_mapper(modelname):
+    """
+    Return a instance of appropriate mapper for given model.
+    """
+    mapmodule = __import__('cone.public.mapping')
+    return mapmodule.public.mapping.BaseMapper()
+
+
+##################################################################
+class NullHandler(logging.Handler):
+    """
+    Default handler that does not do anything.
+    """
+    def emit(self, record):
+        pass
+
+#Initialization of default logger that contains NullHandler.
+logger = logging.getLogger('cone')
+logger.addHandler(NullHandler())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/container.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,794 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Container classes.
+Mainly internal classed that the public data model uses internally.
+"""
+
+import re
+import pickle
+import logging
+import utils, exceptions
+
+def object_container_filter(obj,**kwargs):
+    """ Create a list of filter functions for each argument """ 
+    filters=[]
+    if kwargs.has_key('name'):
+        filters.append(lambda x: re.match(kwargs.get('name'), x._name))
+    if kwargs.has_key('path'):
+        filters.append(lambda x: re.match(kwargs.get('path'), x._path()))
+    if kwargs.has_key('type'):
+        filters.append(lambda x: isinstance(x, kwargs.get('type')))
+    if kwargs.has_key('filters'):
+        filters += kwargs.get('filters')
+    ret = []
+    for sobj in utils.get_list(obj):
+        if utils.filter(obj,filters):
+            ret.append(sobj)
+        
+    return ret
+
+def _apply_filter(obj,filters):
+    """ Create a list of filter functions for each argument """ 
+    if utils.filter(obj,filters):
+        return [obj]
+    else:
+        return []
+
+""" object container adding policies """
+REPLACE = 0
+APPEND = 1
+PREPEND = 2
+ERROR = 3
+
+class DataContainer(object):
+    """
+    Class for data containers. 
+    Container is a data storage that can hold several keys, where each key is unique. Each key however 
+    can hold several values, where the active value is the last one added. 
+    
+    Example:
+    data = {'key1' :[1,2,3,4], 
+            'key2' :['foo','bar],
+            'key3' :['testing'],
+            'path/to/key' :['some','value','in','here','too']}
+    
+    The active values for keys are the last ones in the array. E.g. key1 = 4.
+    """
+    def __init__(self):
+        self.data = {}
+        
+    def list_keys(self):
+        """
+        List all keys of the DataStorage.
+        """
+        return self.data.keys()
+    
+    def add_value(self,key,value):
+        """
+        Add the value as a topmost item for the given key.
+        @param key: name for the key to store the data.
+        @param value: the value to store.  
+        """
+        if self.data.has_key(key):
+            self.data[key].append(value)
+        else:
+            self.data[key] = [value]
+        return
+    
+    def remove_value(self,key,value):
+        """
+        remove individual value of the key value array
+        """
+        self.data[key].remove(value)
+        return 
+    
+    def remove_key(self,key):
+        del self.data[key]
+        return
+    
+    def get_value(self,key):
+        """
+        self.data = {'key1' :[1,2,3,4], 
+                    'key2' :['foo','bar],
+                    'key3' :['testing'],
+                    'path/to/key' :['some','value','in','here','too']}
+        self.get_value('key1')
+        4
+        """
+        return self.data[key][-1]
+        
+    def get_values(self,key):
+        """
+        return a copy of data values inside the container
+        """
+        values = []
+        values.extend(self.data[key])
+        return values
+
+    def flatten(self):
+        """
+        return a new dictionary of the DataContainer data with only single values for each key, 
+        instead of the array of values.
+        """
+        rest = {}
+        for key in self.data.keys():
+            rest[key] = self.get_value(key)
+        return rest
+
+    def clear(self):
+        """
+        Remove all data from the container.
+        """
+        return self.data.clear()
+
+class ContainerBase(object):
+    
+    def _set_parent(self, newparent):
+        """
+        @param newparent:  The new parent object
+        @return: None
+        """
+        self._parent = newparent
+
+    def _get_parent(self):
+        """
+        @return: existing parent object
+        """
+        return self._parent
+    
+    def _del_parent(self):
+        """
+        Set the current parent to None
+        """
+        self._parent = None
+
+    parent = property(_get_parent, _set_parent,_del_parent)
+
+
+class ObjectProxy(ContainerBase):
+    """
+    An object proxy class. The ObjectProxy overrides the python builtin methdo __getattr__
+    to redirect any function/member access to the subobject.  
+    """
+    def __init__(self,obj=None):
+        """
+        """
+        self._obj  = obj
+        self._parent = None
+    
+    def __getattr__(self,name):
+        """
+        direct all not found attribute calls to the sub object getattr
+        """
+        return getattr(self._obj,name)
+
+    
+#    def _set_parent(self, newparent):
+#        """
+#        @param newparent:  The new parent object
+#        @return: None
+#        """
+#        self._parent = newparent
+#        if isinstance(self._obj, ContainerBase):
+#            self._obj._set_parent(newparent)
+
+class LoadInterface(ContainerBase):
+    def load(self,ref):
+        file = open(ref,"r")
+        self._parent = None
+        return pickle.load(file)
+
+    def unload(self,ref, obj):
+        """
+        unload or release
+        """
+        file = open(ref,"w")
+        pickle.dump(obj,file)
+        file.close()
+
+    def get_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        return ""
+
+class LoadProxy(ContainerBase):
+    """
+    This class is meant for loading & unloading an object, when it need.
+    """
+    def __init__(self, path, store_interface=None):
+        """
+        @param path: the path which is used in loadin
+        @param store_interface: the loading interface object, which is used. 
+        Expects load(path) and dump(obj) functions  
+        """
+        self.set('_obj', None)
+        self.set('_parent', None)
+        self.set('path', path)
+        self.set('_storeint', store_interface)
+
+    def __getattr__(self,name):
+        """
+        direct all not found attribute calls to the sub object getattr
+        """
+        if not self._obj: 
+            self._load()
+        return getattr(self._obj,name)
+
+    def __setattr__(self, name, value):
+        """
+        direct attribute setting calls to the sub object setattr
+        """
+        if not self._obj: 
+            self._load()
+        setattr(self._obj,name,value)
+
+    def __delattr__(self, name):
+        """
+        direct attribute setting calls to the sub object setattr
+        """
+        if not self._obj: 
+            self._load()
+        delattr(self._obj,name)
+
+    def _set_parent(self, newparent):
+        """
+        @param newparent:  The new parent object
+        @return: None
+        """
+        self.set('_parent',newparent)
+        if self._obj:
+            self._obj._parent = self._parent
+
+    def _set_obj(self, obj):
+        self.set('_obj',obj)
+        # set the same _parent for the actual object as is stored for the proxy
+        self._obj._parent = self._parent
+        self._obj.set_path(self.path)
+
+    def _get_obj(self):
+        if not self._obj: 
+            self._load()
+        return self._obj
+
+    def _load(self):
+        # Should the loading of layer external resources be supported?
+        # E.g. resources with absolute path relative to the storage (starts with slash)
+        """ If the loading of the object fails => Raise an InvalidObject exception """ 
+        try:
+            obj = self._store_interface().load(self.fullpath)
+            self._set_obj(obj)
+            obj.set_ref(utils.resourceref.to_objref(self.path))
+        except exceptions.NotResource,e:
+            logging.getLogger('cone').warning("Loading %s from parent %s failed! %s" % (self.path,self.get_parent_path(), e))
+            raise exceptions.InvalidObject("Invalid configuration object %s" % self.path)
+
+    def _unload(self):
+        if self._obj:
+            self._store_interface().unload(self.fullpath, self._obj)
+            self.set('_obj',None)
+
+    def _store_interface(self):
+        if not self._storeint:
+            self.set('_storeint',self._parent.get_project())
+        return self._storeint
+
+    def set(self,name,value):
+        """
+        Proxy has a specific attribute setting function, because by default all attributes are 
+        stored to the actual proxy object  
+        """
+        self.__dict__[name] = value
+
+    def get(self,name):
+        """
+        Proxy has also a specific attribute getting function, because by default all attributes are 
+        stored to the actual proxy object  
+        """
+        return self.__dict__[name]
+
+    def save(self):
+        if hasattr(self._obj,'save'):
+            self._obj.save()
+        self._unload()
+
+    def close(self):
+        if hasattr(self._obj,'close'):
+            self._obj.close()
+
+    def get_parent_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        if self._parent:
+            return utils.resourceref.get_path(self._parent.get_path())
+        else:
+            return ""
+
+    def get_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        if self._obj:
+            return self._obj.get_path()
+        else:
+            return self.path
+
+    @property
+    def fullpath(self):
+        """
+        Return the path of the configuration resource
+        """
+        try:
+            return self._obj.get_full_path() 
+        except AttributeError:
+            parent_path = self.get_parent_path() 
+            return utils.resourceref.join_refs([parent_path,self.path])
+
+class ObjectContainer(ContainerBase):
+    """
+    An object container class. The ObjectContainer is actually a Tree data structure. Any ObjectContainer 
+    instance can include any number of children, that must be instances of ObjectContainer.  
+    """
+    def __init__(self,name="",**kwargs):
+        """
+        """
+        if len(name.split(".")) > 1 or len(name.split("/")) > 1:
+            raise exceptions.InvalidRef("Illegal name for ObjectContainer %s" % name)
+        self._name = name
+        self._parent = None
+        self._order = []
+        self._children = {}
+        for arg in kwargs.keys():
+            setattr(self, arg, kwargs.get(arg))
+
+    def __getattr__(self,name):
+        """
+        direct all not found attribute calls to the sub object getattr
+        """
+        try:
+            return self.__dict__['_children'][name]
+        except KeyError:
+            return getattr(super(ObjectContainer),name)
+
+    def _path(self, toparent=None):
+        """
+        Get the path to this ObjectContainer.
+        @param toparent: the _parent object up to which the path is relative. Default value is None.,
+        which gives the fully qualified path
+        @return: The path to the ObjectContainer from toparent
+        """
+        if self == toparent:
+            return ""
+        elif self._parent and self._parent != toparent:
+            # return the path with list index if the given element is in a list
+            if utils.is_list(self.parent._get(self._name)):
+                return self._parent._path(toparent)+"."+"%s[%s]" % (self._name,self.get_index())
+            else:
+                return self._parent._path(toparent)+"."+self._name
+        else:
+            return self._name
+    
+    def _add(self, child, policy=REPLACE):
+        """
+        Add a child object. 
+        @param child: The child object to add. The child needs to be an instance of ObjectContainer. 
+        @param policy: The policy which is used when an object with same name exists already  
+        """
+        # check that the child is a supported type
+        if not self._supported_type(child):
+            raise exceptions.IncorrectClassError("Cannot add instance of %s to %s." % (child.__class__,self.__class__))
+        if policy == REPLACE:
+            self._replace(child)
+        elif policy == ERROR:
+            self._error(child)
+        elif policy == APPEND:
+            self._append(child)
+        elif policy == PREPEND:
+            self._prepend(child)
+
+    def _append(self, child):
+        """
+        Add the given child to the proper key. Create a list entry if necessary
+        """
+        child._set_parent(self)
+        if not self._children.has_key(child._name):
+            # skip all internal objects (that start with _)
+            if not child._name.startswith('?'):
+                self._order.append(child._name)
+            self._children[child._name] = child
+        else:
+            """ Create a list under the child name """
+            self._children[child._name] = utils.add_list(self._children[child._name], child)
+        return
+
+    def _prepend(self, child):
+        """
+        Add the given child to the proper key. Create a list entry if necessary
+        """
+        child._set_parent(self)
+        if not self._children.has_key(child._name):
+            # skip all internal objects (that start with _)
+            if not child._name.startswith('?'):
+                self._order.insert(0,child._name)
+            self._children[child._name] = child
+        else:
+            """ Create a list under the child name """
+            self._children[child._name] = utils.prepend_list(self._children[child._name], child)
+        return
+
+    def _replace(self, child):
+        """
+        If the given child already exists => Replace the child, 
+        but maintain the current children of that child 
+        """
+        child._set_parent(self)
+        # skip all internal objects (that start with _)
+        if not self._children.has_key(child._name):
+            if not child._name.startswith('?'):
+                self._order.append(child._name)
+        else:
+            """ if the existing child is a instance of ObjectContainer, 
+                add all children of the existing contianer to this new object """
+            existingchild = self._children[child._name]
+            if isinstance(existingchild, ObjectContainer):
+                for subchild in existingchild._objects():
+                     child._add(subchild)
+        
+        self._children[child._name] = child
+        return
+
+    def _error(self, child):
+        """
+        If the given child already exists => raise an exception.
+        @raise exceptions.AlreadyExists: 
+        """
+        child._set_parent(self)
+        if not self._children.has_key(child._name):
+            # skip all internal objects (that start with _)
+            if not child._name.startswith('?'):
+                self._order.insert(0,child._name)
+            self._children[child._name] = child
+        else:
+            raise exceptions.AlreadyExists('Child %s already exists' % child._name)
+        return
+
+    def _add_to_path(self, path, child, policy=REPLACE):
+        """
+        Add a child object.
+        @param path: the path for the object
+        @param child: The child object to add 
+        @param namespace: The namespace of the object, which defines where the object is created  
+        """
+        # check that the child is a supported type
+        if not self._supported_type(child):
+            raise exceptions.IncorrectClassError("Cannot add instance of %s to %s Container" % (child.__class__,self.__class__))
+        # ensure that the elements to the namespace exist  
+        curelem = self
+        for ppath in utils.dottedref.split_ref(path):
+            
+            if not curelem._children.has_key(ppath):
+                # Create missing elem
+                curelem._add(self._default_object(ppath))
+            curelem = curelem._get(ppath)
+        curelem._add(child,policy)
+
+    def _get(self, path):
+        """
+        Get a child object by it path.
+        @return: The child object if it is found. 
+        @raise NotFound: when object is not found from the children.  
+        """
+        
+        try:
+            # traverse to the actual child element 
+            curelem = self
+            for pathelem in utils.dottedref.split_ref(path):
+                if utils.dottedref.get_index(pathelem) == None:
+                    curelem = curelem._children[pathelem]
+                else:
+                    # If the given pathelem is referring to a list 
+                    name = utils.dottedref.get_name(pathelem)
+                    index = utils.dottedref.get_index(pathelem)
+                    curelem = utils.get_list(curelem._children[name])[index]
+            return curelem
+        # Catch the KeyError exception from dict and IndexError from list
+        except (KeyError,IndexError): 
+            raise exceptions.NotFound("Child %s not found!" % path)
+
+    def _has(self, path):
+        """
+        Returns True if an element under the path is found.
+        @return: Boolean value. 
+        """
+        
+        try:
+            # traverse to the actual child element 
+            curelem = self
+            for pathelem in utils.dottedref.split_ref(path):
+                curelem = curelem._children[pathelem]
+            return True
+        except KeyError: 
+            return False
+
+    def _remove(self, path):
+        """
+        Remove a child object by it path.
+        """
+        # if the patherence is a long patherence (dotted name)
+        # first get the _parent object and call the remove to the _parent
+        (parentref,name) = utils.dottedref.psplit_ref(path)
+        if parentref != "":
+            self._get(parentref)._remove(name)
+        elif utils.dottedref.get_index(path) != None and \
+             self._get(utils.dottedref.get_name(path)):
+            # Delete If the given pathelem is referring to a list 
+            name = utils.dottedref.get_name(path)
+            index = utils.dottedref.get_index(path)
+            del self._children[name][index]
+            if len(self._children[name]) == 0:
+                del self._order[self._order.index(name)]
+        elif self._get(path) != None: # delete if the child is found
+            del self._children[path]
+            del self._order[self._order.index(path)]
+            
+        else:
+            raise exceptions.NotFound("Child %s not found!" % path)
+
+    def _list_traverse(self,**kwargs):
+        """
+        Return a list of all children paths. This function calls internally __traverse__, see it for 
+        more details.
+        @return: an unordered list of children paths. The path is relative to this node. 
+        """
+        return [child._path(self) for child in self._traverse(**kwargs)]
+
+    def _traverse(self, **kwargs):
+        """
+        The traverse goes recursively through the tree of children of this node and returns a result set as list.
+        Arguments can be passed to it to filter out elements of the result set. All arguments are 
+        given as dict, so they must be given with name. E.g. _traverse(name='test')
+        @param name: The node name or part of name which is used as a filter. This is a regular expression (uses internally re.match()) 
+        @param path: The path name or part of name which is used as a filter. This is a regular expression (uses internally re.match())
+        @param filters: A list of predefined filters can be given as lambda functions. E.g. filters=[lambda x: isinstance(x._obj, FooClass)]  
+        @return: a list of ObjectContainer objects.
+        """
+        filterlist=[]
+        if kwargs.has_key('ref'):
+            filterlist.append(lambda x: re.match(kwargs.get('ref'), x.ref))
+        if kwargs.has_key('name'):
+            filterlist.append(lambda x: re.match(kwargs.get('name'), x._name))
+        if kwargs.has_key('path'):
+            filterlist.append(lambda x: re.match(kwargs.get('path'), x._path()))
+        if kwargs.has_key('type'):
+            filterlist.append(lambda x: isinstance(x, kwargs.get('type')))
+        if kwargs.has_key('filters'):
+            filterlist += kwargs.get('filters')
+
+        ret = []
+        for child in self._objects():
+            subchildren = child._tail_recurse(_apply_filter,filters=filterlist)
+            ret += subchildren
+        return ret
+    
+    def _find_leaves(self, **kwargs):
+        """
+        Find all leaf nodes in the tree that satisfy the given filtering criteria.
+        
+        For possible keyword arguments see _traverse().
+        
+        @return: A list of ObjectContainer objects.
+        """
+        # Find all children
+        nodes = self._traverse(**kwargs)
+        
+        # Filter out non-leaves
+        return filter(lambda node: len(node._objects()) == 0, nodes)
+
+    def _tail_recurse(self, function, **kwargs):
+        """
+        Run a tail recursion on all container children and execute the given function.
+        1. function will receive self as argument to it.
+        2. function will receive all kwargs as argument to it.
+        3. tail recursion means that the function is executed first and then the 
+        recursion continues.
+        @param function: the function which is executed
+        @param kwargs: a list of arguments as dict
+        @return: an list of objects, which can be anything that the funtion returns   
+        """
+        
+        ret = []
+        ret += function(self,**kwargs)
+        for child in self._objects():
+            try:
+                # We wont add the object to the ret until we know that it is a valid object
+                subchildren = child._tail_recurse(function,**kwargs)
+                #ret += function(child,**kwargs)
+                ret += subchildren
+            except exceptions.InvalidObject,e:
+                # remove the invalid object from this container
+                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
+                self._remove(child._name)
+                continue
+        return ret
+
+    def _head_recurse(self, function,**kwargs):
+        """
+        Run a tail recursion on all container children and execute the given function.
+        1. function will receive self as argument to it.
+        2. function will receive all kwargs as argument to it.
+        3. head recursion means that the recursion continues to the leaf nodes and then the 
+        execution of the function begins.
+        @param function: the function which is executed
+        @param kwargs: a list of arguments as dict
+        @return: an list of objects, which can be anything that the funtion returns   
+        """
+        ret = []
+        for child in self._objects():
+            try:
+                ret += child._head_recurse(function,**kwargs)
+                ret += function(child,**kwargs)
+            except exceptions.InvalidObject,e:
+                # remove the invalid object from this container
+                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
+                self._remove(child._name)
+                continue
+        return ret
+
+    def _list(self):
+        """
+        Return a array of immediate children names.
+        @return: an unordered list of immediate children path-references
+        """
+        # skip all internal objects (that start with _)
+        return [name for name in self._order if not name.startswith('?')] 
+
+    def _objects(self, **kwargs):
+        """
+        Return a array of immediate children.
+        @return: an unordered list of immediate children
+        """
+        ret = []
+        for cname in self._order:
+            try:
+                if object_container_filter(self._children[cname], **kwargs):
+                    ret += utils.get_list(self._children[cname])
+            except exceptions.InvalidObject,e:
+                # remove the invalid object from this container
+                logging.getLogger('cone').warning('Removing invalid child because of exception %s' % e)
+                self._remove(cname)
+                continue
+        return ret
+
+    def _get_index(self, name):
+        """
+        Get the index of a child object by its name. The index matches the index
+        of the child object in the _children array. 
+        @return: integer. 
+        @raise NotFound: when object is not found from the children.  
+        """
+        
+        try:
+            return self._order.index(name)
+        except KeyError:
+            raise exceptions.NotFound("Child %s not found!" % name)
+
+    def _supported_type(self,obj):
+        """
+        An internal function to check that the given object is a supported for this Tree. 
+        This is used in every __add__ operation to check whether the object can be added to the tree.
+        This function should be overloaded by a subclass if the supported types need to be changed.
+        @return: True if object is supported, otherwise false.  
+        """
+        return isinstance(obj, ObjectContainer)
+
+    def _default_object(self,name):
+        """
+        An internal function to create a default object for this container in case of __add_to_path__, which
+        creates the intermediate objects automatically. 
+        This function should be overloaded by a subclass if the default object need to be changed.
+        @return: A new object.  
+        """
+        return ObjectContainer(name)
+
+    def _find_parent(self, **kwargs):
+        """
+        find a _parent object by arguments. You can define any number of object attributes that 
+        have to match to the object. 
+        Example1:
+           _find_parent(foobar=True) searches for a _parent
+          object which has a member attribute foobar and its value is True. 
+        Example2:
+           _find_parent(name="test") searches for a _parent
+          object which has a member attribute name and its value is "test". 
+        Example3: type is a special case
+           _find_parent(type=Configuration) searches for a _parent
+          object which is an instance of Configuration (checked with isinstance). 
+        @param kwargs: 
+        @return: The object that matches the arguments
+        @raise exceptions.NotFound: When no matching parent is found
+        """
+        type = kwargs.get('type', None)
+        if hasattr(self,'_parent') and self._parent != None:
+            found = True
+            for key in kwargs.keys():
+                try:
+                    # handle type as a special case
+                    if key == 'type':
+                        if not isinstance(self._parent, kwargs.get(key)):
+                            found = False
+                            break
+                    elif key == 'match':
+                        if not self._parent == kwargs.get(key):
+                            found = False
+                            break
+                    elif not getattr(self._parent, key) == kwargs.get(key):
+                        found = False
+                        break
+                except AttributeError:
+                    found = False
+                    break
+            if found:
+                return self._parent
+            else:
+                return self._parent._find_parent(**kwargs)
+        else:
+            raise exceptions.NotFound("Parent not found!")
+
+    def _find_parent_or_default(self, default=None,**kwargs):
+        """
+        Calls internally the find parent function, which is encapsulated with try except 
+        returns the given default value if find parent raises NotFound exception. 
+        """
+        try:
+            return self._find_parent(**kwargs)
+        except exceptions.NotFound:
+            return default
+
+    def set_ref(self,ref):
+        """
+        @param ref: The new reference of the object
+        """
+        self._name = ref
+        self.ref = ref
+
+    def get_ref(self):
+        """
+        @return: The reference of the object.
+        """
+        return self.ref
+
+class ObjectProxyContainer(ObjectProxy,ObjectContainer):
+    """
+    Combines the Container and Proxy classes to one.
+    """
+    def __init__(self,obj=None,name=""):
+        """
+        """
+        ObjectContainer.__init__(self,name)
+        ObjectProxy.__init__(self,obj)
+
+    def __getattr__(self,name):
+        """
+        First check if the requested attr is a children then 
+        direct all not found attribute calls to the sub object getattr
+        """
+        try:
+            return self.__dict__['_children'][name] 
+        except KeyError:
+            return getattr(self._obj,name)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/exceptions.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+class ConeException(Exception):
+    pass
+
+class NotSupportedException(ConeException):
+    def __init__(self, message=""):
+        self.message = "Not supported! %s" % message
+        ConeException.__init__(self, self.message)
+
+class StorageException(ConeException):
+    pass
+    
+class NotResource(StorageException):
+    pass
+    
+class NotFound(ConeException):
+    pass
+    
+class NotBound(ConeException):
+    pass
+    
+class NoParent(ConeException):
+    pass
+    
+class AlreadyExists(ConeException):
+    pass
+    
+class ConePersistenceError(ConeException):
+    pass
+    
+class ParseError(ConeException):
+    """
+    Exception raised when invalid data is attempted to be parsed.
+    
+    The attributes ``desc`` and ``lineno`` contain a description of
+    the error and the line on which the error occurred, if available.
+    The exception message itself may be composed of these two to make it more
+    readable, but it may also just be the same as the description.
+    
+    @message: Exception message.
+    @param lineno: The line number where the error occurred. Can be None to
+        signify that the line number is not available.
+    @param desc: Error description. If None, the exception message will be
+        used here also.
+    """
+    def __init__(self, message, lineno=None, desc=None):
+        ConeException.__init__(self, message)
+        self.lineno = lineno
+        self.desc = desc or message
+
+class XmlParseError(ParseError):
+    pass
+
+class IncorrectClassError(ConeException):
+    pass
+    
+class InvalidRef(ConeException):
+    pass
+    
+class InvalidObject(ConeException):
+    """ This error is raised inside the ObjectContainer class when in any container 
+    operation an invalid object is encountered. 
+    """
+    pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+
+"""
+Method base for Mapping model 2 model 
+"""
+
+class BaseMapper(object):
+    """
+    BaseMapper returns the object itself
+    """
+    def __init__(self):
+        pass
+
+    def map_object(self, object):
+        """
+        Return the object self
+        """
+        return object
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/persistence.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,97 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+from cone.public import api, exceptions
+
+
+class PersistenceFactory(api.FactoryBase):
+    @classmethod
+    def get_reader_for_elem(cls,elemname):
+        for reader in ConeReader.__subclasses__():
+            if reader.supported_elem(elemname):
+                return reader()
+        raise exceptions.ConePersistenceError("No reader for given elemname %s found!" % elemname)
+
+    @classmethod
+    def get_writer_for_class(cls,classname):
+        for writer in ConeWriter.__subclasses__():
+            if writer.supported_class(classname):
+                return writer ()
+        raise exceptions.ConePersistenceError("No writer for given class found!")
+
+
+class ConeHandler(object):
+    ext        = ""
+    class_type = ""
+
+
+class ConeReader(ConeHandler):
+    '''
+    Read data from the string and return a ConeObject
+    '''
+
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this ConeReader supports reading 
+        of the given element name
+        """
+        return False
+
+    def loads(self,data):
+        raise exceptions.NotSupportedException()
+
+    def load(self,res):
+        raise exceptions.NotSupportedException()
+  
+  
+class ConeWriter(object):
+    '''
+    Write a ConeObject to a string
+    '''
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this ConeWriter supports writing
+        of the given class name
+        """
+        return False
+
+    def dumps(self,ConeObject):
+        raise exceptions.NotSupportedException()
+
+    def dump(self,ConeObject,res,indent=True):
+        raise exceptions.NotSupportedException()
+
+def indent(elem, level=0):
+    i = os.linesep + level*"  "
+    if len(elem):
+        try:
+            if not elem.text or not elem.text.strip():
+                elem.text = i + "  "
+            for e in elem:
+                indent(e, level+1)
+                if not e.tail or not e.tail.strip():
+                    e.tail = i + "  "
+                if not e.tail or not e.tail.strip():
+                    e.tail = i
+            else:
+                if level and (not elem.tail or not elem.tail.strip()):
+                    elem.tail = i
+        except AttributeError,e:
+            # explanation for this kind of try-except required
+            pass
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1580 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import sys
+import os
+import re
+import logging
+import sets
+import inspect
+import xml.parsers.expat
+
+from cone.public import exceptions, utils, api, container, settings, rules
+import _plugin_reader
+
+debug = 0
+"""
+Implementation specific settings can be overriden in the global impl_settings variable
+"""
+
+AUTOCONFIG_CONFML = "autodata.confml"
+
+def get_autoconfig(configuration):
+    """
+    Return the "automatic" configuration for storing temporary run-time ConfML
+    features and values.
+    """
+    lastconfig = configuration.get_last_configuration()
+    if lastconfig.get_path() != AUTOCONFIG_CONFML:
+        logging.getLogger('cone').debug('Adding autodata configuration %s' % AUTOCONFIG_CONFML)
+        configuration.create_configuration(AUTOCONFIG_CONFML)
+    
+    lastconfig = configuration.get_last_configuration()
+    assert lastconfig.get_path() == AUTOCONFIG_CONFML
+    return lastconfig
+
+def get_supported_file_extensions():
+    """
+    Return a list of all supported ImplML file extension.
+    
+    Implementations are only attempted to be read from files with these
+    extensions.
+    """
+    return ImplFactory.get_supported_file_extensions()
+
+def get_supported_namespaces():
+    """
+    Returns a list of all supported ImplML namespaces.
+    """
+    return ImplFactory.get_reader_dict().keys()
+
+def is_temp_feature(feature):
+    """
+    Return whether the given feature is a temporary feature.
+    """
+    return hasattr(feature, _plugin_reader.TEMP_FEATURE_MARKER_VARNAME)
+
+class GenerationContext(object):
+    """
+    Context object that can be used for passing generation-scope
+    data to implementation instances.
+    """
+    
+    def __init__(self, tags={}):
+        #: The tags used in this generation context
+        #: (i.e. the tags passed from command line)
+        self.tags = tags
+        
+        #: The tags policy used in this generation context
+        self.tags_policy = "OR"
+        
+        #: A dictionary that implementation instances can use to
+        #: pass any data between each other
+        self.impl_data_dict = {}
+        
+        #: A string for the phase of the generation
+        self.phase = ""
+        
+        #: a list of rule results
+        self.results = []
+        
+        #: a pointer to the configuration 
+        self.configuration = None
+
+    def eval(self, ast, expression, value):
+        """
+        eval for rule evaluation against the context
+        """
+        pass
+
+    def handle_terminal(self, expression):
+        """
+        Handle a terminal object 
+        """
+        try:
+            if isinstance(expression, str): 
+                m = re.match("\${(.*)}", expression)
+                if m:
+                    try:
+                        dview = self.configuration.get_default_view()
+                        return dview.get_feature(m.group(1)).value
+                    except Exception, e:
+                        logging.getLogger('cone').error("Could not dereference feature %s. Exception %s" % (expression, e))
+                        raise e
+                elif expression in ['true','1','True']:
+                    return True
+                elif expression in ['false','0','False']:
+                    return False
+                else:
+                    try:
+                        return eval(expression)
+                    except NameError:
+                        # If the expression is a string in it self it can be returned
+                        return expression
+            else:
+                return expression
+        except Exception,e:
+            logging.getLogger('cone').error("Exception with expression %s: %s" % (expression, e))
+            raise e
+
+
+class FlatComparisonResultEntry(object):
+    """
+    Class representing a result entry for a flat implementation
+    comparison.
+    
+    Contains the following members:
+    Member        Description
+    file          Implementation file
+    impl_type     Implementation type (e.g. 'crml', 'gcfml')
+    id            Entry ID (e.g. CRML repository UID)
+    sub_id        Entry sub-ID if applicable (e.g. CRML key UID)
+    value_id      Implementation-specific value identifier
+    source_value  Value in the source implementation
+    target_value  Value in the target implementation
+    
+    data          Any extra data (implementation-specific)
+    """
+    
+    VARNAMES = ['file', 'impl_type', 'id', 'sub_id', 'value_id', 'source_value', 'target_value']
+    
+    def __init__(self, **kwargs):
+        for varname in self.VARNAMES:
+            setattr(self, varname, kwargs.get(varname))
+        self.data = kwargs.get('data')
+    
+    def __repr__(self):
+        var_entries = [] 
+        for varname in self.VARNAMES:
+            var_entries.append('%s=%r' % (varname, getattr(self, varname)))
+        return "FlatComparisonResultEntry(%s)" % ', '.join(var_entries)
+    
+    def __eq__(self, other):
+        if type(self) is not type(other):
+            return False
+        for varname in self.VARNAMES:
+            if getattr(self, varname) != getattr(other, varname):
+                return False
+        return True
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __lt__(self, other):
+        for varname in self.VARNAMES:
+            self_val = getattr(self, varname)
+            other_val = getattr(other, varname)
+            if self_val < other_val:    return True
+            elif self_val == other_val: pass
+            else:                       return False
+        return False
+
+class DuplicateImplementationEntry(object):
+    """
+    Class representing an entry of duplicate implementation instances
+    found in a comparison.
+    """
+    VARNAMES = ['impl_type', 'id', 'files_in_source', 'files_in_target']
+    
+    def __init__(self, **kwargs):
+        self.impl_type       = kwargs.get('impl_type')
+        self.id              = kwargs.get('id')
+        self.files_in_source = kwargs.get('files_in_source', [])
+        self.files_in_target = kwargs.get('files_in_target', [])
+    
+    def __repr__(self):
+        var_entries = [] 
+        for varname in self.VARNAMES:
+            val = getattr(self, varname)
+            if isinstance(val, list): val = sorted(val)
+            var_entries.append('%s=%r' % (varname, val))
+        return "DuplicateImplementationEntry(%s)" % ', '.join(var_entries)
+    
+    def __eq__(self, other):
+        if type(self) is not type(other):
+            return False
+        return self.impl_type == other.impl_type \
+            and self.impl_type == other.impl_type \
+            and sorted(self.files_in_source) == sorted(other.files_in_source) \
+            and sorted(self.files_in_target) == sorted(other.files_in_target)
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __lt__(self, other):
+        for varname in self.VARNAMES:
+            self_val = getattr(self, varname)
+            other_val = getattr(other, varname)
+            if isinstance(self_val, list):      self_val = sorted(self_val)
+            if isinstance(other_val, list):     other_val = sorted(other_val)
+            if self_val < other_val:    return True
+            elif self_val == other_val: pass
+            else:                       return False
+        return False
+
+class FlatComparisonResult(object):
+    """
+    Class representing a flat comparison result.
+    
+    Each member is a list of FlatComparisonResultEntry
+    objects, except for 'duplicate', which contains
+    DuplicateImplementationEntry objects.
+    
+    Note that the entry members 'value_id', 'source_value' and
+    'target_value' are irrelevant in the 'only_in_source' and
+    'only_in_target' lists, and will always be None.
+    """
+    def __init__(self, **kwargs):
+        self.only_in_source = kwargs.get('only_in_source', [])
+        self.only_in_target = kwargs.get('only_in_target', [])
+        self.modified       = kwargs.get('modified', [])
+        self.duplicate      = kwargs.get('duplicate', [])
+        
+    
+    def extend(self, other):
+        """
+        Extend this comparison result with another one.
+        """
+        if not isinstance(other, FlatComparisonResult):
+            raise ValueError("Expected instance of %s" % FlatComparisonResult.__name__)
+        
+        self.only_in_source.extend(other.only_in_source)
+        self.only_in_target.extend(other.only_in_target)
+        self.modified.extend(other.modified)
+    
+    def __repr__(self):
+        data = ["FlatComparisonResult(\n"]
+        
+        def get_list_data(lst):
+            if len(lst) == 0: return '[]'
+            
+            temp = ['[\n']
+            for item in sorted(lst):
+                temp.append("    %r\n" % item)
+            temp.append('  ]')
+            return ''.join(temp)
+        
+        entries = []
+        for varname in ('only_in_source', 'only_in_target', 'modified', 'duplicate'):
+            entry_text = '  %s = %s' % (varname, get_list_data(getattr(self, varname)))
+            entries.append(entry_text)
+        data.append(',\n'.join(entries))
+        
+        data.append('\n)')
+        return ''.join(data)
+    
+    def __len__(self):
+        return len(self.only_in_source) + len(self.only_in_target) + len(self.modified)
+    
+    def __eq__(self, other):
+        if type(self) is not type(other):
+            return False
+        return sorted(self.only_in_source) == sorted(other.only_in_source) \
+            and sorted(self.only_in_target) == sorted(other.only_in_target) \
+            and sorted(self.modified) == sorted(other.modified) \
+            and sorted(self.duplicate) == sorted(other.duplicate)
+    
+    def __ne__(self, other):
+        return not (self == other)
+
+class ImplBase(object):
+    """
+    Base class for any implementation class. 
+    """
+    
+    #: Identifier for the implementation type, used e.g. in .cfg files.
+    #: Should be a string like e.g. 'someml'.
+    IMPL_TYPE_ID = None
+    
+    #: Defines the default invocation phase for the implementation.
+    #: The default is used if the phase is not explicitly set in the
+    #: ImplML file or manually overridden by calling set_invocation_phase()
+    DEFAULT_INVOCATION_PHASE = None
+    
+    def __init__(self, ref, configuration):
+        """
+        Create a ImplBase object
+        @param ref : the ref to the Implml file resource.
+        @param configuration : the Configuration instance for the
+        configuration data.
+        """
+        self._settings = None
+        self.ref = ref
+        self.index = None
+        self.configuration = configuration
+        self._output_root = self.settings.get('output_root','output')
+        self.output_subdir = self.settings.get('output_subdir','')
+        self.plugin_output = self.settings.get('plugin_output','')
+        
+        self.generation_context = None
+        self._tags = None
+        self._invocation_phase = None
+        self._tempvar_defs = []
+        self.condition = None
+        self._output_root_override = None
+
+    def _eval_context(self, context):
+        """
+        This is a internal function that returns True when the context matches to the 
+        context of this implementation. For example phase, tags, etc are evaluated.
+        """
+        if context.tags and not self.has_tag(context.tags, context.tags_policy):
+            return False
+        if context.phase and not context.phase in self.invocation_phase():
+            return False
+        if self.condition and not self.condition.eval(context):
+            return False 
+        
+        return True
+
+    def _dereference(self, ref):
+        """
+        Function for dereferencing a configuration ref to a value in the Implementation configuration context. 
+        """
+        return configuration.get_default_view().get_feature(ref).value
+
+    def _compare(self, other, dict_keys=None):
+        """ 
+        The plugin instance against another plugin instance
+        """
+        raise exceptions.NotSupportedException()
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        @param context: The generation context can be given as a parameter. 
+        The context can contain generation specific parameters for the 
+        implementation object itself or the implementation can store data to it 
+        which is visible to other implementations. 
+        @return: 
+        """
+        raise exceptions.NotSupportedException()
+    
+    def post_generate(self, context=None):
+        """
+        Called when all normal generation has been done.
+        
+        @param context: The generation context can be given as a parameter. 
+        The context can contain generation specific parameters for the 
+        implementation object itself or the implementation can store data to it 
+        which is visible to other implementations. 
+        @attention: This is a temporary method used for implementing cenrep_rfs.txt generation.
+        """
+        pass
+    
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        return []
+    
+    def get_refs(self):
+        """
+        Return a list of all ConfML setting references that affect this
+        implementation. May also return None if references are not relevant
+        for the implementation.
+        """
+        return None
+    
+    def has_ref(self, refs):
+        """
+        @param refs: a list of references to check against.
+        @returns True if the implementation uses the given refs as input value, return False if the ref is not found.
+        If refs are not relevant for the given plugin returns None. 
+        """
+        impl_refs = self.get_refs()
+        if impl_refs is None:
+            return None
+        
+        if isinstance(refs, basestring):
+            refs = [refs]
+        
+        for ref in refs:
+            for impl_ref in impl_refs:
+                if ref.startswith(impl_ref):
+                    if len(ref) == len(impl_ref):
+                        return True
+                    elif ref[len(impl_ref)] == '.':
+                        return True
+        return False
+
+    def flat_compare(self, other):
+        """
+        Return a flat comparison result for two implementations.
+        @param other: The target implementation to compare against.
+        @return: A FlatComparisonResult object.
+        
+        @raise exceptions.NotSupportedException(): The implementation class does not support
+            flat comparison.
+        """
+        raise exceptions.NotSupportedException()
+    
+    def get_flat_comparison_id(self):
+        """
+        Return the ID used to uniquely identify this implementation instance for flat comparison.
+        
+        @raise exceptions.NotSupportedException() if the implementation class does not support
+            flat comparison.
+        """
+        raise exceptions.NotSupportedException()
+    
+    def get_flat_comparison_extra_data(self):
+        """
+        Return the extra data object for a flat comparison entry.
+        
+        This method is called when an implementation container comparison finds an
+        implementation instance that is not in the other container.
+        
+        @raise exceptions.NotSupportedException() if the implementation class does not support
+            flat comparison.
+        """
+        raise exceptions.NotSupportedException()
+    
+    @classmethod
+    def get_flat_comparison_impl_type_id(cls):
+        """
+        Return the type ID used to uniquely identify the current implementation class in flat comparison.
+        
+        @raise exceptions.NotSupportedException() if the implementation class does not support
+            flat comparison.
+        """
+        raise exceptions.NotSupportedException()
+
+    @property
+    def settings(self):
+        if not self._settings:
+            parser = settings.SettingsFactory.cone_parser()
+            if self.IMPL_TYPE_ID is not None:
+                section = self.IMPL_TYPE_ID.upper()
+            else:
+                section = settings.DEFAULT_SECTION
+            self._settings = settings.ConeSettings(parser, section)
+        return self._settings
+
+    @property
+    def output(self):
+        vars = {'output_root': self.output_root,'output_subdir': self.output_subdir,'plugin_output': self.plugin_output}
+        default_format = '%(output_root)s/%(output_subdir)s/%(plugin_output)s'
+        return utils.resourceref.norm(self.settings.get('output',default_format,vars))
+    
+    def _get_output_root(self):
+        if self._output_root_override is not None:
+            return self._output_root_override
+        else:
+            return self._output_root
+    
+    def _set_output_root(self, value):
+        self._output_root = value
+    
+    output_root = property(_get_output_root, _set_output_root, None,
+       """
+       The output root directory.
+       
+       Note that if set_output_root_override() has been called with a value
+       other than None, reading this property will always return that value.
+       Otherwise it works just like any other property.
+       """)
+        
+    def get_tags(self):
+        if self._tags is not None:
+            tags = self._tags
+        else:
+            tags = eval(self.settings.get('plugin_tags','{}'))
+        
+        # If we have a configuration, expand setting references in the tags
+        if self.configuration is not None:
+            dview = self.configuration.get_default_view()
+            expanded_tags = {}
+            for name, values in tags.iteritems():
+                exp_name = utils.expand_refs_by_default_view(name, dview)
+                exp_values = []
+                expanded_tags[exp_name] = exp_values
+                for value in values:
+                    exp_value = utils.expand_refs_by_default_view(value, dview)
+                    exp_values.append(exp_value)
+            return expanded_tags
+        else:
+            return tags.copy()
+        
+    
+    def set_tags(self, tags):
+        """
+        Override the default implementation tags.
+        @param phase: The tag dictionary to set. If None, the implementation's
+            default tags will be used.
+        """
+        self._tags = tags
+
+    def has_tag(self, tags, policy=None):
+        """
+        @param tags: a dictionary of context : tags to check agains
+        @returns True if the implementation has a matching tag.
+        Otherwise return False.
+        """
+        if (tags==None or len(tags)==0) and len(self.get_tags()) == 0:
+            return True
+        if (tags!=None and len(tags)!=0) and len(self.get_tags()) == 0:
+            return False
+        
+        items = tags.iteritems()
+        self_tags = self.get_tags()
+        if policy == 'AND':
+            for (key,values) in items:
+                tagvals = self_tags.get(key, [])
+                for val in values:
+                    if val not in tagvals:
+                        return False
+            return True
+        else:
+            for (key,values) in items:
+                tagvals = self_tags.get(key, [])
+                for val in values:
+                    if val in tagvals:
+                        return True
+            return False
+            
+        return False
+
+    def set_output_root(self,output):
+        """
+        Set the root directory for the output files. The output
+        @param output : path to output dir.
+        """
+        self.output_root = output
+
+    def get_output_root(self):
+        """
+        Return the current output dir.
+        """
+        return self.output_root
+    
+    def set_output_root_override(self, output):
+        """
+        Set the output root override.
+        @param output: The override value. If None, the normal output root
+            value is used.
+        """
+        self._output_root_override = output
+
+    def invocation_phase(self):
+        """
+        @return: the phase name in which the plugin wants to be executed. 
+        """
+        # 1. Check if overridden on implementation instance level
+        if self._invocation_phase is not None:
+            return self._invocation_phase
+        # 2. Check if overridden on implementation class level
+        elif self.DEFAULT_INVOCATION_PHASE is not None:
+            return self.DEFAULT_INVOCATION_PHASE
+        # 3. Get from settings (if all else fails fall back to 'normal'
+        else:
+            return self.settings.get('plugin_phase', 'normal')
+    
+    def set_invocation_phase(self, phase):
+        """
+        Override the default invocation phase.
+        @param phase: The invocation phase to set. If None, the implementation's
+            default phase will be used.
+        """
+        self._invocation_phase = phase
+
+    def compare(self):
+        """
+        @return: the phase name in which the plugin wants to be executed. 
+        """
+        return self.settings.get('plugin_phase','normal')
+    
+    def get_temp_variable_definitions(self):
+        return self._tempvar_defs
+    
+    def get_relation_container(self):
+        """
+        Return a relation container containing all relations from this
+        implementation instance, or None.
+        """
+        return None
+    
+    def get_all_implementations(self):
+        """
+        return a list of all actual implementation which is for ImplBase object self. 
+        """
+        return [self]
+    
+    def __repr__(self):
+        return "%s(ref=%r, type=%r, index=%r)" % (self.__class__.__name__, self.ref, self.IMPL_TYPE_ID, self.index)
+
+
+class ImplContainer(ImplBase):
+    """
+    Acts as a container object with list functionality.  
+    """
+    def __init__(self, ref, configuration):
+        ImplBase.__init__(self, ref, configuration)
+        self.impls = []
+
+    # The list functions
+    def __getattr__(self, name):
+        if hasattr(self.impls, name):
+            return self.impls.__getattribute__(name)
+
+    def __getitem__(self, key):
+        return self.impls[key]
+
+    def __setitem__(self, key, value):
+        self.impls[key] = value
+    
+    def __delitem__(self, key):
+        del self.impls[key]
+
+    def __len__(self):
+        return len(self.impls)
+    
+    def __iter__(self):
+        return iter(self.impls)
+
+    def generate(self, context=None):
+        """
+        Generate function for container executes generate for all sub implementations.
+        @param context: The generation context can be given as a parameter. The container
+        passes the context to its sub implementations.
+         
+        @return: 
+        """
+        if context:
+            if not self._eval_context(context):
+                # should we report something if we exit here?
+                return
+            
+        # run generate on sub impls
+        for impl in self.impls:
+            impl.generate(context)
+
+    def get_refs(self):
+        """
+        Return a list of all ConfML setting references that affect this
+        implementation. May also return None if references are not relevant
+        for the implementation.
+        """
+        refs = []
+        for impl in self.impls:
+            subrefs = impl.get_refs()
+            if subrefs:
+                refs += subrefs
+        if refs:
+            return utils.distinct_array(refs)
+        else:
+            return None 
+
+    def get_tags(self):
+        """
+        overloading the get_tags function in ImplContainer to create sum of 
+        tags of all subelements of the Container
+        @return: dictionary of tags
+        """
+        tags = ImplBase.get_tags(self)
+        for impl in self.impls:
+            # Update the dict by appending new elements to the values instead 
+            # of overriding
+            for key,value in impl.get_tags().iteritems():
+                tags[key] = tags.get(key,[]) + value 
+        return tags
+
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        files = []
+        for impl in self.impls:
+            files += impl.list_output_files()
+        return utils.distinct_array(files)
+
+    def set_output_root(self,output):
+        """
+        Set the root directory for the output files. The output
+        @param output : path to output dir.
+        """
+        self.output_root = output
+        for impl in self.impls:
+            impl.set_output_root(output) 
+
+    def invocation_phase(self):
+        """
+        @return: the list of phase names in which phases this container wants to be executed. 
+        """
+        # use a dictionary to store phases only once 
+        phases = {}
+        phases[ImplBase.invocation_phase(self)] = 1
+        for impl in self.impls:
+            # for now only get the phases from sub ImplContainer objects 
+            # this is needed until the plugin phase can be overridden with the common elems
+            if isinstance(impl, ImplContainer):
+                subphases = impl.invocation_phase()
+                if isinstance(subphases, list):
+                    # join the two lists as one
+                    phases = phases.fromkeys(phases.keys() + subphases, 1)
+                else:
+                    phases[subphases] = 1
+        return phases.keys()
+    
+    def get_temp_variable_definitions(self):
+        tempvars = self._tempvar_defs[:]
+        for impl in self.impls:
+            tempvars += impl.get_temp_variable_definitions()
+        return tempvars
+
+    def get_relation_container(self):
+        """
+        Return a relation container containing all relations from this
+        container object instance, or empty relation container.
+        """
+        container = RelationContainer([], '<root>')
+        for impl in self.impls:
+            c = impl.get_relation_container()
+            if isinstance(c, RelationContainer):
+                container.entries.append(c)
+        return container
+    
+    def get_all_implementations(self):
+        """
+        return a list of all actual implementation under this container 
+        """
+        actual_impls = []
+        for subimpl in self.impls:
+            actual_impls += subimpl.get_all_implementations()
+        return actual_impls
+
+
+class ReaderBase(object):
+    """
+    Base class for implementation readers.
+    
+    Each reader class supports one XML namespace, from which it reads an implementation
+    instance.
+    
+    The method for parsing an implementation (read_impl()) is given an ElementTree
+    XML element as the root from which to parse the implementation. The plug-in
+    machinery handles each XML file so that the correct reader class is used to read
+    the implementations from XML elements based on the namespaces.
+    """
+    
+    #: The XML namespace supported by the implementation reader.
+    #: Should be something like "http://www.xyz.org/xml/1".
+    #: Can also be None, in which case the reader will not be used
+    #: (this can be useful for defining base classes for e.g. readers
+    #: for different versions of an implementation).
+    NAMESPACE = None
+    
+    #: Any extra XML namespaces that should be ignored by the
+    #: implementation parsing machinery. This is useful for specifying
+    #: namespaces that are not actual ImplML namespaces, but are used
+    #: inside an implementation (e.g. XInclude)
+    IGNORED_NAMESPACES = []
+    
+    #: Supported implementation file extensions.
+    #: Sub-classes can override this to add new supported file extensions
+    #: if necessary. The file extensions simply control whether implementations
+    #: are attempted to be read from a file or not.
+    #: Note that the extensions are case-insensitive.
+    FILE_EXTENSIONS = ['implml']
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, doc_root):
+        """
+        Read an implementation instance from the given element tree.
+        
+        @param resource_ref: Reference to the resource in the configuration in
+            which the given document root resides.
+        @param configuration: The configuration used.
+        @param doc_root: The document root from which to parse the implementation.
+        @return: The read implementation instance, or None.
+        """
+        raise exceptions.NotSupportedException()
+    
+    @classmethod
+    def _read_xml_doc_from_resource(cls, resource_ref, configuration):
+        """
+        Parse an ElementTree instance from the given resource.
+        """
+        resource = configuration.get_resource(resource_ref)
+        try:
+            try:
+                data = resource.read()
+                return utils.etree.fromstring(data)
+            except exceptions.XmlParseError, e:
+                msg = "Invalid XML in implementation file '%s'. Exception: %s" % (resource_ref, e)
+                raise e
+        finally:
+            resource.close()
+
+class ImplContainerReader(ReaderBase):
+    """
+    Reader class for reading containers inside implementation files. A container 
+    is a implementation in it self that can contain a list of actual implementations.
+    """
+    NAMESPACE = "http://www.symbianfoundation.org/xml/implml/1"
+    
+    
+    # The reader class list loaded using ImplFactory
+    __reader_classes = None
+    __supported_file_extensions = None
+    __ignored_namespaces = None
+    
+    @classmethod
+    def get_reader_classes(cls):
+        """
+        Return a dictionary of all possible implementation reader classes.
+        
+        Dictionary key is the XML namespace and the value is the corresponding
+        reader class.
+        """
+        cls.__reader_classes = ImplFactory.get_reader_dict()
+        return cls.__reader_classes
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, doc_root, read_impl_count=None):
+        # The variable read_impl_count is used to keep track of the number of
+        # currently read actual implementations. It is a list so that it can be used
+        # like a pointer, i.e. functions called from here can modify the number
+        # inside it. A more elegant solution is not done here, since this is temporary
+        # and the index variable in implementation instances will be changed to line_number,
+        # which specifies the actual line on which the implementation is specified in the file
+        if read_impl_count is None: read_impl_count = [0]
+        
+        ns, tag = utils.xml.split_tag_namespace(doc_root.tag)
+        if tag != "container":
+            logging.getLogger('cone').error("Error: The root element must be a container in %s" % (ns, resource_ref))
+            
+        impls = []
+        reader_classes = cls.get_reader_classes()
+        namespaces = reader_classes.keys()
+        # Read first the root container object with attributes 
+        # and then traverse through possible child containers 
+        containerobj = ImplContainer(resource_ref, configuration)
+        containerobj.condition = cls.get_condition(doc_root)
+        
+        common_data = _plugin_reader.CommonImplmlDataReader.read_data(doc_root)
+        
+        # traverse through the subelements
+        for elem in doc_root:
+            ns, tag = utils.xml.split_tag_namespace(elem.tag)
+            if ns == cls.NAMESPACE:
+                # Read a sub-container from the common namespace (all other
+                # common namespace elements were handled earlier)
+                if tag == "container":
+                    subcontainer = cls.read_impl(resource_ref, configuration, elem, read_impl_count=read_impl_count)
+                    containerobj.append(subcontainer)
+                    subcontainer.index = None # For now all sub-containers have index = None
+            else:
+                # Try to read the sub implementation object from some other namespace 
+                if ns not in namespaces:
+                    logging.getLogger('cone').error("Error: no reader for namespace '%s' in %s" % (ns, resource_ref))
+                else:
+                    reader = reader_classes[ns]
+                    subelem = reader.read_impl(resource_ref, configuration, elem)
+                    if common_data: common_data.apply(subelem)
+                    containerobj.append(subelem)
+                    subelem.index = read_impl_count[0]
+                    read_impl_count[0] = read_impl_count[0] +  1
+            
+        if common_data:
+            common_data.apply(containerobj)
+            containerobj._tempvar_defs = common_data.tempvar_defs + containerobj._tempvar_defs
+        return containerobj
+
+    @classmethod
+    def read_implementation(cls, xml_data):
+        """
+        Read a container implementation from the given xmlroot element.
+        """
+        root = utils.etree.fromstring(xml_data)
+        return cls.read_impl("", None,root)
+
+    @classmethod 
+    def get_condition(cls, root):
+        if root.get('condition'):
+            left = root.get('condition')
+            right = root.get('value', 'true')
+            return rules.SimpleCondition(left, right)
+        else:
+            return None
+
+class ImplSet(sets.Set):
+    """
+    Implementation set class that can hold a set of ImplBase instances. 
+    """
+
+    """ 
+    The plugin phases is a list of possible phases in which the plugins are executed. 
+    Each plugin instance can tell in which phase it needs to be executed. 
+    """ 
+    INVOCATION_PHASES = ['pre','normal','post']
+
+    def __init__(self,implementations=None, generation_context=None):
+        super(ImplSet,self).__init__(implementations)
+        self.output = 'output'
+        if generation_context:
+            self.generation_context = generation_context
+        else:
+            self.generation_context = GenerationContext()
+
+    def invocation_phases(self):
+        """
+        @return: A list of possible invocation phases
+        """
+        return self.INVOCATION_PHASES
+
+    def list_output_files(self):
+        """
+        List the output file names from this container.
+        """
+        filelist = []
+        for impl in self:
+            files = impl.list_output_files()
+            filelist.extend(files)
+        return utils.distinct_array(filelist)
+
+    def generate(self, context=None):
+        """
+        Generate all implementations. 
+        @return: 
+        """
+        #for impl in self.impls:
+        #    impl.generation_context = self.generation_context
+        if not context:
+            context =  self.generation_context
+        self.execute(self, 'generate', context)
+    
+    def post_generate(self, context=None):
+        """
+        @attention: This is a temporary method used for implementing cenrep_rfs.txt generation.
+        """
+        if not context:
+            context =  self.generation_context
+        self.execute(self, 'post_generate', context)
+
+    def execute(self, implementations, methodname, *args):
+        """
+        Internal function for executing a function to a list of implementations.
+        
+        Mutual execution order (for separate implementation instances defined in
+        the same implementation file) is the order the implementations are
+        specified in the file.
+        
+        @param implementations:
+        @param methodname: the name of the function to execute  
+        """
+        # Sort by (file_name, index_in_file) to ensure the correct execution order
+        impls = sorted(implementations, key=lambda impl: (impl.ref, impl.index))
+        for impl in impls:
+            try:
+                impl.set_output_root(self.output)
+                if hasattr(impl, methodname): 
+                    _member = getattr(impl, methodname)
+                    _member(*args)
+                else:
+                    logging.getLogger('cone').error('Impl %r has no method %s' % (impl, methodname))
+            except Exception, e:
+                utils.log_exception(logging.getLogger('cone'), 'Impl %r raised an exception: %s' % (impl, repr(e)))
+        
+    
+    def add_implementation(self,impl):
+        """
+        Add a ImplBase object to this ImplBaseContainer.
+        """
+        self.add(impl)
+        
+    def remove_implementation(self,ref):
+        """
+        Remove implementation object by its ref (name of the implml resource). 
+        """
+        impls_to_remove = []
+        for impl in self:
+            if impl.ref == ref:
+                impls_to_remove.append(impl)
+        
+        for impl in impls_to_remove:
+            self.remove(impl)
+        
+    def list_implementation(self):
+        """
+        List all implementation in this container.
+        @return: an array of resource references.
+        """
+        implrefs = []
+        for impl in self:
+            if impl.ref not in implrefs:
+                implrefs.append(impl.ref)
+        return implrefs
+    
+    def get_implementations_by_file(self, ref):
+        """
+        Return a list of implementations read from the given file.
+        """
+        return filter(lambda impl: impl.ref == ref, self)
+    
+    def filter_implementations(self,**kwargs):
+        """
+        Find any implementation with certain parameters.
+        All arguments are given as dict, so they must be given with name. E.g. copy(phase='normal')
+        @param phase: name of the phase
+        @param refs: A list of refs that are filtered with function has_refs
+        @param tags: A dictionary of tags that are filtered with function has_tags
+        @return: a new ImplSet object with the filtered items.
+        """
+        impls = []
+        """ Create a list of filter functions for each argument """ 
+        filters=[]
+        filters.append(lambda x: x != None)
+        if kwargs.get('phase', None) != None:
+            filters.append(lambda x: kwargs.get('phase') in x.invocation_phase())
+        if kwargs.get('refs',None) != None:
+            # Changed has_ref usage to allow not supporting refs (meaning that non supported wont be filtered with refs)
+            filters.append(lambda x: x.has_ref(kwargs.get('refs')) == True or x.has_ref(kwargs.get('refs')) == None)
+        if kwargs.get('tags', None) != None:
+            filters.append(lambda x: x.has_tag(kwargs.get('tags'),kwargs.get('policy')))
+            
+        """ Go through the implementations and add all to resultset that pass all filters """ 
+        for impl in self:
+            pass_filters = True
+            for filter in filters:
+                if not filter(impl):
+                    pass_filters = False
+                    break
+            if pass_filters:
+                impls.append(impl)
+        return ImplSet(impls)
+    
+    def flat_compare(self, other):
+        """
+        Perform a flat comparison between this implementation container and another one.
+        @return: @return: A FlatComparisonResult object.
+        """
+        # Collect dictionaries of all comparable implementation instances
+        # ---------------------------------------------------------------
+        source_impls_by_class, duplicates_in_source = self._get_flat_comparison_impl_by_class_dicts('source')
+        target_impls_by_class, duplicates_in_target = other._get_flat_comparison_impl_by_class_dicts('target')
+        
+        # Collect a list containing all implementation classes
+        # ----------------------------------------------------
+        all_impl_classes = []
+        for impl_class in source_impls_by_class.iterkeys():
+            if impl_class not in all_impl_classes:
+                all_impl_classes.append(impl_class)
+        for impl_class in target_impls_by_class.iterkeys():
+            if impl_class not in all_impl_classes:
+                all_impl_classes.append(impl_class)
+        
+        # Perform comparison for all classes
+        # ----------------------------------
+        result = FlatComparisonResult()
+        for impl_class in all_impl_classes:
+            src = source_impls_by_class.get(impl_class, {})
+            tgt = target_impls_by_class.get(impl_class, {})
+            temp_result = self._get_flat_comparison_result(impl_class, src, tgt)
+            result.extend(temp_result)
+        
+        # Add duplicates into the comparison result
+        # -----------------------------------------
+        def get_or_add_dup_entry(impl_type_id, impl_id):
+            for e in result.duplicate:
+                if e.impl_type == impl_type_id and e.id == impl_id:
+                    return e
+            e = DuplicateImplementationEntry(impl_type=impl_type_id, id=impl_id)
+            result.duplicate.append(e)
+            return e
+                    
+        for impl_class, impl_type_id, impl_id, file in duplicates_in_source:
+            entry = get_or_add_dup_entry(impl_type_id, impl_id)
+            entry.files_in_source.append(file)
+        for impl_class, impl_type_id, impl_id, file in duplicates_in_target:
+            entry = get_or_add_dup_entry(impl_type_id, impl_id)
+            entry.files_in_target.append(file)
+        
+        # Sort the files so that the output is easier to compare in unit tests
+        for e in result.duplicate:
+            e.files_in_source.sort()
+            e.files_in_target.sort()
+        
+        return result
+    
+    def _get_flat_comparison_impl_by_class_dicts(self, name):
+        result = {}
+        duplicates = [] # List of (impl_class, impl_type_id, impl_id, file) tuples
+        for impl in self:
+            # See if the implementation is flat comparable
+            try:
+                impl_id = impl.get_flat_comparison_id()
+            except exceptions.NotSupportedException:
+                continue
+            
+            # Get the dictionary where implementations of this type are collected
+            impl_class = type(impl)
+            if impl_class not in result:
+                result[impl_class] = {}
+            impls_dict = result[impl_class]
+            
+            # Add to the dictionary
+            if impl_id not in impls_dict:
+                impls_dict[impl_id] = impl
+            else:
+                logging.getLogger('cone').warning("Multiple '%s' implementations with ID %r in %s" % (impl.IMPL_TYPE_ID, impl_id, name))
+                duplicates.append((impl_class, impl.IMPL_TYPE_ID, impl_id, impl.ref))
+        
+        # Handle duplicates (add new duplicate entries and
+        # remove from the dictionaries)
+        new_duplicates = []
+        for impl_class, impl_type_id, impl_id, _ in duplicates:
+            # Get the corresponding dictionary 
+            if impl_class not in result: continue
+            impls_dict = result[impl_class]
+            if impl_id not in impls_dict: continue
+            impl = impls_dict[impl_id]
+            
+            # Add a new entry
+            new_duplicates.append((impl_class, impl.IMPL_TYPE_ID, impl_id, impl.ref))
+            
+            # Remove from the dictionary
+            del impls_dict[impl_id]
+        duplicates.extend(new_duplicates)
+        
+        return result, duplicates
+    
+    def _get_flat_comparison_result(self, impl_class, source_impls_dict, target_impls_dict):
+        result = FlatComparisonResult()
+        impl_type_id = impl_class.get_flat_comparison_impl_type_id()
+        
+        for impl_id, impl in target_impls_dict.iteritems():
+            if impl_id not in source_impls_dict:
+                result.only_in_target.append(FlatComparisonResultEntry(
+                    file        = impl.ref,
+                    impl_type   = impl_type_id,
+                    id          = impl_id,
+                    data        = impl.get_flat_comparison_extra_data()))
+        
+        
+        def fill_in_fields(entries, field_values):
+            for entry in entries:
+                for varname, value in field_values.iteritems():
+                    setattr(entry, varname, value)
+        
+        for impl_id, src_impl in source_impls_dict.iteritems():
+            if impl_id not in target_impls_dict:
+                result.only_in_source.append(FlatComparisonResultEntry(
+                    file        = src_impl.ref,
+                    impl_type   = impl_type_id,
+                    id          = impl_id,
+                    data        = src_impl.get_flat_comparison_extra_data()))
+            else:
+                tgt_impl = target_impls_dict[impl_id]
+                
+                temp_result = src_impl.flat_compare(tgt_impl)
+                field_values = {'file'      : tgt_impl.ref,
+                                'impl_type' : impl_type_id,
+                                'id'        : impl_id}
+                fill_in_fields(temp_result.only_in_source,  field_values)
+                fill_in_fields(temp_result.only_in_target,  field_values)
+                fill_in_fields(temp_result.modified,        field_values)
+                result.extend(temp_result)
+        
+        return result
+    
+    def create_temp_features(self, configuration):
+        """
+        Create all temporary features for the implementations in this container.
+        
+        @param configuration: The configuration where the temporary features are
+            to be created.
+        @return: A list containing the references of all created temporary features.
+        
+        @raise exceptions.AlreadyExists: Any of the temporary features already exists
+            in the configuration, or there are duplicate temporary features defined.
+        """
+        # ----------------------------------------------------
+        # Collect a list of all temporary variable definitions
+        # and check for duplicates and already existing
+        # features at the same time
+        # ----------------------------------------------------
+        tempvar_defs = []
+        files_by_refs = {}
+        dview = configuration.get_default_view()
+        
+        for impl in self:
+            for fea_def in impl.get_temp_variable_definitions():
+                # Check if already exists
+                try:
+                    dview.get_feature(fea_def.ref)
+                    raise exceptions.AlreadyExists(
+                        "Temporary variable '%s' defined in file '%s' already exists in the configuration!" \
+                        % (fea_def.ref, impl.ref))
+                except exceptions.NotFound:
+                    pass
+                
+                # Add to temporary dictionary for duplicate checking
+                if fea_def.ref not in files_by_refs:
+                    files_by_refs[fea_def.ref] = []
+                files_by_refs[fea_def.ref].append(impl.ref)
+                
+                # Add to the list of all temp feature definitions
+                tempvar_defs.append(fea_def)
+        
+        # Check for duplicates
+        for ref, file_list in files_by_refs.iteritems():
+            if len(file_list) > 1:
+                raise exceptions.AlreadyExists(
+                    "Duplicate temporary variable! '%s' defined in the following files: %r" \
+                    % (ref, file_list))
+        del files_by_refs
+        
+        
+        # ------------------------------
+        # Create the temporary variables
+        # ------------------------------
+        refs = []
+        if tempvar_defs:
+            logging.getLogger('cone').debug('Creating %d temporary variable(s)' % len(tempvar_defs))
+            autoconfig = get_autoconfig(configuration)
+            for fea_def in tempvar_defs:
+                fea_def.create_feature(autoconfig)
+                refs.append(fea_def.ref)
+            
+            # The default view needs to be recreated, or the created
+            # features will not be visible there
+            configuration.recreate_default_view()
+        return refs
+    
+    def get_relation_container(self):
+        """
+        Return a relation container containing all rules from this set
+        of implementation instances.
+        """
+        container = RelationContainer([], '<root>')
+        for impl in self:
+            c = impl.get_relation_container()
+            if isinstance(c, RelationContainer):
+                container.entries.append(c)
+        return container
+    
+    def get_all_implementations(self):
+        """
+        Return a flattened list of all implementation instances in this set.
+        
+        The returned list contains only actual implementation instances, not
+        ImplContainer objects.
+        """
+        # Get a list of implementation objects sorted by file name
+        impl_list = list(self)
+        impl_list.sort(key=lambda impl: impl.ref)
+        
+        result = []
+        for impl in impl_list:
+            result += impl.get_all_implementations()
+        return result
+
+
+class RelationExecutionResult(object):
+    """
+    Class representing a result from relation execution.
+    """
+    def __init__(self, input_refs, affected_refs, source=None, index=None):
+        """
+        @param input_refs: Input references, i.e. the references on the left side of
+            the relation.
+        @param affected_refs: Affected references, i.e. the references of the setting
+            that have been assigned something as a result of the relation execution.
+        @param source: The source of the relation. Can be e.g. the path to a RuleML file.
+        @param index: The index (number) of the relation in the source. This could be
+            e.g. 1 to denote the first rule in a RuleML file.
+        """
+        self.input_refs = input_refs
+        self.affected_refs = affected_refs
+        self.source = source
+        self.index = index
+    
+    def __repr__(self):
+        return "RelationExecutionResult(input_refs=%r, affected_refs=%r, source=%r, index=%r)" \
+            % (sorted(self.input_refs), sorted(self.affected_refs), self.source, self.index)
+    
+    def __eq__(self, other):
+        if type(self) is not type(other):
+            return False
+        return sorted(self.input_refs) == sorted(other.input_refs) \
+            and sorted(self.affected_refs) == sorted(other.affected_refs) \
+            and self.source == other.source \
+            and self.index == other.index
+    
+    def __ne__(self, other):
+        return not (self == other)
+
+class RelationContainer(object):
+    """
+    A relation container that may contain relations or other
+    RelationContainer objects.
+    """
+    def __init__(self, entries=[], source=None):
+        """
+        @param entries: The relations or relation containers to be added.
+        @param source: The source of the relations in this container. Can be
+            e.g. the path to a RuleML file.
+        """
+        self.entries = entries
+        self.source = source
+        
+    def execute(self):
+        """
+        Execute all relations inside the container, logging any exceptions thrown
+        during the execution.
+        @return: A list of RelationExecutionResult objects.
+        """
+        results = []
+        for i, entry in enumerate(self.entries):
+            if isinstance(entry, rules.RelationBase):
+                result = self._execute_relation_and_log_error(entry, self.source, i + 1)
+                if isinstance(RelationExecutionResult):
+                    results.append(result)
+            elif isinstance(entry, RelationContainer):
+                results.extend(self._execute_container_and_log_error(entry))
+            else:
+                logging.getLogger('cone').warning("Invalid RelationContainer entry: type=%s, obj=%r" % (type(entry), entry))
+        return results
+    
+    def _execute_relation_and_log_error(self, relation, source, index):
+        """
+        Execute a relation, logging any exceptions that may be thrown.
+        @param relation: The relation to execute.
+        @param source: The source of the rule.
+        @param index: The index of the rule, can be None if the index is not known.
+        @return: The return value from the relation execution, or None if an error occurred.
+        """
+        try:
+            return relation.execute()
+        except Exception, e:
+            log = logging.getLogger('cone')
+            if index is not None:
+                utils.log_exception(log, "Error executing rule no. %s in '%s'" % (index, source))
+            else:
+                utils.log_exception(log, "Error executing a rule in '%s'" % relation_or_container.source)
+            return None
+    
+    def _execute_container_and_log_error(self, container):
+        """
+        Execute a relation container, logging any exceptions that may be thrown.
+        @param relation: The relation container to execute.
+        @return: The results from the relation execution, or an empty list if an error occurred.
+        """
+        try:
+            return container.execute()
+        except Exception, e:
+            log = logging.getLogger('cone')
+            utils.log_exception(log, "Error executing rules in '%s'" % container.source)
+            return []
+    
+    def get_relation_count(self):
+        """
+        Return the number of relations in this container.
+        """
+        count = 0
+        for entry in self.entries:
+            if isinstance(entry, RelationContainer):
+                count += entry.get_relation_count()
+            else:
+                count += 1
+        return count
+    
+
+class ImplFactory(api.FactoryBase):
+
+    __registered_reader_classes = None
+    __registered_reader_classes_override = None
+    __common_reader_classes = [ImplContainerReader]
+    
+    @classmethod
+    def get_reader_classes(cls):
+        """
+        return a list of reader classes
+        """
+        reader_classes = cls.__common_reader_classes[:]
+        # If the reader class list is overridden, return that
+        if cls.__registered_reader_classes_override is not None:
+            reader_classes += cls.__registered_reader_classes_override
+        else:
+            # Load the classes if not loaded already
+            if cls.__registered_reader_classes is None:
+                cls.__registered_reader_classes = cls.__load_reader_classes()
+            reader_classes += cls.__registered_reader_classes
+            
+        return reader_classes
+    
+    @classmethod
+    def get_reader_dict(cls):
+        """
+        return a dictionary of reader classes, where key is the reader namespace
+        """
+        reader_dict = {}
+        for reader in cls.get_reader_classes():
+            reader_dict[reader.NAMESPACE] = reader
+        return reader_dict
+
+    @classmethod
+    def get_supported_file_extensions(cls):
+        """
+        return a dictionary of reader classes, where key is the reader namespace
+        """
+        file_extensions = []
+        for reader in cls.get_reader_classes():
+            for fe in reader.FILE_EXTENSIONS:
+                file_extensions.append(fe.lower()) 
+        return file_extensions
+
+    @classmethod
+    def set_reader_classes_override(cls, reader_classes):
+        """
+        Override the list of registered reader classes.
+        
+        This method is provided for unit tests.
+        @param reader_classes: Reader class list to use as override. Pass None to
+            disable overriding.
+        """
+        cls.__registered_reader_classes_override = reader_classes
+    
+    @classmethod
+    def force_reload_reader_classes(cls):
+        """
+        Force-reload all reader classes.
+        """
+        cls.__registered_reader_classes = cls.__load_reader_classes()
+    
+    @classmethod
+    def __load_reader_classes(cls):
+        """
+        Load all registered ImplML reader classes from plug-ins.
+        """
+        log = logging.getLogger('cone')
+        log.setLevel(logging.DEBUG)
+        reader_classes = []
+        ENTRY_POINT = 'cone.plugins.implmlreaders'
+        
+        import pkg_resources
+        working_set = pkg_resources.WorkingSet(sys.path)
+        for entry_point in working_set.iter_entry_points(ENTRY_POINT):
+            reader_class = entry_point.load()
+            if not inspect.isclass(reader_class):
+                log.warn("'%s' entry point '%s' is not a class (%r)" % (ENTRY_POINT, entry_point.name, reader_class))
+            elif not issubclass(reader_class, ReaderBase):
+                log.warn("'%s' entry point '%s' is not a sub-class of cone.plugin.ReaderBase (%r)" % (ENTRY_POINT, entry_point.name, reader_class))
+            else:
+                msg = "Reader class for XML namespace '%s' loaded from egg '%s' entry point '%s'" % (reader_class.NAMESPACE, ENTRY_POINT, entry_point.name)
+                log.debug(msg)
+                #print msg
+                reader_classes.append(reader_class)
+                
+        return reader_classes
+
+    @classmethod
+    def is_supported_impl_file(cls, file_name):
+        """
+        Return whether the given file is a supported implementation file.
+        """
+        ext = os.path.splitext(file_name)[1]
+        if ext is not None:
+            return ext[1:].lower() in cls.get_supported_file_extensions()
+        else:
+            return False
+    
+    @classmethod
+    def get_impls_from_file(cls, resource_ref, configuration):
+        """
+        Get a list of implementation instances from the given file (resource in a configuration).
+        
+        @param resource_ref: Reference of the resource to read the impls from.
+        @param configuration: The configuration to use.
+        @return: List of implementation instances parsed and created from the file.
+        
+        @raise NotSupportedException: The file contains an XML namespace that is
+            not registered as an ImplML namespace.
+        """
+        try:
+            impls = []
+            reader_dict = cls.get_reader_dict()
+            root = ReaderBase._read_xml_doc_from_resource(resource_ref, configuration)
+            ns = utils.xml.split_tag_namespace(root.tag)[0]
+            if ns not in reader_dict.keys():
+                logging.getLogger('cone').error("Error: no reader for namespace '%s' in %s" % (ns, resource_ref))
+                return []
+            rc = reader_dict[ns]
+            # return the single implementation as a list to maintain 
+            # backwards compability
+            impl = rc.read_impl(resource_ref, configuration, root)
+            impl.index = 0
+            return [impl]
+        except exceptions.ParseError, e:
+            # Invalid XML data in the file
+            logging.getLogger('cone').error("Implementation %s reading failed with error: %s" % (resource_ref,e))
+            return []
+
+def get_impl_set(configuration,filter='.*'):
+    """
+    return a ImplSet object that contains all implementation objects related to the 
+    given configuration
+    """
+    impls = configuration.get_layer().list_implml()
+    impls = pre_filter_impls(impls)
+    # filter the resources with a given filter
+    impls = utils.resourceref.filter_resources(impls,filter)
+    impl_container = create_impl_set(impls,configuration)
+    return impl_container
+
+def filtered_impl_set(configuration,pathfilters=None, reffilters=None):
+    """
+    return a ImplSet object that contains all implementation objects related to the 
+    given configuration
+    """
+    if pathfilters: logging.getLogger('cone').info('Filtering impls with %s' % pathfilters)
+    impls = configuration.get_layer().list_implml()
+    impls = pre_filter_impls(impls)
+    # filter the resources with a given filter
+    if pathfilters:
+        newimpls = []
+        for filter in pathfilters:
+            newimpls += utils.resourceref.filter_resources(impls,filter)
+        impls = utils.distinct_array(newimpls)
+    impl_container = create_impl_set(impls,configuration,reffilters)
+    return impl_container
+
+def create_impl_set(impl_filename_list, configuration,reffilters=None):
+    impl_filename_list = pre_filter_impls(impl_filename_list)
+    if reffilters: logging.getLogger('cone').info('Filtering with refs %s' % reffilters)
+    impl_container = ImplSet()
+    for impl in impl_filename_list:
+        try:
+            if configuration != None and ImplFactory.is_supported_impl_file(impl):
+                plugin_impls = ImplFactory.get_impls_from_file(impl, configuration)
+                for plugin_impl in plugin_impls:
+                    if not reffilters or plugin_impl.has_ref(reffilters):
+                        impl_container.add_implementation(plugin_impl)
+        except Exception, e:
+            utils.log_exception(logging.getLogger('cone'), "Creating impl '%s' failed. Exception: %s" % (impl,e))
+            continue
+    return impl_container
+
+def pre_filter_impls(impls):
+    """
+    Pre-filter implementation file refs so that files and directories
+    beginning with a dot (e.g. '.svn', '.scripts') are ignored.
+    """
+    filter = r'(/|^|\\)\..*(/|$|\\)'
+    return utils.resourceref.neg_filter_resources(impls, filter)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/rules.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,767 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import operator as ops
+import logging
+import tokenize
+from token import ENDMARKER, NAME, ERRORTOKEN
+import StringIO
+
+from cone.public import container
+
+RELATIONS = {}
+
+def abstract():
+    import inspect
+    caller = inspect.getouterframes(inspect.currentframe())[1][3]
+    raise NotImplementedError(caller + ' needs to be implemented')
+
+def get_tokens(tokenstr):
+    result = []
+    tokens = []
+    tokenstr = tokenstr.replace('\r', '')
+    name_buffer = [] # Temp buffer for reading name tokens
+    last_epos = None
+    for toknum, tokval, spos, epos, _  in tokenize.generate_tokens(StringIO.StringIO(unicode(tokenstr)).readline):
+        #print "toknum: %r, tokval: %r, spos: %r, epos: %r" % (toknum, tokval, spos, epos)
+        val = tokval.strip('\r\n\t ')
+        
+        if toknum == ENDMARKER and name_buffer:
+            tokens.append(''.join(name_buffer))
+        
+        # Ignore whitespace (this ignores also the end marker,
+        # since its value is empty)
+        if val == '': continue
+        
+        # Put NAME, and ERRORTOKEN tokens through the temp
+        # buffer
+        if toknum in (NAME, ERRORTOKEN):
+            # If this and the previous token in the temp buffer are not adjacent,
+            # they belong to separate tokens
+            if name_buffer and spos[1] != last_epos[1]:
+                tokens.append(''.join(name_buffer))
+                name_buffer = []
+            
+            name_buffer.append(val)
+            last_epos = epos
+        # Other tokens can just go directly to the token list
+        else:
+            if name_buffer:
+                tokens.append(''.join(name_buffer))
+                name_buffer = []
+            tokens.append(val)
+    
+    while len(tokens) > 0:
+        val = tokens.pop(0)
+        # Join the refs with dot in between them to make them dotted refs
+        if val == '.':
+            newval = ".".join([result.pop(),tokens.pop(0)])
+            result.append( newval )
+        else:
+            result.append( val )
+
+    return result
+
+class RelationException(Exception):
+    pass
+
+#### The containers are here ####
+
+
+class RelationBase(object):
+    """
+    RelationBase defines a base class for all named relations that can be applied between objects. 
+    e.g. Relation depends, that can be applied in Rule
+    """
+    relation_name = "RelationBase"
+    def __init__(self, data, left, right):
+        self.description = ""
+        self.data = data or container.DataContainer()
+        self.left = left
+        self.right = right
+
+    def __str__(self):
+        """
+        @return: A string presentation of the relation object
+        """
+        return "%s %s %s" % (self.left,self.relation_name,self.right)
+
+    def get_name(self):
+        """
+        @return: The relation name.
+        """
+        return self.relation_name
+
+    def get_description(self):
+        """
+        @return: a possible description of the relation.
+        """
+        return self.description
+        
+    def execute(self):
+        """
+        Execute the relation object.
+        """
+        pass
+
+
+class RelationContainer(RelationBase, list):
+    """
+    This class provides the RelationContainer interface for collecting
+    relation sets into one place which can be executed through the container.
+    """
+    def __init__(self, data=None):
+        super(RelationContainer, self).__init__(data, 'LContainer', 'RContainer')
+        self.value_list = list()
+
+    def append(self, value):
+        self.value_list.append(value)
+
+    def __iter__(self):
+        return self.value_list.__iter__()
+
+    def __len__(self):
+        return len(self.value_list)
+
+    def __or__(self, other):
+        """
+        This function adds two RelationContainers to each other and removes
+        duplicates from the result.
+        The modification is inplace and the returned value is called object.
+        """
+        self.value_list = set(self.value_list) | set(other.value_list)
+        return self
+
+    def __unicode__(self):
+        if self:
+            ret = ''
+            for value in self:
+                ret += unicode(value)
+        else:
+            ret = 'No relations'
+        return ret
+
+    def find_relations(self, refs): abstract()
+    def add_relation(self, relation): abstract()
+    def has_errors(self): abstract()
+
+class RelationContainerImpl(RelationContainer):
+    """ Base implementation for RelationContainer to use in ConE rules
+    """
+    def execute(self):
+        ret = True
+        i = 0
+        for relation in self:
+            i += 1
+            r = relation.execute()
+            ret = ret and r
+        return ret
+
+    def find_relations(self, refs):
+        relations = []
+        for ref in refs:
+            for relation in self:
+                if relation.has_ref(ref):
+                    relations.append(relation)
+        return relations
+
+    def add_relation(self, relation):
+        self.append(relation)
+
+    def has_ref(self, refs):
+        for ref in refs:
+            for relation in self:
+                if relation.has_ref(ref):
+                    return True
+        return False
+
+    def has_errors(self):
+        for relation in self:
+            if relation.has_errors():
+                return True
+        return False
+            
+    def get_errors(self):
+        errors = []
+        for relation in self:
+            errors += relation.get_errors()
+        return errors
+
+#### The relations are here ####
+
+class BaseRelation(RelationBase):
+    """ BaseRelation implements the basic evaluation logic for relations
+    This class abstract and should be extended for concrete implementation of
+    relation type.
+
+    Subclasses need to set their own context in their constructor before this
+    class's constructor is called if custom context is needed. If context not
+    set then DefaultContext is used.
+    """
+    KEY = 'base_relation'
+
+    def __init__(self, data, left, right):
+        # Context needs to be overridden for special purposes
+        try:
+            self.__getattribute__('context')
+        except AttributeError:
+            self.context = DefaultContext(data)
+
+        left = self.expand_rule_elements(left)
+        right = self.expand_rule_elements(right)
+        super(BaseRelation, self).__init__(data, left, right)
+        self.interpreter = ASTInterpreter(context=self.context)
+
+    def execute(self):
+        """
+        @return Returns error dictionary
+
+        In the client code proper way to check if the rule applies:
+        info = relation.execute()
+        if not info.has_errors():
+        else: HANDLE ERRORS
+        """
+        # logger.debug("Interpreter context %s" % self.interpreter.context)
+        self.interpreter.create_ast('%s %s %s' % (self.left, self.KEY, self.right))
+        ret = self.interpreter.eval()
+        return ret
+
+    def get_keys(self):
+        """ Returns the references from this relation.
+        """
+        refs = ASTInterpreter.extract_refs(self.left)
+        refs += ASTInterpreter.extract_refs(self.right)
+        return refs
+
+    def has_ref(self, ref):
+        """ Returns if the 'ref' is included in this relation
+        """
+        return ref in self.get_keys()
+
+    def has_errors(self):
+        return bool(self.interpreter.errors)
+
+    def get_refs(self):
+        return (ASTInterpreter.extract_refs(self.left), ASTInterpreter.extract_refs(self.right))
+
+    def _eval_rside_value(self, value): abstract()
+    def _compare_value(self, value): abstract()
+
+    def extract_erroneus_features_with_values(self):
+        """
+        Extract references who have errors.
+
+        Returns dictionary { 'reference' : 'value' }
+        """
+        data_dict = {}
+        for ref in ASTInterpreter.extract_refs(self.right):
+            value = self.data.get_feature(ref)
+            if self._compare_value(value):
+                data_dict[ref] = value
+            elif value == None:
+                data_dict[ref] = None
+        return data_dict
+
+    def get_errors(self):
+        return self.interpreter.errors
+
+    def expand_rule_elements(self, rule):
+        """ Expans rule elements base on the reference.
+        Context is used for fetching the child elements for parent references
+        which uses asterisk identifier for selecting all child features: 
+        'parent_feature.*' -> 'child_fea_1 and child_fea_2'.
+        """
+        tokens = get_tokens(rule) # [token for token in rule.split()]
+
+        expanded_rule = ""
+        for token in tokens:
+            if token.endswith('.*'):
+                index = token.index('.*')
+                parent_ref = token[:index]
+                children = self.context.get_children_for_reference(parent_ref)
+                expanded_element = ' and '.join([child.reference for child in children])
+                if expanded_rule:
+                    expanded_rule = '%s and %s' % (expanded_rule, expanded_element.rstrip())
+                else:
+                    expanded_rule = expanded_element.rstrip()
+            elif token.lower() in OPERATORS:
+                expanded_rule += ' %s ' % token
+            else:
+                if expanded_rule:
+                    expanded_rule += '%s'% token
+                else:
+                    expanded_rule = token
+        return expanded_rule.strip()
+
+class RequireRelation(BaseRelation):
+    KEY = 'requires'
+RELATIONS[RequireRelation.KEY] = RequireRelation
+
+class ExcludesRelation(BaseRelation):
+    KEY = 'excludes'
+
+RELATIONS['excludes'] = ExcludesRelation
+
+################################
+# Abstract syntax tree builder #
+################################
+
+def nor(expression, a, b):
+    return not ops.or_(a, b)
+
+def nand(expression, a, b):
+    return not ops.and_(a, b)
+
+def truth_and(expression, a, b):
+    return ops.truth(a) and ops.truth(b)
+
+class DefaultContext(object):
+    """ DefaultContext implements ConE specific context for handling rules
+    """
+    def __init__(self, data):
+        self.data = data
+
+    def eval(self, ast, expression, value):
+        pass
+
+    def get_keys(self, refs):
+        return ASTInterpreter.extract_refs(refs)
+
+    def get_children_for_reference(self, reference):
+        # implement ConE specific children expansion
+        pass
+
+    def handle_terminal(self, expression):
+        try:
+            return int(expression)
+        except:
+            return expression
+
+PRECEDENCES = {
+    'PREFIX_OPERATORS' : 10,
+    'MULDIV_OPERATORS' : 8,
+    'ADDSUB_OPERATORS' : 7,
+    'SHIFT_OPERATORS' : 6,
+    'BITWISE_OPERATORS' : 5,
+    'COMPARISON_OPERATORS' : 4,
+    'SET_OPERATORS' : 3,
+    'BOOLEAN_OPERATORS' : 2, 
+    'RELATION_OPERATORS' : 1,
+    'NOT_DEFINED' : 0
+}
+
+class Expression(object):
+    PRECEDENCE = PRECEDENCES['NOT_DEFINED']
+    KEY = 'base_expression'
+
+    def __init__(self, ast):
+        self.ast = ast
+        self.value = None
+
+    def get_title(self):
+        return self.KEY
+
+    def eval(self, context): pass
+
+class OneParamExpression(Expression):
+    PARAM_COUNT = 1
+    def __init__(self, ast, expression):
+        super(OneParamExpression, self).__init__(ast)
+        self.expression = expression
+
+    def __unicode__(self):
+        return u'%s %s' % (self.KEY, self.expression)
+
+    def eval(self, context):
+        self.value = self.OP(self.expression.eval(context))
+        context.eval(self.ast, self, self.value)
+        return self.value
+
+class TwoOperatorExpression(Expression):
+    PARAM_COUNT = 2
+    OP = None
+    EVAL_AS_BOOLS = True
+
+    def __init__(self, ast, left, right):
+        super(TwoOperatorExpression, self).__init__(ast)
+        self.left = left
+        self.right = right
+
+    def __unicode__(self):
+        return u'%s %s %s' % (self.left, self.KEY, self.right)
+
+    def eval(self, context):
+        self.value = self.OP(self.left.eval(context), self.right.eval(context))
+        context.eval(self.ast, self, self.value)
+        return self.value
+
+class TwoOperatorBooleanExpression(TwoOperatorExpression):
+    def eval(self, context):
+        self.value = self.OP(bool(self.left.eval(context)), bool(self.right.eval(context)))
+        context.eval(self.ast, self, self.value)
+        return self.value         
+
+class TerminalExpression(Expression):
+    KEY = 'terminal'
+
+    def __init__(self, ast, expression):
+        super(TerminalExpression, self).__init__(ast)
+        self.expression = expression
+
+    def eval(self, context):
+        """ Use context to eval the value
+        Expression on TerminalExpression is feature reference or value
+        context should handle the reference conversion to correct value
+        """
+        self.value = context.handle_terminal(self.expression)
+        return self.value
+
+    def __unicode__(self):
+        return self.expression
+    
+    def __repr__(self):
+        return self.expression
+
+class NegExpression(OneParamExpression):
+    PRECEDENCE = PRECEDENCES['PREFIX_OPERATORS']
+    KEY= '-'
+    OP = ops.neg
+
+class AndExpression(TwoOperatorBooleanExpression):
+    PRECEDENCE = PRECEDENCES['BOOLEAN_OPERATORS']
+    KEY= 'and'
+    OP = truth_and
+
+class NandExpression(TwoOperatorBooleanExpression):
+    PRECEDENCE = PRECEDENCES['BOOLEAN_OPERATORS']
+    KEY = 'nand'
+    OP = nand
+
+class OrExpression(TwoOperatorBooleanExpression):
+    PRECEDENCE = PRECEDENCES['BOOLEAN_OPERATORS']
+    KEY = 'or'
+    OP = ops.or_
+
+class XorExpression(TwoOperatorBooleanExpression):
+    PRECEDENCE = PRECEDENCES['BOOLEAN_OPERATORS']
+    KEY = 'xor'
+    OP = ops.xor
+
+class NorExpression(TwoOperatorBooleanExpression):
+    PRECEDENCE = PRECEDENCES['BOOLEAN_OPERATORS']
+    KEY = 'nor'
+    OP = nor
+
+class EqualExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '=='
+    OP = ops.eq
+
+class NotEqualExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '!='
+    OP = ops.ne
+
+class LessThanExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '<'
+    OP = ops.lt
+
+class GreaterThanExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '>'
+    OP = ops.gt
+
+class LessThanEqualExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '<='
+    OP = ops.le
+
+class GreaterThanEqualExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['COMPARISON_OPERATORS']
+    KEY = '>='
+    OP = ops.ge
+
+
+def handle_require(expression, left, right):
+    if left and right:
+        return True
+    elif not left:
+        return True
+    return False
+
+class RequireExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['RELATION_OPERATORS']
+    KEY = 'requires'
+    OP = handle_require
+
+    def eval(self, context):
+        super(RequireExpression, self).eval(context)
+        if not self.value:
+            left_keys = []
+            for ref in self.ast.extract_refs(unicode(self.left)):
+                for key in context.get_keys(ref):
+                    left_keys.append(key)
+
+            for key in left_keys:
+                self.ast.add_error(key, { 'error_string' : 'REQUIRES right side value is "False"',
+                                          'left_key' : key,
+                                          'rule' : self.ast.expression
+                                          })
+        return self.value
+
+def handle_exclude(expression, left, right):
+    if left and not right:
+        return True
+    elif not left:
+        return True
+    return False
+
+class ExcludeExpression(TwoOperatorExpression):
+    PRECEDENCE = PRECEDENCES['RELATION_OPERATORS']
+    KEY = 'excludes'
+    OP = handle_exclude
+
+    def eval(self, context):
+        super(ExcludeExpression, self).eval(context)
+        if not self.value:
+            left_keys = []
+            for ref in self.ast.extract_refs(unicode(self.left)):
+                for key in context.get_keys(ref):
+                    left_keys.append(key)
+                    
+            for key in left_keys:
+                self.ast.add_error(key, { 'error_string' : 'EXCLUDE right side value is "True"',
+                                          'left_key' : key,
+                                          'rule' : self.ast.expression
+                                          })
+        return self.value
+
+
+class NotExpression(OneParamExpression):
+    PRECEDENCE = PRECEDENCES['PREFIX_OPERATORS']
+    KEY = 'not'
+    OP = ops.not_
+
+class TruthExpression(OneParamExpression):
+    PRECEDENCE = PRECEDENCES['PREFIX_OPERATORS']
+    KEY = 'truth'
+    OP = ops.truth
+
+LEFT_PARENTHESIS = '('
+RIGHT_PARENTHESIS = ')'
+class SimpleCondition(EqualExpression):
+    """
+    A simple condition object that can refer to a model object and evaluate if the value matches  
+    """
+    def __init__(self, left, right):
+        lterm = TerminalExpression(None, left)
+        rterm = TerminalExpression(None, right)
+        EqualExpression.__init__(self, None, lterm, rterm)
+
+
+# in format KEY : OPERATOR CLASS
+OPERATORS = {
+    'and' : AndExpression,
+    'nand' : NandExpression,
+    'or' : OrExpression,
+    'xor' : XorExpression,
+    'nor' : NorExpression,
+    'not' : NotExpression,
+    'truth' : TruthExpression,
+    '==' : EqualExpression,
+    '!=' : NotEqualExpression,
+    '<' : LessThanExpression,
+    '>' : GreaterThanExpression,
+    '<=' : LessThanEqualExpression,
+    '>=' : GreaterThanEqualExpression,
+    'requires' : RequireExpression,
+    'excludes' : ExcludeExpression,
+    '-' : NegExpression
+    }
+
+def add_operator(key, operator_class=None, baseclass=RequireExpression):
+    """
+    Add new operator key and operator class.
+    If operator class isn't provided the baseclass parameter is used as
+    operator base. The baseclass parameter is RequireExpression by default
+    which has success condition left_rule=True and right_rule=True
+    
+    """
+    OPERATORS[key] = operator_class or create_new_class(key, baseclass)
+
+def create_new_class(key, baseclass):
+    ns = baseclass.__dict__.copy()
+    ns['KEY'] = key
+    key_pieces = key.split('_')
+    class_prefix = ''.join([key_piece.capitalize() for key_piece in key_pieces])
+    new_class = type(class_prefix + 'Expression', (baseclass,), ns)
+    return new_class
+
+class ParseException(Exception): pass
+
+class ASTInterpreter(object):
+    def __init__(self, infix_expression=None, context=None):
+        """ Takes infix expression as string """
+        self.context = context or DefaultContext(None)
+        # logger.debug("AST init context: %s" % self.context)
+        self._init_locals(infix_expression)
+        if infix_expression:
+            self.create_ast()
+
+    def _init_locals(self, infix_expression):
+        # The result value of full eval of the parse_tree
+        self.value = None
+        self.warnings = {}
+        self.errors = {}
+        self.postfix_array = []
+        self.parse_tree = []
+        self.expression = infix_expression
+
+    def __unicode__(self):
+        s = ''
+        for expr in self.parse_tree:
+            s += unicode(expr)
+        return s
+
+    def add_error(self, key, error_dict):
+        if self.errors.has_key(key):
+            self.errors[key].append(error_dict)
+        else:
+            self.errors[key] = [error_dict]
+
+    def create_ast(self, infix_expression=None):
+        if infix_expression:
+            self._init_locals(infix_expression)
+        self._infix_to_postfix()
+        self._create_parse_tree()
+        return self.parse_tree
+
+    def _infix_to_postfix(self):
+        """
+        Shunting yard algorithm used to convert infix presentation to postfix.
+        """
+        if not self.expression:
+            raise ParseException('Expression is None')
+        tokens = get_tokens(self.expression) # [token for token in self.expression.split()]
+        stack = []
+        # logger.debug('TOKENS: %s' % tokens)
+        for token in tokens:
+            # logger.debug('TOKEN: %s' % token)
+            if token.lower() in OPERATORS:
+                op_class = OPERATORS.get(token)
+                if stack:
+                    while len(stack) != 0:
+                        top = stack[-1]
+                        if top in OPERATORS:
+                            top_operator = OPERATORS.get(top)
+                            if op_class.PRECEDENCE <= top_operator.PRECEDENCE:
+                                self.postfix_array.append(stack.pop())
+                            else:
+                                # Break from loop if top operator precedence is less.
+                                break
+                        else:
+                            # If top not operator break from loop
+                            break
+                stack.append(token)
+            elif token == LEFT_PARENTHESIS:
+                # logger.debug('Left parenthesis')
+                stack.append(token)
+            elif token == RIGHT_PARENTHESIS:
+                # logger.debug('Right parenthesis')
+                left_par_found = False
+                stack_token = stack.pop()
+                while stack_token:
+                    if stack_token != LEFT_PARENTHESIS:
+                        self.postfix_array.append(stack_token)
+                    else:
+                        left_par_found = True
+                        break
+                    if stack:
+                        stack_token = stack.pop()
+                    else:
+                        stack_token = None
+                        
+                if not left_par_found:
+                    raise ParseException('Mismatched parenthesis "%s".' % LEFT_PARENTHESIS)
+            else:
+                # logger.debug('Adding value to output. %s' % repr((token)))
+                self.postfix_array.append((token))
+            
+        # There should be only operators left in the stack
+        if stack:
+            # logger.debug('Operators in stack.')
+            operator = stack.pop()
+            while operator:
+                if operator != LEFT_PARENTHESIS:
+                    self.postfix_array.append(operator)
+                else:
+                    raise ParseException('Mismatched parenthesis "%s".' % LEFT_PARENTHESIS)
+                if stack:
+                    operator = stack.pop()
+                else:
+                    operator = None
+
+        # logger.debug('Infix to postfix conversion: %s' % self.postfix_array)
+        return self.postfix_array
+    
+    def _create_parse_tree(self):
+        self.parse_tree = []
+        for token in self.postfix_array:
+            if token in OPERATORS:
+                # logger.debug('OP: %s' % (token))
+                expression_class = OPERATORS[token]
+                params = []
+                for i in range(expression_class.PARAM_COUNT):
+                    try:
+                        params.append(self.parse_tree.pop())
+                    except IndexError, e:
+                        raise ParseException('Syntax error: "%s"' % self.expression)
+                params.reverse()
+                expression = expression_class(self, *params)
+
+                # logger.debug('The operation: %s' % expression)
+                self.parse_tree.append(expression)
+            else:
+                expression = TerminalExpression(self, token)
+                self.parse_tree.append(expression)
+
+        #logger.debug('THE STACK: %s' % self.parse_tree)
+        #for s in self.parse_tree:
+        #    logger.debug('Stack e: %s' % str(s))
+
+        return self.parse_tree
+
+    def eval(self):
+        """ Evals the AST
+        If empty expression is given, None is returned
+        """
+        for expression in self.parse_tree:
+            self.value = expression.eval(self.context)
+        return self.value
+
+    @staticmethod
+    def extract_refs(expression):
+        tokens = get_tokens(expression)
+        refs = []
+        for token in tokens:
+            if not token.lower() in OPERATORS and token != LEFT_PARENTHESIS and token != RIGHT_PARENTHESIS:
+                refs.append(token.strip('%s%s' % (LEFT_PARENTHESIS, RIGHT_PARENTHESIS)))
+        return refs
+
+##################################################################
+# Create and configure the main level logger
+logger = logging.getLogger('cone')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/settings.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,92 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import os
+import logging
+import ConfigParser
+
+DEFAULT_SECTION = 'DEFAULT'
+class ConeSettings(object):
+    def __init__(self, parser, section=DEFAULT_SECTION):
+        self.parser = parser
+        self.section = section
+    
+    def get(self, property, default=None, vars=None):
+        """
+        Try to get a single property from the ConeSettings section. The method support the
+        ConfigParser interpolation of variables and deliver extra variables via the vars param.
+       
+        1. Try to get the property from configured section.
+        2. If section is not found try to get it from DEFAULT section.
+        3. Still if property is not found return the default values
+        @param property: the name of the setting property get
+        @param default: the default value to return if the property is not found from settings
+        @param vars: a dictionary of variables that are given to the ConfigParser get 
+        for interpolation. e.g. {'output':'testing'}.
+        
+        """
+        try:
+            return self.parser.get(self.section, property, False, vars)
+        # if the section is not found try to use default
+        except ConfigParser.NoSectionError:
+            try:
+                return self.parser.get(DEFAULT_SECTION, property, False, vars)
+            except ConfigParser.NoOptionError:
+                if default != None:
+                    return self.parser._interpolate(DEFAULT_SECTION,property,default,vars)
+                else:
+                    return default
+        # if the option is not found return the default value
+        except ConfigParser.NoOptionError:
+            if default != None:
+                return self.parser._interpolate(DEFAULT_SECTION,property,default,vars)
+            else:
+                return default
+            #return default
+            
+
+class SettingsFactory(object):
+    configsettings = None
+    configpath    = ''
+    defaultconfig = 'cone_defaults.cfg'
+    
+    @classmethod
+    def get_defaultconfig_path(cls):
+        return os.path.join(cls.configpath,cls.defaultconfig)
+    
+    @classmethod
+    def cone_parser(cls):
+        """
+        Get a singleton instance of ConfigParser.
+        """
+        if not cls.configsettings:
+            cls.configsettings = ConfigParser.ConfigParser()
+            
+            try:
+                cls.configsettings.readfp(open(cls.get_defaultconfig_path()))
+            except IOError:
+                logging.getLogger('cone').warning("Could not read default configuration file %s" % cls.get_defaultconfig_path())
+        return cls.configsettings
+    
+    @classmethod
+    def clear(cls):
+        """
+        Clear everything back to default so that the next time the settings are re-parsed.
+        
+        This method is provided for unit testing purposes.
+        """
+        cls.configsettings = None
+        cls.configpath    = ''
+        cls.defaultconfig = 'cone_defaults.cfg'
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/Import.pk	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,110 @@
+ccopy_reg
+_reconstructor
+p0
+(ccone.storage.stringstorage
+StringStorage
+p1
+c__builtin__
+object
+p2
+Ntp3
+Rp4
+(dp5
+S'_order'
+p6
+(lp7
+S'test1'
+p8
+aS'test2'
+p9
+aS'test3'
+p10
+asS'container'
+p11
+I01
+sS'_children'
+p12
+(dp13
+g8
+g0
+(ccone.storage.stringstorage
+_StringStorageObject
+p14
+g2
+Ntp15
+Rp16
+(dp17
+S'_parent'
+p18
+g4
+sg6
+(lp19
+sg12
+(dp20
+sS'path'
+p21
+S'test1.txt'
+p22
+sS'data'
+p23
+S'Testing reading.\n'
+p24
+sS'_name'
+p25
+g8
+sbsg10
+g0
+(g14
+g2
+Ntp26
+Rp27
+(dp28
+g18
+g4
+sg6
+(lp29
+sg12
+(dp30
+sg21
+S'test3.txt'
+p31
+sg23
+g24
+sg25
+g10
+sbsg9
+g0
+(g14
+g2
+Ntp32
+Rp33
+(dp34
+g18
+g4
+sg6
+(lp35
+sg12
+(dp36
+sg21
+S'test2.txt'
+p37
+sg23
+g24
+sg25
+g9
+sbssS'curpath'
+p38
+S''
+p39
+sS'rootpath'
+p40
+S'temp/unload.pk'
+p41
+sg25
+S'C:\\DocumentsandSettings\\teerytko\\workspace\\cone_trunk\\source\\cone\\public\\tests\\Import_pk'
+p42
+sg18
+NsS'ref'
+p43
+g42
+sb.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+if SOURCE_ROOT not in sys.path:
+    sys.path.append(SOURCE_ROOT)
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    sys.path.insert(0, ROOT_PATH)
+    try:
+        suite = unittest.TestSuite()
+        for test_module in __all__:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/test_defaults.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+
+[DEFAULT]
+output_root=output
+output_subdir=
+plugin_output=
+output=%(output_root)s/%(output_subdir)s/%(plugin_output)s
+
+plugin_targets = 'rofs2','rofs3'
+
+generate_targets = 'rofs3'
+generate_layers  = -1
+generate_impls   =
+
+[CRML]
+plugin_output=private/1234576
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_base.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils, container
+
+class TestBase(unittest.TestCase):    
+    # @test 
+    def test_create_base(self):
+        base = api.Base("foo")
+        self.assertTrue(base)
+
+    def test_get_namespace(self):
+        base= api.Base("foo")
+        self.assertTrue(base)
+        self.assertEquals(base.namespace,"")
+
+    def test_properties(self):
+        base= api.Base("foo")
+        self.assertTrue(base)
+        self.assertEquals(base.ref,"foo")
+        self.assertEquals(base.fqr,"foo")
+        self.assertEquals(base.get_fullref(),"foo")
+        self.assertEquals(base.get_fullfqr(),"foo")
+
+    def test_create_hiearchy(self):
+        base= api.Base("foo")
+        base._add(api.Base("bar"))
+        self.assertTrue(base)
+        self.assertEquals(base.bar.find_parent(type=api.Base),base)
+        self.assertEquals(base.bar.namespace, 'foo')
+        self.assertEquals(base.bar.fqr, 'foo.bar')
+        self.assertEquals(base.bar.get_fullfqr(), 'foo.bar')
+
+    def test_create_hiearchy_with_container(self):
+        cont= api.Base("", container=True)
+        base= api.Base("foo")
+        base._add(api.Base("bar1"))
+        base._add(api.Base("bar2"))
+        base.bar2._add(api.Base("bar21"))
+        cont._add(base)
+        self.assertTrue(base)
+        self.assertEquals(cont.foo.bar2.bar21.find_parent(container=True), cont)
+        self.assertEquals(cont.foo.bar1.find_parent(type=api.Base),base)
+        self.assertEquals(cont.foo.bar1.namespace, 'foo')
+        self.assertEquals(cont.foo.bar2.bar21.namespace, 'foo.bar2')
+        self.assertEquals(cont.foo.bar2.bar21.fqr, 'foo.bar2.bar21')
+
+    def test_create_hiearchy_with_container_and_hidden_elem(self):
+        cont= api.Base("", container=True)
+        base= api.Base("foo")
+        base._add(api.Base("bar1"))
+        base._add(api.Base("_bar2"))
+        base._bar2._add(api.Base("bar21"))
+        cont._add(base)
+        self.assertTrue(base)
+        self.assertEquals(cont.foo._bar2.bar21.find_parent(container=True), cont)
+        self.assertEquals(cont.foo.bar1.find_parent(type=api.Base),base)
+        self.assertEquals(cont.foo._bar2.bar21.get_fullnamespace(), 'foo._bar2')
+        self.assertEquals(cont.foo._bar2.bar21.get_fullfqr(), 'foo._bar2.bar21')
+        self.assertEquals(cont.foo.bar1.namespace, 'foo')
+        self.assertEquals(cont.foo._bar2.bar21.namespace, 'foo')
+        self.assertEquals(cont.foo._bar2.bar21.fqr, 'foo.bar21')
+
+    def test_create_hiearchy_with_append(self):
+        cont= api.Base("", container=True)
+        base= api.Base("foo")
+        base._add(api.Base("bar1"),container.APPEND)
+        base._add(api.Base("bar1"),container.APPEND)
+        base.bar1[0]._add(api.Base("bar21"))
+        cont._add(base)
+        self.assertTrue(base)
+        self.assertEquals(cont.foo.bar1[1].get_fullnamespace(),'foo')
+        self.assertEquals(cont.foo.bar1[0].get_fullref(),'bar1[0]')
+        self.assertEquals(cont.foo.bar1[1].get_fullref(),'bar1[1]')
+        self.assertEquals(cont.foo.bar1[0].get_fullfqr(), 'foo.bar1[0]')
+        self.assertEquals(cont.foo.bar1[1].get_fullfqr(), 'foo.bar1[1]')
+        self.assertEquals(cont.foo.bar1[0].bar21.get_fullnamespace(), 'foo.bar1[0]')
+        self.assertEquals(cont.foo.bar1[0].bar21.get_fullfqr(), 'foo.bar1[0].bar21')
+
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_configuration.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,852 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils
+from cone.storage import persistentdictionary
+from cone.confml import persistentconfml
+
+class TestConfiguration(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    # @test 
+    def test_create_configuration(self):
+        conf = api.Configuration("testmee.confml")
+        self.assertTrue(conf)
+
+    def test_get_root_configuration(self):
+        conf = api.Configuration("testmee.confml")
+        self.assertEquals(conf.get_root_configuration(),conf)
+        conf.add_configuration(api.Configuration("foo/foo.confml")) 
+        conf.add_configuration(api.Configuration("fii/fii.confml")) 
+        conf.fii__fii_confml.add_configuration(api.Configuration("fii/foo.confml"))
+        self.assertEquals(conf.fii__fii_confml.get_root_configuration(),conf)
+        self.assertEquals(conf.foo__foo_confml.get_root_configuration(),conf)
+        self.assertEquals(conf.fii__fii_confml.fii__foo_confml.get_root_configuration(),conf)
+
+    def test_get_last_configuration(self):
+        conf = api.Configuration("testmee.confml")
+        conf.add_configuration(api.Configuration("foo/foo.confml")) 
+        conf.add_configuration(api.Configuration("fii/fii.confml")) 
+        conf.add_configuration(api.Configuration("hii/hii.confml")) 
+        conf.fii__fii_confml.add_configuration(api.Configuration("fii/foo.confml"))
+        self.assertEquals(conf.list_configurations(), ["foo/foo.confml","fii/fii.confml","hii/hii.confml"])
+
+        self.assertEquals(conf.get_configuration_by_index(-1).get_path(), "hii/hii.confml")
+        self.assertEquals(conf.get_configuration_by_index(0).get_path(), "foo/foo.confml")
+        self.assertEquals(conf.get_configuration_by_index(1).get_path(), "fii/fii.confml")
+        self.assertEquals(conf.get_configuration_by_index(2).get_path(), "hii/hii.confml")
+
+    def compareconfiguration(self, conf1,conf2):
+        self.assertEquals(conf1.path,conf2.path)
+        self.assertEquals(conf1.name,conf2.name)
+        self.assertEquals(conf1.ref,conf2.ref)
+        self.assertEquals(conf1.namespace,conf2.namespace)
+ 
+    def test_clone_single_configuration(self):
+        conf1 = api.Configuration("testmee.confml")
+        conf1.add_feature(api.Feature('test1'))
+        conf1.add_feature(api.Feature('test2'))
+        conf1.add_feature(api.Feature('child1'),'test1')
+        dview = conf1.get_default_view()
+        dview.get_feature('test1').set_value('one')
+        dview.get_feature('test1.child1').set_value('subone')
+        conf2 = conf1._clone(recursion=True)
+        self.compareconfiguration(conf1, conf2)
+        self.assertEquals(conf2.list_all_features(),['test1', 'test1.child1', 'test2'])
+        dview2 = conf2.get_default_view()
+        self.assertEquals(dview2.get_feature('test1').get_value(),'one')
+        self.assertEquals(dview2.get_feature('test1.child1').get_value(),'subone')
+
+    def test_clone_configuration_with_includes(self):
+        conf1 = api.Configuration("testmee.confml")
+        conf1.add_feature(api.Feature('test1'))
+        conf1.add_feature(api.Feature('test2'))
+        conf1.add_feature(api.Feature('child1'),'test1')
+        conf1.create_configuration("confml/data.confml")
+        dview = conf1.get_default_view()
+        dview.get_feature('test1').set_value('one')
+        dview.get_feature('test1.child1').set_value('subone')
+        conf2 = conf1._clone(recursion=True)
+        self.compareconfiguration(conf1, conf2)
+        self.assertEquals(conf2.list_all_features(),['test1', 'test1.child1', 'test2'])
+        self.assertEquals(conf2.list_configurations(),['confml/data.confml'])
+        dview2 = conf2.get_default_view()
+        self.assertEquals(dview2.get_feature('test1').get_value(),'one')
+        self.assertEquals(dview2.get_feature('test1.child1').get_value(),'subone')
+
+#    def test_create_and_get_root(self):
+#        conf = api.Configuration("foobar/testmee.confml")
+#        self.assertEquals(conf.get_root(),"foobar/testmee.confml")
+
+class TestCompositeConfiguration(unittest.TestCase):    
+    def test_add(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        self.assertEquals(conf.list_configurations()[0],"laa")    
+
+    def test_add_and_access_via_member(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        self.assertEquals(conf.laa._name,"laa")    
+
+    def test_add_and_add_another_config_under(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf.laa._add(api.Configuration("foo"))
+        self.assertEquals(conf.laa.foo._name,"foo")    
+
+    def test_add_several_configurations(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf._add(api.Configuration("foo"))
+        conf._add(api.Configuration("faa"))
+        self.assertEquals(conf.list_configurations()[0],"laa")    
+        self.assertEquals(conf.list_configurations()[1],"foo")    
+        self.assertEquals(conf.list_configurations()[2],"faa")    
+
+    def test_add_several_and_remove_one_layer(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf._add(api.Configuration("foo"))
+        conf._add(api.Configuration("faa"))
+        conf._remove("foo")
+        
+        self.assertEquals(conf.list_configurations()[0],"laa")    
+        self.assertEquals(conf.list_configurations()[1],"faa")    
+
+    def test_add_several_and_remove_last_layer(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf._add(api.Configuration("foo"))
+        conf._add(api.Configuration("faa"))
+        conf._remove("faa")
+        self.assertEquals(conf.list_configurations()[0],"laa")    
+        self.assertEquals(conf.list_configurations()[1],"foo")    
+
+    def test_add_several_and_remove_all_configurations(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf._add(api.Configuration("foo"))
+        conf._add(api.Configuration("faa"))
+        for layername in conf.list_configurations():
+            conf._remove(layername)
+            
+        self.assertTrue(len(conf.list_configurations())==0)        
+
+    def test_add_several_and_try_to_remove_not_existing(self):
+        conf = api.Configuration("data/simple.confml")
+        layer = api.Configuration("laa")
+        conf._add(layer)
+        conf._add(api.Configuration("foo"))
+        conf._add(api.Configuration("faa"))
+        try:
+            conf._remove("notthere")
+            self.fail("removing of nonexisting layer succeeds!")
+        except exceptions.NotFound:
+            pass
+
+    def test_add_view_simple(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        view = conf.get_view("view1")
+        self.assertEquals(view._list(),[])
+        
+    def test_add_views_and_list_views(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        conf.add_view("view2")
+        self.assertEquals(conf.list_views(),['view1','view2'])
+
+    def test_add_views_and_remove_one(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        conf.add_view("view2")
+        conf.add_view("view3")
+        conf.remove_view('view2')
+        self.assertEquals(conf.list_views(),['view1','view3'])
+
+    def test_add_views_and_remove_invalid(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        conf.add_view("view2")
+        conf.add_view("view3")
+        try:
+            conf.remove_view('invalid')
+            self.fail('Removing invalid view succeeds!')
+        except exceptions.NotFound:
+            pass
+        
+    def test_add_views_and_remove_all(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        conf.add_view("view2")
+        conf.add_view("view3")
+        for view in conf.list_views():
+            conf.remove_view(view)
+        self.assertEquals(conf.list_views(),[])
+
+    def test_add_view_with_data(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.add_view("view1")
+        view = conf.get_view("view1")
+        view._add(api.Group("group1"))
+        view._add(api.Group("group2"))
+        view._add(api._FeatureProxy("feature1"))
+        view.group1._add(api.Group("group21"))
+        view.group1.group21._add(api._FeatureProxy("feature211"))
+        view.group1.group21._add(api._FeatureProxy("feature212"))
+        view.feature1._add(api._FeatureProxy("feature11"))
+        
+        self.assertEquals(sorted(view._list_traverse()),
+                          sorted(['group1', 
+                                          'group2', 
+                                          'feature1', 
+                                          'group1.group21', 
+                                          'group1.group21.feature211', 
+                                          'group1.group21.feature212', 
+                                          'feature1.feature11']))
+
+    def test_get_default_view(self):
+        conf = api.Configuration("data/simple.confml")
+        dview = conf.get_default_view()
+        self.assertEquals(dview.ref,'_default_view')
+
+    def test_get_default_view_and_data_to_it(self):
+        conf = api.Configuration("data/simple.confml")
+        view = conf.get_default_view()
+        view._add(api.Group("group1"))
+        view._add(api.Group("group2"))
+        view._add(api._FeatureProxy("feature1"))
+        view.group1._add(api.Group("group21"))
+        view.group1.group21._add(api._FeatureProxy("feature211"))
+        view.group1.group21._add(api._FeatureProxy("feature212"))
+        view.feature1._add(api._FeatureProxy("feature11"))
+        
+        self.assertEquals(sorted(view._list_traverse()),
+                          sorted(['group1', 
+                                           'group2', 
+                                           'feature1', 
+                                           'group1.group21', 
+                                           'group1.group21.feature211', 
+                                           'group1.group21.feature212', 
+                                           'feature1.feature11']))
+
+
+    def test_add_feature_normal_configuration(self):
+        conf = api.Configuration("simple.confml")
+        conf.add_feature(api.Feature("feature1"))
+        self.assertEquals(conf.list_all_features(),['feature1'])
+
+    def test_add_feature_normal_and_get_default_view(self):
+        conf = api.Configuration("simple.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.add_feature(api.Feature("feature11"),'feature1')
+        view = conf.get_default_view()
+        
+        self.assertEquals(view.list_all_features(),['feature1',
+                                                'feature1.feature11',
+                                                'feature2',])
+        self.assertEquals(view.get_feature('feature1.feature11')._obj._parent,conf.feature1)
+
+    def test_add_feature_hierarchy_and_get_default_view(self):
+        root = api.Configuration("data/simple.confml")
+        conf = api.Configuration("test/root.confml")
+        root.add_configuration(conf)
+        conf2 = api.Configuration("test2/root.confml",namespace="com.nokia")
+        root.add_configuration(conf2)
+        conf.add_feature(api.Feature("group1"))
+        conf.add_feature(api.Feature("group2"))
+        conf.add_feature(api.Feature("feature1"))
+        conf.group1.add_feature(api.Feature("group21"))
+        conf.group1.group21.add_feature(api.Feature("feature211"))
+        conf.group1.group21.add_feature(api.Feature("feature212"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf2.add_feature(api.Feature("wlan"))
+        conf2.add_feature(api.Feature("bluetooth"))
+        self.assertEquals(conf.list_all_features(),
+                          ['group1', 
+                           'group1.group21', 
+                           'group1.group21.feature211', 
+                           'group1.group21.feature212', 
+                           'group2', 
+                           'feature1', 
+                           'feature1.feature11'])
+        dview = conf.get_default_view()
+        self.assertEquals(dview.list_features(),
+                          ['group1', 
+                           'group2', 
+                           'feature1'])
+        
+        self.assertEquals(dview.list_groups(),['com'])
+        self.assertEquals(dview.list_all_features(),
+                          ['group1', 
+                           'group1.group21', 
+                           'group1.group21.feature211', 
+                           'group1.group21.feature212', 
+                           'group2', 
+                           'feature1', 
+                           'feature1.feature11',
+                           'com.nokia.wlan',
+                           'com.nokia.bluetooth'])
+
+    def test_add_feature(self):
+        conf = api.Configuration("simple.confml")
+        conf.add_feature(api.Feature("feature1"))
+        self.assertEquals(conf.list_features(),['feature1'])
+
+#    def test_add_feature_namespace(self):
+#        conf = api.Configuration("test","com.nokia")
+#        conf.add_feature(api.Feature("feature1"))
+#        self.assertEquals(conf.list_all_features(),['com.nokia.feature1'])
+#        self.assertEquals(conf.feature1, conf.get_default_view().com.nokia.feature1._obj)
+
+    def test_add_subconfiguration(self):
+        conf = api.Configuration("test",namespace="com.nokia")
+        conf.create_configuration("foo/root.confml")
+        conf.create_configuration("platforms/s60.confml")
+        self.assertEquals(conf.list_configurations(),['foo/root.confml',
+                                                      'platforms/s60.confml',])
+
+    def test_remove_configuration(self):
+        conf = api.Configuration("test.confml",namespace="com.nokia")
+        conf.create_configuration("foo/root.confml")
+        self.assertEquals(conf.list_configurations(),['foo/root.confml'])
+        conf.remove_configuration("foo/root.confml")
+        self.assertEquals(conf.list_configurations(),[])
+
+    def test_get_configuration(self):
+        conf = api.Configuration("test.confml",namespace="com.nokia")
+        conf.create_configuration("foo/root.confml")
+        self.assertEquals(conf.list_configurations(),['foo/root.confml'])
+        foo = conf.get_configuration("foo/root.confml")
+        self.assertEquals(foo.get_path(),"foo/root.confml")
+
+
+    def test_remove_all(self):
+        conf = api.Configuration("test",namespace="com.nokia")
+        conf.create_configuration("foo/root.confml")
+        conf.create_configuration("platforms/s60.confml")
+        conf.create_configuration("platforms/customsw.confml")
+        self.assertEquals(conf.list_configurations(),['foo/root.confml',
+                                                      'platforms/s60.confml',
+                                                      'platforms/customsw.confml'])
+        for configref in conf.list_configurations():
+            conf.remove_configuration(configref)
+        self.assertEquals(conf.list_configurations(),[])
+
+
+    def test_add_subconfiguration_and_access(self):
+        conf = api.Configuration("data/simple.confml")
+        conf.create_configuration("foo/layer1.confml")
+        self.assertTrue(conf.foo__layer1_confml)
+
+#    def test_add_subconfiguration_and_features(self):
+#        conf = api.Configuration("test","com.nokia")
+#        conf.create_configuration("foo/root.confml")
+#        conf.create_configuration("fii/root.confml")
+#        conf.foo_root.add_feature(api.Feature("feature1"))
+#        conf.foo_root.add_feature(api.Feature("feature12"),"feature1")
+#        conf.fii_root.add_feature(api.Feature("feature2"))
+#        conf.fii_root.add_feature(api.Feature("feature21"),"feature2")
+#        self.assertEquals(conf.list_all_features(),['com.nokia.feature1',
+#                                                'com.nokia.feature1.feature12',
+#                                                'com.nokia.feature2',
+#                                                'com.nokia.feature2.feature21',
+#                                                ])
+#        self.assertEquals(conf.foo_root.feature1.get_ref(), 
+#                          conf.get_default_view()._get('com.nokia.feature1').get_ref())
+
+    def test_add_configuration_with_features_to_root(self):
+        root= api.Configuration("test",namespace="com.nokia")
+        conf1 = api.Configuration("foo/foo.confml")
+        conf1.add_feature(api.Feature("feature1"))
+        conf1.add_feature(api.Feature("feature12"),"feature1")
+        conf2 = api.Configuration("bar/bar.confml")
+        conf2.add_feature(api.Feature("feature2"))
+        conf2.add_feature(api.Feature("feature22"),"feature2")
+        root.add_configuration(conf1)
+        self.assertEquals(root.list_all_features(),
+                          ['feature1',
+                           'feature1.feature12'])
+        root.add_configuration(conf2)
+        self.assertEquals(root.list_all_features(),
+                          ['feature1',
+                           'feature1.feature12',
+                           'feature2',
+                           'feature2.feature22'])
+
+    def test_add_configuration_to_other_conf_and_then_to_root(self):
+        root= api.Configuration("test",namespace="com.nokia")
+        conf1 = api.Configuration("foo/foo.confml")
+        conf1.add_feature(api.Feature("feature1"))
+        conf1.add_feature(api.Feature("feature12"),"feature1")
+        conf2 = api.Configuration("bar/foo.confml")
+        conf2.add_feature(api.Feature("feature2"))
+        conf2.add_feature(api.Feature("feature22"),"feature2")
+        conf2.add_configuration(conf1)
+        self.assertEquals(conf2.list_all_features(),
+                          ['feature2',
+                           'feature2.feature22',
+                           'feature1',
+                           'feature1.feature12'])
+        root.add_configuration(conf2)
+        self.assertEquals(root.list_all_features(),
+                          ['feature2',
+                           'feature2.feature22',
+                           'feature1',
+                           'feature1.feature12'])
+
+    def test_add_features_feature_hiararchy_and_then_to_configurations(self):
+        conf1 = api.Configuration("foo/foo.confml")
+        fea = api.Feature('feature1')
+        fea2 = api.Feature('feature12')
+        fea2.add_feature(api.Feature('feature121'))
+        fea.add_feature(api.Feature('feature11'))
+        fea.add_feature(fea2)
+        self.assertEquals(fea.list_all_features(),
+                                ['feature11',
+                                 'feature12',
+                                 'feature12.feature121'])
+        conf1.add_feature(fea)
+        self.assertEquals(conf1.list_all_features(),
+                                ['feature1',
+                                 'feature1.feature11',
+                                 'feature1.feature12',
+                                 'feature1.feature12.feature121'])
+        
+
+    def test_add_features_and_remove_one(self):
+        conf1 = api.Configuration("foo/foo.confml")
+        fea = api.Feature('feature1')
+        fea2 = api.Feature('feature12')
+        fea2.add_feature(api.Feature('feature121'))
+        fea.add_feature(api.Feature('feature11'))
+        fea.add_feature(fea2)
+        conf1.add_feature(fea)
+        conf1.remove_feature('feature1.feature12')
+        self.assertEquals(conf1.list_all_features(), 
+                          ['feature1',
+                           'feature1.feature11'])
+        fea.remove_feature('feature11')
+        self.assertEquals(conf1.list_all_features(), 
+                          ['feature1'])
+
+    def test_add_features_and_remove_all(self):
+        conf = api.Configuration("foo/foo.confml")
+        fea = api.Feature('feature1')
+        conf.add_feature(fea)
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        for fearef in conf.list_features():
+            conf.remove_feature(fearef)
+        self.assertEquals(conf.list_all_features(), [])
+
+    def test_add_features_and_create_view(self):
+        
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature11'),'feature1')
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        
+        conf.add_view("rootfeas")
+        view = conf.get_view('rootfeas')
+        for fearef in conf.list_features():
+            fea = conf.get_feature(fearef)
+            view.add_feature(fea)
+        self.assertEquals(view.list_all_features(), ['feature1',
+                                                     'feature2',
+                                                     'feature3',
+                                                     'feature4'])
+        view.remove_feature('feature2')
+        self.assertEquals(view.list_all_features(), ['feature1',
+                                                     'feature3',
+                                                     'feature4'])
+
+    def test_add_features_and_create_view_with_links(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature11'),'feature1')
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        conf.add_view('fea1')
+        view1 = conf.get_view('fea1')
+        view1.add_group('thegruppe1')
+        view1.get_group('thegruppe1').add(api.FeatureLink('feature1.feature11'))
+        view1.add(api.FeatureLink('feature1.*'))
+        view1.populate()
+        self.assertEquals(view1.list_all_features(),['thegruppe1.feature11','feature11','feature12'])
+        fpr = view1.get_feature('thegruppe1.feature11')
+        self.assertEquals(fpr._obj.fqr,conf.get_default_view().get_feature('feature1.feature11').fqr) 
+        self.assertEquals(view1.list_all_features(), ['thegruppe1.feature11','feature11','feature12'])
+
+    def test_add_features_and_create_all_view_with_links(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature11'),'feature1')
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        conf.add_view("all")
+        view1 = conf.get_view('all')
+        view1.add(api.FeatureLink('**'))
+        view1.populate()
+        self.assertEquals(view1.list_all_features(),['feature1', 'feature11', 'feature12', 'feature2', 'feature3', 'feature4'])
+        fpr = view1.get_feature('feature11')
+        self.assertEquals(fpr._obj.fqr,conf.get_default_view().get_feature('feature1.feature11').fqr) 
+
+    def test_add_a_configuration_and_remove_it(self):
+        conf = api.Configuration("simple.confml")
+        conf.add_configuration(api.Configuration("confml/data.confml"))
+        self.assertEquals(conf.list_configurations(),['confml/data.confml'])
+        conf.remove_configuration("confml/data.confml")
+        self.assertEquals(len(conf.list_configurations()),0)    
+
+    def test_add_a_include_and_remove_it(self):
+        conf = api.Configuration("simple.confml")
+        conf.include_configuration("confml/data.confml")
+        self.assertEquals(conf.list_configurations(),['confml/data.confml'])
+        conf.remove_configuration("confml/data.confml")
+        self.assertEquals(len(conf.list_configurations()),0)    
+
+    def test_add_a_include_with_dots_in_path_and_remove_it(self):
+        conf = api.Configuration("simple.confml")
+        conf.include_configuration("test/foo.bar/data.confml")
+        self.assertEquals(conf.list_configurations(),['test/foo.bar/data.confml'])
+        conf.remove_configuration("test/foo.bar/data.confml")
+        self.assertEquals(len(conf.list_configurations()),0)    
+
+    def test_add_a_include_with_dots_and_remove_it(self):
+        conf = api.Configuration("simple.confml")
+        conf.include_configuration("../foo/data.confml")
+        self.assertEquals(conf.list_configurations(),['../foo/data.confml'])
+        conf.remove_configuration("../foo/data.confml")
+        self.assertEquals(len(conf.list_configurations()),0)    
+
+class TestConfigurationData(unittest.TestCase):
+    def test_add_features_and_add_data_via_default_view(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        dview = conf.get_default_view()
+        dview.feature1._add_data(api.Data(ref="feature1", value=123))
+        dview.feature2._add_data(api.Data(ref="feature2", value=123))
+        dview.feature3._add_data(api.Data(ref="feature3", value=123))
+        dview.feature1.feature12._add_data(api.Data(ref="feature12", value=123))
+        dview.feature1._add_data(api.Data(ref="feature1", value=123))
+        self.assertEquals(dview.feature1.get_value(), 123)
+        dview.feature1._add_data(api.Data(ref="feature1", value=111))
+        self.assertEquals(dview.feature1.get_value(), 111)
+
+    def test_add_data_to_configuration(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_data(api.Data(ref='feature1', value=123))
+        self.assertEquals(conf.get_data('feature1').get_value(),123)
+        conf.add_data(api.Data(fqr='feature1.feature12', value="test"))
+        self.assertEquals(conf.get_data('feature1.feature12').get_value(),"test")
+        self.assertEquals(conf.data.feature1.feature12.get_value(),"test")
+        conf.remove_data('feature1.feature12')
+        self.assertEquals(conf.list_datas(), ['feature1'])
+
+    def test_set_data_to_configuration(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_data(api.Data(fqr='feature1', value=123))
+        self.assertEquals(conf.get_data('feature1').get_value(),123)
+        conf.add_data(api.Data(fqr='feature1.feature12', value="test"))
+        self.assertEquals(conf.get_data('feature1.feature12').get_value(),"test")
+        self.assertEquals(conf.data.feature1.feature12.get_value(),"test")
+
+    def test_add_features_and_add_data_via_features(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        conf.feature1.set_value(123)
+        conf.feature1.feature12.set_value("test")
+        self.assertEquals(conf.feature1.get_value(),123)
+        self.assertEquals(conf.feature1.feature12.get_value(),"test")
+
+    def test_create_layers_add_features_and_add_data_via_features(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('feature2'))
+        conf.add_feature(api.Feature('feature3'))
+        conf.add_feature(api.Feature('feature4'))
+        conf.add_feature(api.Feature('feature12'),'feature1')
+        conf.feature1.set_value(123)
+        self.assertEquals(conf.feature1.get_value(),123)
+        conf.create_configuration("layer1.confml")
+        conf.feature1.feature12.set_value("test")
+        self.assertEquals(conf.feature1.get_data().find_parent(type=api.Configuration),conf)
+        self.assertEquals(conf.feature1.feature12.get_value(),"test")
+
+        conf.feature1.set_value(321)
+        conf.create_configuration("layer2.confml")
+        self.assertEquals(conf.layer2_confml.list_datas(), [])
+        
+        self.assertEquals(conf.feature1.get_value(),321)
+        self.assertEquals(conf.feature1.get_data().find_parent(type=api.Configuration).get_path(),conf.get_configuration("layer1.confml").get_path())
+        self.assertEquals(conf.layer1_confml.list_all_datas(), ['feature1','feature1.feature12'])
+        self.assertEquals([data.get_value() for data in conf.layer1_confml.get_all_datas()], [321,'test'])
+        self.assertEquals(conf.list_datas(), ['feature1'])
+        self.assertEquals([data.find_parent(type=api.Configuration).get_path() for data in conf.get_all_datas()], 
+                          ['foo/foo.confml',
+                           'layer1.confml',
+                           'layer1.confml',])
+
+    def test_create_layers_add_featuresequence_and_add_data_via_features(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.FeatureSequence('feature1'))
+        conf.add_feature(api.Feature('child1'),'feature1')
+        conf.add_feature(api.Feature('child2'),'feature1')
+        conf.add_feature(api.Feature('child3'),'feature1')
+        conf.feature1.add_sequence()
+        conf.feature1.get_data()[0][0].set_value('test1')
+        conf.feature1.get_data()[0][1].set_value('test2')
+        conf.feature1.get_data()[0][2].set_value('test3')
+        conf.feature1.add_sequence(['foo1','foo2','foo3'])
+        self.assertEquals(conf.feature1.get_data()[1][0].get_value(),'foo1')
+        self.assertEquals(conf.feature1.get_data()[1][1].get_value(),'foo2')
+        self.assertEquals(conf.feature1.get_data()[1][2].get_value(),'foo3')
+        self.assertEquals(conf.feature1.get_value(),
+                          [['test1','test2','test3'],
+                           ['foo1','foo2','foo3']])
+        self.assertEquals(conf.list_all_datas(),['feature1', 'feature1.child1', 'feature1.child2', 'feature1.child3', 'feature1', 'feature1.child1', 'feature1.child2', 'feature1.child3'])
+
+    def test_create_featuresequence_and_get_empty_data(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.FeatureSequence('feature1'))
+        conf.add_feature(api.Feature('child1'),'feature1')
+        conf.add_feature(api.Feature('child2'),'feature1')
+        conf.add_feature(api.Feature('child3'),'feature1')
+        self.assertEquals(conf.get_feature('feature1').get_data(),[])
+        self.assertEquals(conf.get_feature('feature1').get_value(),[])
+
+    def test_create_featuresequence_and_set_template(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.FeatureSequence('feature1'))
+        conf.add_feature(api.Feature('child1'),'feature1')
+        conf.add_feature(api.Feature('child2'),'feature1')
+        conf.add_feature(api.Feature('child3'),'feature1')
+        fea = conf.get_feature('feature1')
+        fea.set_template(['test1','test2','test3'])
+        self.assertEquals(fea.get_template(),['test1', 'test2', 'test3'])
+        fea.set_template(['test1','test3'])
+        self.assertEquals(fea.get_template(),['test1','test3','test3'])
+        try:
+            fea.set_template(['test1',None,'test3',None])
+            self.fail("Able to add more data then allowed")
+        except IndexError:
+            pass
+
+    def test_create_features_with_rfs_data(self):
+        conf = api.Configuration("foo/foo.confml")
+        conf.add_feature(api.Feature('feature1'))
+        conf.add_feature(api.Feature('child1'),'feature1')
+        conf.add_feature(api.Feature('child2'),'feature1')
+        conf.add_feature(api.Feature('child3'),'feature1')
+        
+        conf.add_data(api.Data(fqr='feature1.child1',attr='rfs',value='true'))
+        conf.add_data(api.Data(fqr='feature1.child2',attr='rfs',value='false'))
+        dview = conf.get_default_view()
+        self.assertEquals(dview.get_feature('feature1.child1').get_value(), None)
+        self.assertEquals(dview.get_feature('feature1.child1').get_value('rfs'), 'true')
+        self.assertEquals(dview.get_feature('feature1.child2').get_value('rfs'), 'false')
+
+class TestConfigurationDictStoring(unittest.TestCase):    
+    
+    def test_dumps_simple(self):
+        root = api.Configuration("root",namespace="com.nokia")
+        conf = root.create_configuration("test.confml")
+        dumped = persistentdictionary.DictWriter().dumps(conf)
+        dict =dumped['Configuration']['dict']
+        self.assertEquals(dict['path'],'test.confml')
+        self.assertEquals(dict['namespace'],'com.nokia')
+
+    def test_dumps_add_features(self):
+        root = api.Configuration("root",namespace="com.nokia")
+        conf = root.create_configuration("test.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        dumped = persistentdictionary.DictWriter().dumps(conf)
+        dict =dumped['Configuration']['dict']
+        self.assertEquals(dict['path'],'test.confml')
+        self.assertEquals(dict['namespace'],'com.nokia')
+        self.assertEquals(dumped['Configuration']['children'],
+                          [{'Feature': {'dict': {'name': 'feature1', 'ref': 'feature1'}}}, 
+                           {'Feature': {'dict': {'name': 'feature2', 'ref': 'feature2'}}}]
+                                            )
+
+    def test_dumps_root_configuration(self):
+        root = api.Configuration("root",namespace="com.nokia")
+        conf = root.create_configuration("test.confml")
+        conf = root.create_configuration("foo/root.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf.feature1.add_feature(api.Feature("feature12"))
+        dumped = persistentdictionary.DictWriter().dumps(root)
+        dict =dumped['Configuration']['dict']
+        self.assertEquals(dict['ref'],'root')
+        self.assertEquals(dict['namespace'],'com.nokia')
+
+    def test_dumps_feature_hierarchy(self):
+        root = api.Configuration("root",namespace="com.nokia")
+        conf = root.create_configuration("test.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf.feature1.add_feature(api.Feature("feature12"))
+        dumped = persistentdictionary.DictWriter().dumps(conf)
+        dict =dumped['Configuration']['dict']
+        self.assertEquals(dict['path'],'test.confml')
+        self.assertEquals(dict['ref'],'test_confml')
+        self.assertEquals(dict['namespace'],'com.nokia')
+        self.assertEquals(dumped['Configuration']['children'],
+                        [{'Feature': {'dict': {'name': 'feature1', 'ref': 'feature1'}, 
+                                'children': [
+                                    {'Feature': {'dict': {'name': 'feature11', 'ref': 'feature11'}}},
+                                    {'Feature': {'dict': {'name': 'feature12', 'ref': 'feature12'}}}]}}, 
+                        {'Feature': {'dict': {'name': 'feature2', 'ref': 'feature2'}}}
+                        ])
+
+    def test_loads(self):
+        conf = persistentdictionary.DictReader().loads({'Configuration': {'dict' : {'namespace':'test','ref':'test.confml'}}} )
+        self.assertTrue(isinstance(conf,api.Configuration))
+        self.assertEquals(conf.namespace,'test')
+        self.assertEquals(conf.get_ref(),'test.confml')
+
+    def test_loads_with_features(self):
+        root = api.Configuration("root",namespace="com.nokia")
+        conf = persistentdictionary.DictReader().loads({
+        'Configuration': {'dict' : {'namespace':'test','ref':'test.confml'},
+        'children': [{'Feature': {'dict': {'ref': 'feature1'}, 
+                                  'children': [
+                                               {'Feature': {'dict': {'ref': 'feature11'}}}, 
+                                               {'Feature': {'dict': {'ref': 'feature12'}}}]
+                                  }
+                    }, 
+                    {'Feature': {'dict': {'ref': 'feature2'}}}]}} )
+
+        self.assertEquals(conf.namespace,'test')
+        self.assertEquals(conf.ref,'test.confml')
+        root.add_configuration(conf)
+        self.assertEquals(root.list_all_features(),['test.feature1',
+                                                'test.feature1.feature11',
+                                                'test.feature1.feature12',
+                                                'test.feature2'])
+
+
+    def test_dumps_and_loads(self):
+        conf = api.Configuration("test.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf.feature1.add_feature(api.Feature("feature12"))
+        dumped = persistentdictionary.DictWriter().dumps(conf)
+        
+        conf2 = persistentdictionary.DictReader().loads(dumped)
+        self.assertEquals(conf.list_all_features(),
+                          conf2.list_all_features())
+
+    def test_dumps_and_loads_configuration_hierarchy(self):
+        root = api.Configuration("root.confml")
+        root.add_configuration(api.Configuration("layer1.confml"))
+        layer = api.Configuration("foo/layer2.confml")
+        conf = api.Configuration("foo/test.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf.feature1.add_feature(api.Feature("feature12"))
+        layer.add_configuration(conf)
+        root.add_configuration(layer)
+        dumped = persistentdictionary.DictWriter().dumps(root)
+        
+        root2= persistentdictionary.DictReader().loads(dumped)
+        self.assertEquals(root.list_all_features(),
+                          root2.list_all_features())
+
+    def test_dumps_and_loads_configuration_hierarchy_with_data(self):
+        root = api.Configuration("root.confml")
+        layer = api.Configuration("foo/layer1.confml")
+        conf = api.Configuration("foo/test.confml")
+        conf.add_feature(api.Feature("feature1"))
+        conf.add_feature(api.Feature("feature2"))
+        conf.feature1.add_feature(api.Feature("feature11"))
+        conf.feature1.add_feature(api.Feature("feature12"))
+        conf.feature1.set_value(1)
+        conf.feature2.set_value(2)
+        layer.add_configuration(conf)
+        root.add_configuration(layer)
+        root.add_configuration(api.Configuration("layer2.confml"))
+        root.get_default_view().feature1.feature11.set_value("testing11")
+        root.get_default_view().feature1.set_value("test1")
+        dumped = persistentdictionary.DictWriter().dumps(root)
+        root2= persistentdictionary.DictReader().loads(dumped)
+        self.assertEquals(root.list_all_features(),
+                          root2.list_all_features())
+        self.assertEquals(root2.get_default_view().feature1.get_value(), "test1")
+        self.assertEquals(root2.get_default_view().feature2.get_value(), 2)
+        self.assertEquals(root2.get_default_view().feature1.feature11.get_value(), "testing11")
+
+        self.assertEquals([data.find_parent(type=api.Configuration).get_path() for data in root2.get_all_datas()],
+                          ['foo/test.confml', 'foo/test.confml', 'layer2.confml','layer2.confml'])
+
+    def test_access_via_configuration_proxy(self):
+        conf = api.Configuration("root.confml")
+        conf.add_feature(api.Feature("feature1"))
+        proxy = api.ConfigurationProxy("root.confml")
+        proxy.set('_obj',conf)
+        self.assertEquals(proxy.get_ref(), 'root_confml')
+        self.assertEquals(proxy.get_path(), 'root.confml')
+        self.assertEquals(conf.feature1.get_ref(), 'feature1')
+        self.assertEquals(proxy.feature1.get_ref(), 'feature1')
+        
+
+if __name__ == '__main__':
+      unittest.main()
+      
+"""
+{'Configuration': {'dict': {'path': 'root.confml', 'ref': 'root', 'namespace': '', 'desc': ''}, 'children': [{'Configuration': {'dict': {'path': 'foo/layer1.confml', 'ref': 'foo_layer1', 'namespace': '', 'desc': ''}, 'children': [{'Configuration': {'dict': {'path': 'foo/test.confml', 'ref': 'foo_test', 'namespace': '', 'desc': ''}, 'children': [{'Feature': {'dict': {'ref': 'feature1'}, 'children': [{'Feature': {'dict': {'ref': 'feature11'}}}, {'Feature': {'dict': {'ref': 'feature12'}}}]}}, {'Feature': {'dict': {'ref': 'feature2'}}}, {'DataContainer': {'dict': {'ref': 'data'}, 'children': [{'Data': {'dict': {'ref': 'feature1', 'value': 1}}}, {'Data': {'dict': {'ref': 'feature2', 'value': 2}}}]}}]}}]}}, {'Configuration': {'dict': {'path': 'layer2.confml', 'ref': 'layer2', 'namespace': '', 'desc': ''}}}]}}
+"""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_container.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,574 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import sys,os,re
+import __init__
+
+from cone.public import utils, container, exceptions
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+importpk   = os.path.join(ROOT_PATH,"Import.pk")
+
+
+class TestC(object):
+    def __init__(self, path=""):
+        self.path = path
+    def test(self):
+        return "test string"
+class TestB(object):
+    def __init__(self, path=""):
+        self.path = path
+    def test(self):
+        return "test string"
+    
+    
+class TestDataContainer(unittest.TestCase):
+    def setUp(self):
+        pass
+    
+    def test_add_values_and_get_values(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        self.assertEquals(cont.get_value('test/ff'),'test')
+        self.assertEquals(cont.get_values('test/ff')[0],123)
+        self.assertEquals(cont.get_values('test/ff')[1],'test')
+        
+    def test_add_values_and_list_values(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        cont.add_value('test/foo','test')
+        keys = cont.list_keys()
+        self.assertEquals(len(keys),2)
+
+    def test_add_values_and_remove_one_value(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        cont.add_value('test/foo','test')
+        cont.add_value('test/foo','123')
+        cont.add_value('sss',123)
+        cont.remove_value('test/foo','test')        
+        self.assertEquals(cont.get_values('test/foo'),['123'])
+
+    def test_add_values_and_remove_all_values_of_a_key(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        cont.add_value('test/foo','test')
+        cont.add_value('test/foo','123')
+        cont.add_value('test/foo','foobar')
+        cont.add_value('sss',123)
+        for val in cont.get_values('test/foo'):
+            cont.remove_value('test/foo',val)
+        self.assertEquals(cont.get_values('test/foo'),[])
+
+    def test_add_values_and_remove_key(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        cont.add_value('test/foo','test')
+        cont.add_value('test/foo','123')
+        cont.add_value('test/foo','foobar')
+        cont.add_value('sss',123)
+        cont.remove_key('test/foo')
+        self.assertEquals(cont.list_keys(),['test/ff','sss'])
+
+    def test_add_values_clear_all_data(self):
+        cont = container.DataContainer()
+        cont.add_value('test/ff',123)
+        cont.add_value('test/ff','test')
+        cont.add_value('test/foo','test')
+        cont.add_value('test/foo','123')
+        cont.clear()
+        self.assertEquals(len(cont.list_keys()),0)
+        
+    def test_conatainer_flatten(self):
+        data = container.DataContainer()
+        data.add_value('test', 1)
+        data.add_value('test', 2)
+        data.add_value('test', 3)
+        data.add_value('foo', 1)
+        data.add_value('foo', 2)
+        data.add_value('bar', 3)
+        self.assertEquals(data.flatten(),{'test': 3, 'foo' : 2,'bar': 3})
+
+
+
+class TestObjectProxy(unittest.TestCase):    
+    def test_create_object_proxy_for_test(self):
+        cont = container.ObjectProxy(TestC("foo"))
+        self.assertTrue(cont)
+        self.assertEquals(cont.test(),"test string")
+
+    def test_create_none_proxy(self):
+        cont = container.ObjectProxy("")
+        self.assertTrue(cont)
+        try: 
+            cont.test()
+            self.fail("calling None succeeds?")
+        except AttributeError:
+            pass
+
+    def test_create_object_proxy_for_string(self):
+        cont = container.ObjectProxy("test string")
+        self.assertTrue(cont)
+        self.assertEquals(cont.startswith("test"),True)
+        
+
+def graph(obj):
+    if obj._parent:
+        return ["%s -> %s" % (obj._parent._name, obj._name)]
+    return []
+
+class TestObjectContainer(unittest.TestCase):    
+    def test_create_object_container(self):
+        cont = container.ObjectContainer("test")
+        self.assertTrue(cont)
+
+    def test_add_incorrect_type(self):
+        cont = container.ObjectContainer()
+        try: 
+            cont._add(container.ObjectProxy())
+            self.fail("Adding incorrect class type to container succeeds?")
+        except exceptions.IncorrectClassError,e:
+            pass
+            
+
+    def test_add_child(self):
+        cont = container.ObjectContainer("root")
+        obj = container.ObjectContainer("test")
+        cont._add(obj)
+        cont._add(container.ObjectContainer("foo"))
+        self.assertEquals(cont._list(),['test','foo'])
+        self.assertEquals(cont.test,obj)
+
+    def test_add_internal_child(self):
+        cont = container.ObjectContainer("root")
+        obj = container.ObjectContainer("?test")
+        cont._add(obj)
+        cont._add(container.ObjectContainer("foo"))
+        self.assertEquals(cont._list(),['foo'])
+        self.assertEquals(cont._get('?test'),obj)
+        
+
+    def test_add_child_to_path(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        self.assertEquals(cont._list(),['com'])
+        self.assertEquals(cont.com.nokia._list(),['test'])
+        self.assertEquals(cont.com.nokia.test,obj)
+
+    def test_add_child_to_path_and_replace_parent(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        com = container.ObjectContainer("com")
+        cont._add(com)
+        self.assertEquals(cont._list(),['com'])
+        self.assertEquals(cont.com._list(),['nokia','bar'])
+        self.assertEquals(cont.com.bar._parent,com)
+        self.assertEquals(cont.com.nokia._list(),['test'])
+        self.assertEquals(cont.com.nokia.test,obj)
+
+    def test_append(self):
+        cont = container.ObjectContainer("test")
+        cont._append(container.ObjectContainer('test'))
+        self.assertEquals(len(utils.get_list(cont.test)), 1)
+        cont._append(container.ObjectContainer('test'))
+        self.assertEquals(len(cont.test), 2)
+
+    def test_prepend(self):
+        cont = container.ObjectContainer("test")
+        cont._prepend(container.ObjectContainer('test'))
+        self.assertEquals(len(utils.get_list(cont.test)), 1)
+        cont._prepend(container.ObjectContainer('test'))
+        self.assertEquals(len(cont.test), 2)
+
+    def test_replace(self):
+        cont = container.ObjectContainer("test")
+        t1 = container.ObjectContainer('test')
+        cont._replace(t1)
+        self.assertEquals(cont.test, t1)
+        t2 = container.ObjectContainer('test')
+        cont._replace(t2)
+        self.assertEquals(cont.test, t2)
+
+    def test_error(self):
+        cont = container.ObjectContainer("test")
+        t1 = container.ObjectContainer('test')
+        cont._error(t1)
+        self.assertEquals(cont.test, t1)
+        t2 = container.ObjectContainer('test')
+        try:
+            cont._error(t2)
+            self.fail("adding same with error succeeds")
+        except exceptions.AlreadyExists, e:
+            pass
+
+    def test_add_child_to_existing_path_with_error(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        com = container.ObjectContainer("com")
+        try:
+            cont._add(com, policy=container.ERROR)
+            self.fail("Adding an existing object succeeds with ERROR policy")
+        except exceptions.AlreadyExists, e:
+            pass
+
+    def test_add_child_to_existing_path_append(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"), container.APPEND)
+        com = container.ObjectContainer("com")
+        cont._add(com, policy=container.APPEND)
+        self.assertEquals(len(cont._get('com')),2)
+        self.assertEquals(cont._get('com')[1],com)
+        self.assertEquals(len(cont._objects()),2)
+        self.assertEquals(len(cont.com[0].nokia.test),2)
+        self.assertEquals(len(cont._get('com[0].nokia.test')),2)
+        self.assertEquals([e._name for e in cont._traverse()],['com', 'nokia', 'test', 'test', 'com'])
+        
+    def test_add_child_to_existing_path_append_and_objects(self):
+        cont = container.ObjectContainer("test")
+        cont._add(container.ObjectContainer("dummy"),container.APPEND)
+        cont._add(container.ObjectContainer("child"),container.APPEND)
+        cont._add(container.ObjectContainer("child"),container.APPEND)
+        cont._add(container.ObjectContainer("child"),container.APPEND)
+        self.assertEquals(len(cont._objects()),4)
+        cont._remove('child[1]')
+        self.assertEquals(len(cont._objects()),3)
+        cont._remove('child[0]')
+        cont._remove('child[0]')
+        self.assertEquals(len(cont._objects()),1)
+
+    def test_add_child_and_access_via_index(self):
+        cont = container.ObjectContainer("test")
+        cont._add(container.ObjectContainer("dummy"),container.APPEND)
+        d1 = cont._get('dummy')
+        d2 = cont._get('dummy[0]')
+        self.assertEquals(d1,d2)
+        try:
+            cont._get('dummy[1]')
+            self.fail("getting dummy")
+        except exceptions.NotFound:
+            pass
+
+    def test_add_child_to_existing_path_append_and_remove(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        com = container.ObjectContainer("com")
+        cont._add(com, policy=container.APPEND)
+        self.assertEquals(len(cont._get('com')),2)
+        self.assertEquals(cont._get('com')[1],com)
+        self.assertEquals(cont._list(),['com'])
+        cont._remove('com')
+        self.assertEquals(cont._list(), [])
+        
+    def test_add_child_to_existing_path_prepend(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        com = container.ObjectContainer("com")
+        cont._add(com, policy=container.PREPEND)
+        self.assertEquals(len(cont._get('com')),2)
+        self.assertEquals(cont._get('com')[0],com)
+
+    def test_add_child_and_get(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        self.assertEquals(cont._get('com.nokia.test'),obj)
+        self.assertEquals(cont.com._get('nokia.test'),obj)
+        self.assertEquals(cont.com.nokia._get('test'),obj)
+
+    def test_add_child_and_remove_one(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        self.assertEquals(len(cont._traverse()),5)
+        cont._remove("com.nokia.foo")
+        self.assertEquals(len(cont._traverse()),4)
+        
+    def test_add_child_and_remove_all(self):
+        cont = container.ObjectContainer("test")
+        obj = container.ObjectContainer("test")
+        cont._add_to_path("com.nokia", obj)
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        self.assertEquals(len(cont._traverse()),5)
+        for item in cont._list():
+            cont._remove(item)
+        self.assertEquals(len(cont._list()),0)
+
+    def test_add_children_and_list_all(self):
+        cont = container.ObjectContainer("test")
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        self.assertEquals(len(cont._traverse()),5)
+
+    def test_create_hieararchy_and_remove_child(self):
+        root = container.ObjectContainer("test")
+        root._add(container.ObjectContainer("child1"))
+        root._add(container.ObjectContainer("child2"))
+        root.child1._add(container.ObjectContainer("child11"))
+        root.child1._add(container.ObjectContainer("child12"))
+        root.child2._add(container.ObjectContainer("child21"))
+        self.assertEquals(root._list_traverse(),
+                          ['child1', 
+                          'child1.child11', 
+                          'child1.child12',
+                          'child2',
+                          'child2.child21'])
+        root.child2._remove('child21')
+        self.assertEquals(root._list_traverse()
+                          ,['child1',  
+                                           'child1.child11', 
+                                           'child1.child12',
+                                           'child2'])
+
+    def test_add_children_and_traverse_and_get_path(self):
+        cont = container.ObjectContainer("default")
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        cont.com._list()
+        self.assertEquals(cont._traverse()[0]._path(),"default.com")
+        self.assertEquals(cont._traverse()[0]._path(cont),"com")
+        self.assertEquals(cont._traverse()[0]._path(cont.com),"")
+
+    def test_add_children_and_traverse_filter_name_and_get_path(self):
+        cont = container.ObjectContainer("default")
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        cont.com._list()
+        ret = cont._traverse(name="^t.*$")
+        self.assertEquals(len(ret),1)
+        self.assertEquals(ret[0]._path(),"default.com.nokia.test")
+
+    def test_add_children_and_traverse_filter_name_many(self):
+        cont = container.ObjectContainer("default")
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        cont.com._list()
+        ret = cont._traverse(path=".*nokia.*")
+        self.assertEquals(len(ret),3)
+        self.assertEquals(ret[0]._path(),"default.com.nokia")
+
+    def test_add_children_tail_recurse_with_function(self):
+        cont = container.ObjectContainer("default")
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        ret = cont._tail_recurse(graph)
+        self.assertEquals(ret,['default -> com', 'com -> nokia', 'nokia -> test', 'nokia -> foo', 'com -> bar'])
+
+    def test_add_children_head_recurse_with_function(self):
+        cont = container.ObjectContainer("default")
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        ret = cont._head_recurse(graph)
+        self.assertEquals(ret,['nokia -> test', 'nokia -> foo', 'com -> nokia', 'com -> bar', 'default -> com'])
+
+    def test_add_children_and_find_parent(self):
+        cont = container.ObjectContainer("default", container=True)
+        cont._add(container.ObjectContainer("com",housut="test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("test"))
+        cont._add_to_path("com.nokia", container.ObjectContainer("foo"))
+        cont._add_to_path("com", container.ObjectContainer("bar"))
+        child = cont._get('com.nokia.test')
+        self.assertEquals(child._find_parent()._name, 'nokia')
+        self.assertEquals(child._find_parent(container=True)._name, 'default')
+        self.assertEquals(child._find_parent(housut="test")._name, 'com')
+        self.assertEquals(child._find_parent(__class__=container.ObjectContainer)._name, 'nokia')
+        self.assertEquals(child._find_parent(type=container.ObjectContainer)._name, 'nokia')
+
+class TestObjectProxyContainer(unittest.TestCase):    
+    def test_create_object_container_for_test(self):
+        cont = container.ObjectProxyContainer(TestC("foo"))
+        self.assertTrue(cont)
+        self.assertEquals(cont.test(),"test string")
+
+    def test_create_none_container(self):
+        cont = container.ObjectProxyContainer(None)
+        self.assertTrue(cont)
+        try: 
+            cont.test()
+            self.fail("calling None succeeds?")
+        except AttributeError:
+            pass
+
+    def test_create_object_container_for_string(self):
+        cont = container.ObjectProxyContainer("Test")
+        self.assertTrue(cont)
+        self.assertEquals(cont.startswith("Test"),True)
+        
+    def test_create_object_container(self):
+        cont = container.ObjectProxyContainer(TestC())
+        self.assertTrue(cont)
+
+    def test_add_child(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add(container.ObjectProxyContainer(obj,"test"))
+        self.assertEquals(cont._list(),['test'])
+        self.assertEquals(cont.test._obj,obj)
+    
+    def test_add_child_to_path(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(obj,"test"))
+        self.assertEquals(cont._list(),['com'])
+        self.assertEquals(cont.com.nokia._list(),['test'])
+        self.assertEquals(cont.com.nokia.test._obj,obj)
+        self.assertEquals(cont.com.nokia.test.test(),"test string")
+
+    def test_add_child_and_get(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(obj,"test"))
+        self.assertEquals(cont._get('com.nokia.test')._obj,obj)
+        self.assertEquals(cont.com._get('nokia.test')._obj,obj)
+        self.assertEquals(cont.com.nokia._get('test')._obj,obj)
+
+    def test_add_child_and_remove_one(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(obj,"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        
+        self.assertEquals(len(cont._traverse()),5)
+        cont._remove("com.nokia.foo")
+        self.assertEquals(len(cont._traverse()),4)
+        
+    def test_add_child_and_remove_all(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(obj,"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        self.assertEquals(len(cont._traverse()),5)
+        for item in cont._list():
+            cont._remove(item)
+        self.assertEquals(len(cont._list()),0)
+
+    def test_add_children_and_list_all(self):
+        cont = container.ObjectProxyContainer(None)
+        obj = TestC()
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(obj,"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        self.assertEquals(len(cont._traverse()),5)
+
+    def test_add_children_and_traverse_and_get_path(self):
+        cont = container.ObjectProxyContainer(None,"default")
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        cont.com._list()
+        self.assertEquals(cont._traverse()[0]._path(),"default.com")
+
+    def test_add_children_and_traverse_filter_name_and_get_path(self):
+        cont = container.ObjectProxyContainer(None,"default")
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        cont.com._list()
+        ret = cont._traverse(name="^t.*$")
+        self.assertEquals(len(ret),1)
+        self.assertEquals(ret[0]._path(),"default.com.nokia.test")
+
+    def test_add_children_and_traverse_filter_name_many(self):
+        cont = container.ObjectProxyContainer(None,"default")
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        cont.com._list()
+        ret = cont._traverse(path=".*nokia.*")
+        self.assertEquals(len(ret),3)
+        self.assertEquals(ret[0]._path(),"default.com.nokia")
+
+    def test_add_children_and_traverse_filter_class(self):
+        cont = container.ObjectProxyContainer(None,"default")
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestB(),"bee"))
+        cont.com.nokia._add(container.ObjectProxyContainer(TestB(),"vee"))
+        ret = cont._traverse(filters=[lambda x: hasattr(x,'_obj') and isinstance(x._obj, TestB)])
+        self.assertEquals(len(ret),2)
+        self.assertEquals(ret[0]._path(cont),"com.nokia.bee")
+        self.assertEquals(ret[1]._path(cont),"com.nokia.vee")
+
+    def test_add_children_and_traverse_filter_class_proxies(self):
+        cont = container.ObjectProxyContainer(None,"default")
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"test"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestC(),"foo"))
+        cont._add_to_path("com", container.ObjectProxyContainer(TestC(),"bar"))
+        cont._add_to_path("com.nokia", container.ObjectProxyContainer(TestB(),"bee"))
+        cont.com.nokia._add(container.ObjectProxyContainer(TestB(),"vee"))
+        ret = cont._traverse(filters=[lambda x: isinstance(x, container.ObjectProxyContainer)])
+        self.assertEquals(len(ret),5)
+        self.assertEquals(ret[0]._path(cont),"com.nokia.test")
+        self.assertEquals(ret[1]._path(cont),"com.nokia.foo")
+
+class TestLoadProxy(unittest.TestCase):
+    def test_create_load_proxy(self):
+        proxy = container.LoadProxy(importpk, container.LoadInterface())
+        proxy._load()
+        self.assertTrue(proxy._obj != None)
+
+    def test_create_load_proxy_and_get(self):
+        proxy = container.LoadProxy(importpk, container.LoadInterface())
+        self.assertEquals(proxy.list_resources(''),['test1.txt', 'test2.txt', 'test3.txt'])
+        self.assertTrue(proxy._obj != None)
+
+    def test_create_load_proxy_and_unload(self):
+        proxy = container.LoadProxy(importpk, container.LoadInterface())
+        self.assertEquals(proxy.list_resources(''),['test1.txt', 'test2.txt', 'test3.txt'])
+        proxy.set('path',"unload.pk")
+        proxy._unload()
+        self.assertTrue(proxy._obj == None)
+        proxy =None
+        proxy2 = container.LoadProxy("unload.pk", container.LoadInterface())
+        self.assertEquals(proxy2.list_resources(''),['test1.txt', 'test2.txt', 'test3.txt'])
+        os.unlink("unload.pk")
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_data.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils, container
+
+class TestData(unittest.TestCase):    
+    # @test 
+    def test_create_data(self):
+        data = api.Data(fqr="foo", value=123)
+        self.assertTrue(data)
+        data = api.Data(fqr="foo.bar", value=123, attr='rfs')
+        self.assertEquals(data.attr,'rfs')
+        data = api.Data(fqr="foo.bar", value=123, attr=None)
+        self.assertEquals(data.attr,'data')
+        data = api.Data(fqr="foo.bar", value=123, attr='data')
+        self.assertEquals(data.attr,'data')
+
+    def test_create_data_with_map(self):
+        data = api.Data(ref="StringToString", map="StringToStringSequenceFeature/SequenceSetting[@key='Key 1']")
+        self.assertEqual(data.get_map(),"StringToStringSequenceFeature/SequenceSetting[@key='Key 1']")
+        self.assertEqual(data.get_map_ref(),"StringToStringSequenceFeature/SequenceSetting")
+        self.assertEqual(data.get_map_key_value(),"Key 1")
+        self.assertTrue(data)
+
+    def test_create_data_getters(self):
+        data = api.Data(ref="foo", value=123)
+        self.assertEquals(data.fqr, "foo")
+        data = api.Data(fqr="foo.bar.test", value=123)
+        self.assertEquals(data.get_ref(), "test")
+        self.assertEquals(data.get_value(), 123)
+        self.assertEquals(data.get_policy(), "")
+
+    def test_create_data_for_sequences(self):
+        data = api.Data(ref="seq")
+        data._add(api.Data(ref="foo", value='sss'),container.APPEND)
+        data._add(api.Data(ref="foo", value='aaa'),container.APPEND)
+        data._add(api.Data(ref="foo", value=123),container.PREPEND)
+        
+        self.assertEquals(data.fqr, "seq")
+        self.assertEquals(data._get('foo[0]').get_ref(), "foo")
+        self.assertEquals(data._get('foo[0]').fqr, "seq.foo")
+        self.assertEquals(data.foo[0].get_value(), 123)
+        self.assertEquals(data.foo[0].get_index(), 0)
+        self.assertEquals(data.foo[1].get_value(), 'sss')
+        self.assertEquals(data.foo[1].get_index(), 1)
+        self.assertEquals(data.foo[2].get_value(), 'aaa')
+        self.assertEquals(data.foo[2].get_index(), 2)
+        data._add(api.Data(ref="foo", value='NEW'))
+        self.assertEquals(data.foo.get_value(), 'NEW')
+        
+    def test_create_configuration_with_data(self):
+        config  = api.Configuration("dataconf")
+        config.add_data(api.Data(fqr='foo.setting1',value=123))
+        config.add_data(api.Data(fqr='foo.setting2',value=456))
+        config.add_data(api.Data(fqr='foo.seq.data1',value='juhuu'))
+        config.add_data(api.Data(fqr='foo.seq.data2',value='x:\\ss'))
+        self.assertEquals(config.data.foo.setting1.get_value(), 123)
+        self.assertEquals(config.data.foo.setting1.fqr, 'foo.setting1')
+        self.assertEquals(config.data.foo.seq.data2.fqr, 'foo.seq.data2')
+        self.assertEquals(config.data.foo.seq.data2.get_ref(), 'data2')
+        self.assertEquals(config.get_data('foo.seq.data2').get_value(), 'x:\\ss')
+
+    def comparedata(self,data1,data2):
+        self.assertEquals(data1.ref, data1.ref)
+        self.assertEquals(data1.fqr, data1.fqr)
+        self.assertEquals(data1.value, data1.value)
+
+    def test_clone_data(self):
+        data1 = api.Data(ref="dat")
+        data2 = data1._clone()
+        self.comparedata(data1, data2)
+
+    def test_clone_hierarchical_data(self):
+        data1 = api.Data(ref="seq")
+        data1._add(api.Data(ref="foo1", value='sss'))
+        data1._add(api.Data(ref="foo2", value='aaa'))
+        data1._add(api.Data(ref="foo3", value=123))
+        
+        data2 = data1._clone(recursion=True)
+        self.comparedata(data1, data2)
+        self.comparedata(data1.foo1, data2.foo1)
+        self.comparedata(data1.foo2, data2.foo2)
+        self.comparedata(data1.foo3, data2.foo3)
+
+    def test_clone_sequential_data(self):
+        data1 = api.Data(ref="seq")
+        data1._add(api.Data(ref="foo", value='sss'),container.APPEND)
+        data1._add(api.Data(ref="foo", value='aaa'),container.APPEND)
+        data1._add(api.Data(ref="foo", value=123),container.APPEND)
+        
+        data2 = data1._clone(recursion=True)
+        self.comparedata(data1, data2)
+        self.comparedata(data1.foo[0], data2.foo[0])
+        self.comparedata(data1.foo[1], data2.foo[1])
+        self.comparedata(data1.foo[2], data2.foo[2])
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_feature.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,475 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils
+
+
+class TestFeature(unittest.TestCase):    
+    def comparefeatures(self,fea1,fea2):
+        self.assertEquals(fea1.ref, fea2.ref)
+        self.assertEquals(fea1.fqr, fea2.fqr)
+        self.assertEquals(fea1.name, fea2.name)
+        self.assertEquals(fea1.type, fea2.type)
+
+    def test_create_feature(self):
+        fea= api.Feature("foo")
+        self.assertTrue(fea)
+
+    def test_get_namespace(self):
+        fea= api.Feature("foo")
+        self.assertTrue(fea)
+        self.assertEquals(fea.namespace,"")
+
+    def test_get_ref(self):
+        fea= api.Feature("foo")
+        self.assertTrue(fea)
+        self.assertEquals(fea.get_ref(),"foo")
+
+    def test_create_config_with_namespace_and_get_fqr(self):
+        conf =  api.Configuration("test.confml", namespace="com.nokia.s60")
+        conf.add_feature(api.Feature("foo"))
+        fea= conf.get_feature("foo")
+        self.assertEquals(fea.namespace,"com.nokia.s60")
+        self.assertEquals(fea.fqr,"com.nokia.s60.foo")
+
+    def test_set_ref_and_get_all(self):
+        conf =  api.Configuration("test.confml", namespace="com.nokia.s60")
+        conf.add_feature(api.Feature("foo"))
+        fea = conf.get_feature("foo")
+        fea.set_ref("wlan")
+        self.assertEquals(fea.get_ref(),"wlan")
+        self.assertEquals(fea.namespace,"com.nokia.s60")
+        self.assertEquals(fea.fqr,"com.nokia.s60.wlan")
+
+    def test_create_subfeature_and_get_namespace(self):
+        fea= api.Feature("foo")
+        fea.add_feature(api.Feature("bar"))
+        bar = fea.get_feature("bar")        
+        self.assertTrue(bar)
+        self.assertEquals(bar.get_ref(),"bar")
+        self.assertEquals(bar.namespace,"foo")
+        self.assertEquals(bar.fqr,"foo.bar")
+
+    def test_create_subfeature_and_get_namespace_with_config(self):
+        conf =  api.Configuration("test.confml", namespace="com.nokia.s60")
+        conf.add_feature(api.Feature("foo"))
+        fea= conf.get_feature("foo")
+        fea.add_feature(api.Feature("bar"))
+        bar = fea.get_feature("bar")        
+        self.assertTrue(bar)
+        self.assertEquals(bar.get_ref(),"bar")
+        self.assertEquals(bar.namespace,"com.nokia.s60.foo")
+        self.assertEquals(bar.fqr,"com.nokia.s60.foo.bar")
+
+    def test_create_feature_proxy(self):
+        fea= api.Feature("foo", name="foo bar")
+        feaproxy = api._FeatureProxy("foo",fea)
+        self.assertTrue(feaproxy.get_ref(),"foo")
+        self.assertEquals(feaproxy.namespace,"")
+        self.assertEquals(feaproxy.fqr,"foo")
+        self.assertEquals(feaproxy.name,"foo bar")
+        feaproxy.add_feature(api.Feature("bar", name="bar man"))
+        self.assertTrue(feaproxy.bar.get_ref(),"bar")
+        self.assertEquals(feaproxy.bar.namespace,"foo")
+        self.assertEquals(feaproxy.bar.fqr,"foo.bar")
+        self.assertEquals(feaproxy.bar.name,"bar man")
+        
+
+    def test_create_feature_data(self):
+        dataobj = api.Data(ref="foo", value=132)
+        self.assertTrue(dataobj.fqr,"foo")
+        self.assertTrue(dataobj.get_value(),123)
+        self.assertTrue(dataobj.value,123)
+
+    def test_create_feature_data_proxy(self):
+        fea= api.Feature("foo")
+        feaproxy = api._FeatureDataProxy("foo",fea)
+        self.assertTrue(feaproxy.get_ref(),"foo")
+        self.assertEquals(feaproxy._get_data(),None)
+        self.assertEquals(feaproxy._get_value(),None)
+        feaproxy._add_data(api.Data(ref="foo", value=123))
+        self.assertEquals(feaproxy._get_data().get_value(),123)
+        feaproxy._add_data(api.Data(ref="foo", value=321))
+        self.assertEquals(feaproxy._get_data().get_value(),321)
+        self.assertEquals(feaproxy._get_datas()[0].get_value(),123)
+        self.assertEquals(feaproxy._get_datas()[1].get_value(),321)
+        self.assertEquals(feaproxy._get_values(),[123,321])
+
+    def test_access_feature_data_proxy_children_with_sequence_operations(self):
+        fea= api.Feature("foo")
+        feaproxy = api._FeatureDataProxy("foo",fea)
+        feaproxy.add_feature(api.Feature("child1"))
+        feaproxy.add_feature(api.Feature("child2"))
+        feaproxy.add_feature(api.Feature("?child"))
+        feaproxy.add_feature(api.Feature("child3"))
+        feaproxy.add_feature(api.Feature("child4"))
+        self.assertEquals(len(feaproxy),4)
+        self.assertEquals(feaproxy[0].get_ref(),'child1')
+        self.assertEquals(feaproxy[1].get_ref(),'child2')
+        self.assertEquals(feaproxy[2].get_ref(),'child3')
+        self.assertEquals(feaproxy[3].get_ref(),'child4')
+        
+        del feaproxy[2]
+        self.assertEquals(len(feaproxy),3)
+        self.assertEquals(feaproxy[0].get_ref(),'child1')
+        self.assertEquals(feaproxy[1].get_ref(),'child2')
+        self.assertEquals(feaproxy[2].get_ref(),'child4')
+        self.assertEquals(feaproxy[2].get_ref(),'child4')
+        self.assertEquals(feaproxy.get_feature('?child').get_ref(),'?child')
+
+    def test_create_boolean_feature(self):
+        fea = api.Feature('test',type='boolean')
+        vset = fea.get_valueset()
+        self.assertTrue(vset <= api.ValueSet([True,False]))
+        self.assertTrue(len(vset) == 2)
+        self.assertTrue(True in vset)
+        self.assertTrue(False in vset)
+        self.assertFalse(123 in vset)
+
+    def test_create_string_feature(self):
+        fea = api.Feature('test',type='string')
+        vset = fea.get_valueset()
+        self.assertTrue('test' in vset)
+        self.assertTrue('foobar' in vset)
+        self.assertFalse(False in vset)
+        self.assertFalse(123 in vset)
+
+    def test_create_integer_feature(self):
+        fea = api.Feature('test',type='int')
+        vset = fea.get_valueset()
+        self.assertFalse('test' in vset)
+        self.assertFalse('foobar' in vset)
+        self.assertTrue(False in vset)
+        self.assertTrue(123 in vset)
+        self.assertTrue(0 in vset)
+        self.assertTrue(100000000 in vset)
+        self.assertFalse(-1 in vset)
+        self.assertFalse(0.2 in vset)
+
+    def test_create_selection_feature(self):
+        fea = api.Feature('test',type='selection')
+        fea.create_option('test', '1')
+        fea.create_option('one', '2')
+        fea.create_option('two', '3')
+        vset = fea.get_valueset()
+        self.assertTrue('1' in vset)
+        self.assertFalse('foo' in vset)
+        self.assertTrue('2' in vset)
+        self.assertTrue('3' in vset)
+        self.assertEquals(fea.get_option('value_2').get_name(), 'one')
+    
+    def test_create_sequence_feature(self):
+        fea = api.FeatureSequence('test')
+        fea.add_feature(api.Feature('child1',type='int'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        self.assertEquals(fea.get_type(), 'sequence')
+        self.assertEquals(fea.list_features(), ['child1','child2','child3'])
+
+    def test_feature_get_dict(self):
+        fea= api.Feature("foo", type='int')
+        self.assertEquals(fea._dict(), {'ref': 'foo','type': 'int', 'name': 'foo'})
+
+    def test_clone_single_feature(self):
+        fea= api.Feature("foo", type='int')
+        fea2 = fea._clone()
+        self.comparefeatures(fea,fea2)
+
+    def test_clone_feature_with_subfeatures(self):
+        fea= api.Feature("foo")
+        fea.add_feature(api.Feature("child1",type='string'))
+        fea.add_feature(api.Feature("child2",type='int'))
+        fea.child1.add_feature(api.Feature("child12",type='int'))
+        fea2 = fea._clone()
+        self.comparefeatures(fea,fea2)
+        fea3 = fea._clone(recursion=True, recursion_depth=1)
+        self.comparefeatures(fea,fea3)
+        self.comparefeatures(fea.get_feature('child1'),fea3.get_feature('child1'))
+        self.comparefeatures(fea.get_feature('child2'),fea3.get_feature('child2'))
+        self.assertEquals(fea3.child1.list_features(),[])
+        fea4 = fea._clone(recursion=True)
+        self.comparefeatures(fea,fea4)
+        self.comparefeatures(fea.get_feature('child1'),fea4.get_feature('child1'))
+        self.comparefeatures(fea.get_feature('child2'),fea4.get_feature('child2'))
+        self.assertEquals(fea4.child1.list_features(),['child12'])
+        self.comparefeatures(fea.child1.get_feature('child12'),fea4.child1.get_feature('child12'))
+
+    def test_clone_feature_with_options(self):
+        fea= api.Feature("foo")
+        fea.add_feature(api.Feature("child1",type='selection'))
+        fea.add_feature(api.Feature("child2",type='int'))
+        fea.child1.create_option('one','1')
+        fea.child1.create_option('two','2')
+        fea.child1.create_option('three','3')
+        fea2 = fea._clone(recursion=True)
+        self.comparefeatures(fea,fea2)
+        self.comparefeatures(fea.get_feature('child1'),fea2.get_feature('child1'))
+        self.assertEquals(fea.child1.list_options(),fea2.child1.list_options())
+
+    def test_compare_features(self):
+        fea1= api.Feature("foo")
+        fea2= api.Feature("foo")
+        fea3= api.Feature("foo", type='boolean')
+        fea4= api.Feature("foo", bar='yes')
+        fea5= api.Feature("foo", bar='yes')
+        self.assertTrue(fea1._compare(fea2))
+        self.assertFalse(fea1._compare(fea3))
+        self.assertTrue(fea1._compare(fea4))
+        self.assertTrue(fea5._compare(fea4, ['bar']))
+        self.assertTrue(fea1._compare(fea2, ['bar']))
+
+class TestFeatureSequence(unittest.TestCase):
+    def comparefeatures(self,fea1,fea2):
+        self.assertEquals(fea1.ref, fea2.ref)
+        self.assertEquals(fea1.fqr, fea2.fqr)
+        self.assertEquals(fea1.name, fea2.name)
+        self.assertEquals(fea1.type, fea2.type)
+
+    # @test 
+    def test_create_feature(self):
+        fea= api.FeatureSequence("foo")
+        self.assertTrue(fea)
+
+    def test_create_feature_with_children(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        self.assertEquals(fea.list_features(),['child1','child2','child3'])
+
+    def test_create_configuration_with_sequence_and_get_default_view(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config = api.Configuration('foo.confml')
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        self.assertEquals(dview.list_all_features(),['foo','foo.child1','foo.child2','foo.child3'])
+
+    def test_create_configuration_with_sequence_and_add_data_with_default_view(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config = api.Configuration('foo.confml')
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        
+        data = api.Data(ref='foo')
+        data._add(api.Data(ref='child1',value='test1'))
+        data._add(api.Data(ref='child2',value='test2'))
+        data._add(api.Data(ref='child3',value='test3'))
+        foofea.add_data(data)
+        data1 = api.Data(ref='foo', policy='append')
+        data1._add(api.Data(ref='child1',value='jee'))
+        data1._add(api.Data(ref='child2',value='oo'))
+        data1._add(api.Data(ref='child3',value='aa'))
+        
+        foofea.add_data(data1)
+        self.assertEquals(len(foofea.get_data()), 2)
+        
+        self.assertEquals(foofea.get_data()[0].list_features(), ['child1','child2','child3'])
+        self.assertEquals(foofea.get_data()[0].get_feature('child1').get_value(), 'test1')
+        self.assertEquals(foofea.get_data()[0].get_feature('child2').get_value(), 'test2')
+        self.assertEquals(foofea.get_data()[0].get_feature('child3').get_value(), 'test3')
+
+        self.assertEquals(foofea.get_data()[1].list_features(), ['child1','child2','child3'])
+        self.assertEquals(foofea.get_data()[1].get_feature('child1').get_value(), 'jee')
+        self.assertEquals(foofea.get_data()[1].get_feature('child2').get_value(), 'oo')
+        self.assertEquals(foofea.get_data()[1].get_feature('child3').get_value(), 'aa')
+
+        self.assertEquals(foofea.get_value(), [['test1','test2','test3'],
+                                               ['jee','oo','aa']])
+        self.assertEquals(foofea.get_data()[0][0].get_value(), 'test1')
+        # Test recurse
+        for row in foofea.get_data():
+            for col in row:
+                print col.get_value(),
+            print
+
+    def test_create_configuration_with_sequence_and_add_values_with_default_view(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config = api.Configuration('foo.confml')
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        # Test adding a data row with array
+        foofea.add_sequence(['1','2','3'])
+        foofea.add_sequence(['4','5','6'])
+        foofea.add_sequence(['7','8','9'])
+        print foofea.get_data()[0].get_feature('child1').get_value()
+        self.assertEquals(len(foofea.get_data()), 3)
+        self.assertEquals(foofea.get_value(), [['1','2','3'],
+                                               ['4','5','6'],
+                                               ['7','8','9']
+                                               ])
+
+
+    def test_create_configuration_with_sequence_and_add_sequence_value_directly(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config = api.Configuration('foo.confml')
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        # Test adding a data row with array
+        foofea.set_value([['1','2','3'],
+                         ['4','5','6'],
+                         ['7','8','9']
+                         ])
+        self.assertEquals(len(foofea.get_data()), 3)
+        self.assertEquals(foofea.get_value(), [['1','2','3'],
+                                               ['4','5','6'],
+                                               ['7','8','9']
+                                               ])
+
+    def test_create_configuration_and_access_feature_value_with_property(self):
+        config = api.Configuration('foo.confml')
+        fea= api.Feature("foo")
+        config.add_feature(fea)
+        fea.set_value('test')
+        self.assertEquals(fea.value,'test')
+        dview = config.get_default_view()
+        feaproxy = dview.get_feature('foo')
+        val = feaproxy.value
+        self.assertEquals(val,'test')
+        feaproxy.value = 'test2'
+        self.assertEquals(feaproxy.value,'test2')
+        del feaproxy.value
+        self.assertEquals(feaproxy.value,None)
+        feaproxy.value = 'test3'
+        self.assertEquals(feaproxy.value,'test3')
+
+    def test_create_configuration_and_access_feature_type_with_property(self):
+        config = api.Configuration('foo.confml')
+        fea= api.Feature("foo", type='int')
+        config.add_feature(fea)
+        self.assertEquals(fea.type, 'int') 
+        dview = config.get_default_view()
+        feaproxy = dview.get_feature('foo')
+        self.assertEquals(feaproxy.type, 'int') 
+
+    def test_create_feature_seq_and_access_feature_value_with_property(self):
+        config = api.Configuration('foo.confml')
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child11'),'child1')
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        # Test adding a data row with array
+        foofea.set_value([[['1'],'2','3'],
+                         [['4'],'5','6'],
+                         [['7'],'8','9']
+                         ])
+        self.assertEquals(foofea.value, [[['1'],'2','3'],
+                                         [['4'],'5','6'],
+                                         [['7'],'8','9']
+                                        ])
+
+        foofea.value = [[['1'],'2','3'],
+                         [['7'],'8','9']
+                        ]
+        
+        self.assertEquals(foofea.data[0].value,[['1'],'2','3'])
+        self.assertEquals(foofea.data[1].value,[['7'],'8','9'])
+        self.assertEquals(foofea.data[1][1].value,'8')
+        self.assertEquals(foofea.get_value(), [[['1'],'2','3'],
+                                               [['7'],'8','9']
+                                               ])
+        self.assertEquals(foofea.child1.child11.value,['1','7'])
+        self.assertEquals(foofea.child1.value,[['1'],['7']])
+
+    def test_create_feature_seq_and_access_empty_data(self):
+        config = api.Configuration('foo.confml')
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child11'),'child1')
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        foofea = dview.get_feature('foo')
+        foofea.value = []
+        self.assertEquals(foofea.value, [])
+
+    def test_create_feature_seq_get_sequence_parent(self):
+        config = api.Configuration('foo.confml')
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child11'),'child1')
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        self.assertEquals(fea.child1.get_sequence_parent(), fea)
+        self.assertEquals(fea.child1.child11.get_sequence_parent(), fea)
+
+    def test_clone_feature_sequence(self):
+        fea= api.FeatureSequence("foo")
+        fea.add_feature(api.Feature('child1'))
+        fea.add_feature(api.Feature('child2'))
+        fea.add_feature(api.Feature('child3'))
+        fea2 = fea._clone(recursion=True)
+        self.comparefeatures(fea,fea2)
+        self.assertEquals(fea.list_features(),fea2.list_features())
+
+    def test_create_configuration_with_sequence_and_mapping_properties(self):
+        fea = api.FeatureSequence("SequenceSetting", mapKey='KeySubSetting', mapValue="ValueSubSetting")
+        fea.add_feature(api.Feature('KeySubSetting'))
+        fea.add_feature(api.Feature('ValueSubSetting'))
+        
+        config = api.Configuration('foo.confml')
+        config.add_feature(fea)
+        dview = config.get_default_view()
+        seqfea = dview.get_feature("SequenceSetting")
+
+        self.assertEquals(seqfea.get_map_key().name,"KeySubSetting")
+        self.assertEquals(seqfea.get_map_value().name,"ValueSubSetting")
+        #add item 1
+        data = api.Data(ref='SequenceSetting')
+        data._add(api.Data(ref='KeySubSetting',value='Default'))
+        data._add(api.Data(ref='ValueSubSetting',value='Default value'))
+        seqfea.add_data(data)
+        
+        #add item 2
+        data1 = api.Data(ref='SequenceSetting', policy='append')
+        data1._add(api.Data(ref='KeySubSetting',value='Key 1'))
+        data1._add(api.Data(ref='ValueSubSetting',value='Value 1'))
+        seqfea.add_data(data1)
+        
+        self.assertEquals(len(seqfea.get_data()), 2)
+        
+        self.assertEquals(seqfea.get_map_key_value('Default'),'Default value')
+        self.assertEquals(seqfea.get_map_key_value('Key 1'),'Value 1')
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_layer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,284 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils
+from cone.storage import stringstorage
+
+class TestLayer(unittest.TestCase):    
+    storage_class = stringstorage.StringStorage
+
+    def test_create_layer(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+
+#    def test_create_layer_with_kwargs(self):
+#        store = self.storage_class.open("temp/layertest.pk","w")
+#        layer = api.Layer(store, "foo",confml_path="foobar", implml_path="")
+#        self.assertTrue(layer)
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/foobar")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo")
+#        layer = api.Layer(store, "foo",confml_path="f", implml_path="test", content_path="data", doc_path="foo")
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/f")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo/test")
+#        self.assertEquals(layer.content_folder.get_current_path(),"foo/data")
+#        self.assertEquals(layer.doc_folder.get_current_path(),"foo/foo")
+#        layer = api.Layer(store, "foo")
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/confml")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo/implml")
+#        self.assertEquals(layer.content_folder.get_current_path(),"foo/content")
+#        self.assertEquals(layer.doc_folder.get_current_path(),"foo/doc")
+
+    def test_get_path(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+        self.assertEquals(layer.get_current_path(),"foo")
+
+    def test_open_resource(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+        res = layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_resources("", True),["confml/test.confml"])
+        self.assertEquals(store.list_resources("", True),["foo/confml/test.confml"])
+
+    def test_create_two_layers_and_open_resource(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        foo_layer = api.Layer(store, "foo")
+        bar_layer = api.Layer(store, "bar")
+        res = foo_layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = foo_layer.open_resource("root.confml","w")
+        res.close()
+        res = bar_layer.open_resource("confml/root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(foo_layer.list_resources("", True),['confml/test.confml', 'root.confml'])
+        self.assertEquals(store.list_resources("", True),['bar/confml/root.confml','foo/confml/test.confml','foo/root.confml'])        
+        foo_layer.delete_resource("confml/test.confml")
+        self.assertEquals(foo_layer.list_resources("", True),["root.confml"])
+        self.assertEquals(store.list_resources("", True),["bar/confml/root.confml","foo/root.confml"])
+
+    def test_list_confml(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_confml(),['confml/foo.confml', 'confml/test.confml'])
+
+    def test_list_implml(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("implml/stuff/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_implml(),['implml/stuff/test.confml'])
+
+    def test_list_content(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("content/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("content/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_content(),['content/bar/test.txt', 'content/foo.confml'])
+
+    def test_list_doc(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("doc/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_doc(),['doc/bar/test.txt', 'doc/foo.confml'])
+
+    def test_list_layer_resources(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/bar.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("content/data/abc.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("foo.txt","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_all_resources(),['confml/bar.confml', 
+                                                        'confml/foo.confml', 
+                                                        'content/data/abc.txt', 
+                                                        'doc/bar/test.txt'])
+
+    def test_list_layer_with_sublayer(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        layer = api.Layer(store, "foo", layers=[api.Layer(store, "bar")])
+        res = layer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/bar.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("content/data/abc.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("foo.txt","w")
+        res.write("foo.conf")
+        res.close()
+        barlayer = layer.get_layer('bar')
+        res = barlayer.open_resource("content/barcode.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = barlayer.open_resource("confml/hooo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        
+        self.assertEquals(layer.list_all_resources(),['confml/bar.confml', 
+                                                        'confml/foo.confml', 
+                                                        'content/data/abc.txt', 
+                                                        'doc/bar/test.txt',
+                                                        'bar/confml/hooo.confml',
+                                                        'bar/content/barcode.txt'])
+        
+        self.assertEquals(layer.list_implml(),[])
+        self.assertEquals(layer.list_confml(),['confml/bar.confml',
+                                               'confml/foo.confml',
+                                               'bar/confml/hooo.confml'])
+        self.assertEquals(layer.list_content(),['content/data/abc.txt', 'bar/content/barcode.txt'])
+        self.assertEquals(layer.list_doc(),['doc/bar/test.txt'])
+
+class TestCompositeLayer(unittest.TestCase):    
+    storage_class = stringstorage.StringStorage
+
+    def test_create_compositelayer(self):
+        store = self.storage_class.open("temp/layertestcomposite.pk","w")
+        clayer = api.CompositeLayer()
+        self.assertTrue(clayer)
+
+    def test_create_with_layer(self):
+        store = self.storage_class.open("temp/layertestcomposite.pk","w")
+        clayer = api.CompositeLayer("sub",layers=[api.Layer(store,"test"), api.Layer(store,"foo/bar")])
+        self.assertEquals(clayer.list_layers(),['test', 'foo/bar'])
+
+    def test_create_with_layer_and_add(self):
+        store = self.storage_class.open("temp/layertestcomposite.pk","w")
+        clayer = api.CompositeLayer(layers=[api.Layer(store,"test"), api.Layer(store,"foo/bar")])
+        self.assertEquals(clayer.list_layers(),['test', 'foo/bar'])
+        clayer.add_layer(api.Layer(store,"res"))
+        self.assertEquals(clayer.list_layers(),['test', 'foo/bar', 'res'])
+
+    def test_get_layer(self):
+        store = self.storage_class.open("temp/layertestcomposite.pk","w")
+        clayer = api.CompositeLayer(layers=[api.Layer(store,"test"), api.Layer(store,"foo/bar")])
+        self.assertEquals(clayer.list_layers(),['test', 'foo/bar'])
+        layer = clayer.get_layer('foo/bar')
+        self.assertEquals(layer.get_current_path(),'foo/bar')
+
+    def test_create_layers_with_resources_and_list_with_composite(self):
+        store = self.storage_class.open("temp/layertest.pk","w")
+        foolayer = api.Layer(store, "foo")
+        res = foolayer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = foolayer.open_resource("implml/foo2.crml","w")
+        res.write("foo.conf")
+        res.close()
+        res = foolayer.open_resource("confml/bar.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = foolayer.open_resource("content/data/abc.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = foolayer.open_resource("foo.txt","w")
+        res.write("foo.conf")
+        res.close()
+        barlayer = api.Layer(store, "bar")
+        res = barlayer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = barlayer.open_resource("implml/foo.crml","w")
+        res.write("foo.conf")
+        res.close()
+        res = barlayer.open_resource("confml/bar.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = barlayer.open_resource("content/data/abc.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = barlayer.open_resource("foo.txt","w")
+        res.write("foo.conf")
+        res.close()
+        clayer = api.CompositeLayer('test',layers=[foolayer,barlayer])
+        
+        self.assertEquals(clayer.list_all_resources(),['foo/confml/bar.confml', 
+                                                       'foo/content/data/abc.txt', 
+                                                       'foo/doc/bar/test.txt', 
+                                                       'foo/implml/foo2.crml', 
+                                                       'bar/confml/bar.confml', 
+                                                       'bar/content/data/abc.txt', 
+                                                       'bar/doc/bar/test.txt',
+                                                       'bar/implml/foo.crml',])
+        self.assertEquals(clayer.list_implml(),['foo/implml/foo2.crml','bar/implml/foo.crml'])
+        self.assertEquals(clayer.list_confml(),['foo/confml/bar.confml', 'bar/confml/bar.confml'])
+        self.assertEquals(clayer.list_content(),['foo/content/data/abc.txt', 'bar/content/data/abc.txt'])
+        self.assertEquals(clayer.list_doc(),['foo/doc/bar/test.txt', 'bar/doc/bar/test.txt'])
+
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_mapping.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+import unittest
+import string
+import sys
+import os
+import shutil
+import __init__
+
+from cone.public import api, exceptions, mapping
+
+class TestMapping(unittest.TestCase):
+    def test_get_mapper(self):
+        mapper = api.get_mapper('confml')
+        self.assertTrue(isinstance(mapper, mapping.BaseMapper))
+
+    def test_map_feature(self):
+        fea = api.Feature("test")
+        mapper = fea._get_mapper('confml')
+        fea2 = mapper.map_object(fea)
+        self.assertEquals(fea,fea2)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_options.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,104 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test sets
+"""
+import unittest
+import sets
+import sys
+import os
+import __init__
+
+from cone.public import api,exceptions,utils
+
+
+class TestOption(unittest.TestCase):
+    def test_create_option(self):
+        elem = api.Option('test','123')
+        self.assertTrue(elem)
+        self.assertTrue(elem.get_name(),'test')
+        self.assertTrue(elem.get_value(),'123')
+    
+    def test_add_option(self):
+        fea = api.Feature('test')
+        fea.add_option(api.Option('foo','1'))
+        fea.add_option(api.Option('test','2'))
+        self.assertEquals(fea.list_options(), ['value_1','value_2'])
+    
+    def test_add_option_invalid_param(self):
+        fea = api.Feature('test')
+        self.assertRaises(TypeError, fea.add_option, object())
+
+    def test_option_compare(self):
+        elem1 = api.Option('test','1')
+        elem2 = api.Option('foo','2')
+        elem3 = api.Option('test','3')
+        self.assertFalse(elem1==elem2)
+        self.assertFalse(elem1==elem3)
+        self.assertTrue(elem1=='opt_value_1')
+        self.assertTrue(elem2=='opt_value_2')
+        self.assertTrue('opt_value_2' == elem2)
+
+    def test_create_feature_with_options(self):
+        fea = api.Feature('test')
+        fea.create_option('foo','3')
+        fea.create_option('test','4')
+        self.assertEquals(fea.list_options(), ['value_3','value_4'])
+        self.assertEquals(fea.opt_value_3.get_name(),'foo')
+        self.assertEquals(fea.opt_value_3.get_value(),'3')
+        self.assertEquals(fea.opt_value_4.get_name(),'test')
+        self.assertEquals(fea.opt_value_4.get_value(),'4')
+    
+    def test_list_and_get_options(self):
+        fea = api.Feature('test')
+        fea.create_option('foo','1')
+        fea.create_option('test','2')
+        fea.create_option('bar','3')
+        
+        self.assertEquals(fea.list_options(), ['value_1', 'value_2', 'value_3'])
+        
+        self.assertEquals(fea.get_option('value_1').get_name(), 'foo')
+        self.assertEquals(fea.get_option('value_2').get_name(), 'test')
+        self.assertEquals(fea.get_option('value_3').get_name(), 'bar')
+    
+    def test_get_option_nonexistent(self):
+        fea = api.Feature('test')
+        self.assertRaises(exceptions.NotFound, fea.get_option, 'foo')
+    
+    def test_get_option_invalid_type(self):
+        fea = api.Feature('test')
+        fea.add(api.Feature('opt_foo'))
+        self.assertRaises(TypeError, fea.get_option, 'foo')
+    
+    def test_remove_option(self):
+        fea = api.Feature('test')
+        fea.create_option('foo','1')
+        fea.create_option('test','2')
+        fea.create_option('bar','3')
+        self.assertEquals(fea.list_options(), ['value_1', 'value_2', 'value_3'])
+        
+        fea.remove_option('value_2')
+        self.assertEquals(fea.list_options(), ['value_1', 'value_3'])
+    
+    def test_remove_option_nonexistent(self):
+        fea = api.Feature('test')
+        self.assertRaises(exceptions.NotFound, fea.remove_option, 'xyz')
+    
+    def test_remove_option_invalid_param(self):
+        fea = api.Feature('test')
+        fea.add(api.Feature('opt_xyz'))
+        self.assertRaises(TypeError, fea.remove_option, 'xyz')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_persistence.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import persistence, exceptions
+
+class ConeDummyReader(persistence.ConeReader):
+    
+    @classmethod
+    def supported_elem(cls, elemname):
+        if elemname.lower() == "dum":
+            return True
+        else:
+            return False
+  
+    def __init__(self):
+        super(persistence.ConeReader,self).__init__()
+    
+
+class ConeDummyWriter(persistence.ConeWriter):
+    @classmethod
+    def supported_class(cls, classname):
+        if classname.lower() == "dum":
+            return True
+        else:
+            return False
+  
+    def __init__(self):
+        super(persistence.ConeWriter,self).__init__()
+    
+
+class TestFactory(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    # @test 
+    def test_get_reader_fails(self):
+        try:
+            persistence.PersistenceFactory.get_reader_for_elem("")
+            self.fail("Not existing reader creation succeeds?")
+        except exceptions.ConePersistenceError,e:
+            self.assertTrue(True)
+
+    def test_get_writer_fails(self):
+        try:
+            persistence.PersistenceFactory.get_writer_for_class("")
+            self.fail("Not existing writer creation succeeds?")
+        except exceptions.ConePersistenceError,e:
+            self.assertTrue(True)
+
+    def test_get_reader_ok(self):
+        r = persistence.PersistenceFactory.get_reader_for_elem("Dum")
+        self.assertTrue(isinstance(r,ConeDummyReader))
+
+    def test_get_reader_low(self):
+        r = persistence.PersistenceFactory.get_reader_for_elem("dum")
+        self.assertTrue(isinstance(r,ConeDummyReader))
+
+    def test_get_reader_upper(self):
+        r = persistence.PersistenceFactory.get_reader_for_elem("DUM")
+        self.assertTrue(isinstance(r,ConeDummyReader))
+
+    def test_get_writer_ok(self):
+        r = persistence.PersistenceFactory.get_writer_for_class("Dum")
+        self.assertTrue(isinstance(r,ConeDummyWriter))
+
+    def test_get_writer_ok_low(self):
+        r = persistence.PersistenceFactory.get_writer_for_class("dum")
+        self.assertTrue(isinstance(r,ConeDummyWriter))
+
+
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_plugin_api.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1081 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import os
+import logging
+import __init__
+from cone.public import *
+from cone.public import _plugin_reader
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+Tfd = _plugin_reader.TempVariableDefinition
+Tsfd = _plugin_reader.TempVariableSequenceDefinition
+Sro = _plugin_reader.SettingRefsOverride
+
+
+
+MULTI_IMPL_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<common:container xmlns:common="http://www.symbianfoundation.org/xml/implml/1">
+    <impl xmlns="http://www.test.com/xml/1">
+        <elem x="1" y="2"/>
+    </impl>
+    
+    <impl xmlns="http://www.test.com/xml/2">
+        <dummy z="500"/>
+        <elem x="10" y="20"/>
+    </impl>
+    
+    <impl xmlns="http://www.test.com/xml/3">
+        <elem x="100" y="200"/>
+        <elem z="300"/>
+    </impl>
+</common:container>
+""".encode('utf-8')
+
+MULTI_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+    xmlns:ns0="http://www.test.com/xml/1" 
+    xmlns:ns2="http://www.test.com/xml/2"
+    xmlns:ns3="http://www.test.com/xml/3">
+    
+    <ns0:impl>
+      <ns0:elem x="1" y="2"/>
+    </ns0:impl>
+
+    <ns2:impl>
+      <ns2:dummy z="500"/>
+      <ns2:elem x="10" y="20"/>
+    </ns2:impl>
+
+    <ns3:impl>
+      <ns3:elem x="100" y="200"/>
+      <ns3:elem z="300"/>
+    </ns3:impl>
+</container>
+""".encode('utf-8')
+
+MULTI_IMPL_3 = """<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <impl1:impl xmlns:impl1="http://www.test.com/xml/1">
+        <impl1:elem x="1" y="2"/>
+    </impl1:impl>
+    
+    <impl2:impl xmlns:impl2="http://www.test.com/xml/2">
+        <impl2:elem x="1" y="2"/>
+    </impl2:impl>
+    
+    <impl1:impl xmlns:impl1="http://www.test.com/xml/1">
+        <impl1:elem a="1" b="2"/>
+    </impl1:impl>
+    
+    <impl2:impl xmlns:impl2="http://www.test.com/xml/2">
+        <impl2:elem a="1" b="2"/>
+    </impl2:impl>
+</container>
+""".encode('utf-8')
+
+UNSUPPORTED_IMPL_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<test_impl>
+    <impl xmlns="http://www.test.com/xml/1">
+        <elem x="1" y="2"/>
+    </impl>
+    
+    <impl xmlns="http://www.test.com/xml/2">
+        <dummy z="500"/>
+        <elem x="10" y="20"/>
+    </impl>
+    
+    <impl xmlns="http://www.test.com/xml/4">
+        <elem x="1" y="2"/>
+    </impl>
+</test_impl>
+""".encode('utf-8')
+
+UNSUPPORTED_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<test_impl xmlns="http://www.test.com/xml/6"
+    xmlns:ns2="http://www.test.com/xml/2"
+    xmlns:ns4="http://www.test.com/xml/4">
+    
+    <elem x="1" y="2"/>
+
+    <ns2:dummy z="500"/>
+    <ns2:elem x="10" y="20"/>
+
+    <ns4:elem x="1" y="2"/>
+</test_impl>
+""".encode('utf-8')
+
+SINGLE_IMPL_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<impl xmlns="http://www.test.com/xml/1">
+    <elem x="1"/>
+    <elem y="2"/>
+    <elem z="3"/>
+</impl>
+""".encode('utf-8')
+
+SINGLE_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<joujou xmlns="http://www.test.com/xml/2"/>
+""".encode('utf-8')
+
+SINGLE_IMPL_3 = """<?xml version="1.0" encoding="UTF-8"?>
+<impl xmlns="http://www.test.com/xml/3">
+    <elem x="1"/>
+</impl>
+""".encode('utf-8')
+
+IGNORED_NAMESPACE_IMPL_1 = """<?xml version="1.0" encoding="UTF-8"?>
+<common:container xmlns:common="http://www.symbianfoundation.org/xml/implml/1">
+    <impl xmlns="http://www.test.com/xml/3">
+        <elem x="1"/>
+    </impl>
+    
+    <ignored xmlns:ignored="http://www.test.com/xml/ignored/3">
+        <elem test="foo"/>
+    </ignored>
+</common:container>
+""".encode('utf-8')
+
+IGNORED_NAMESPACE_IMPL_2 = """<?xml version="1.0" encoding="UTF-8"?>
+<impl xmlns="http://www.test.com/xml/3" xmlns:ignored="http://www.test.com/xml/ignored/3">
+    <elem x="1"/>
+    <ignored:some_elem/>
+</impl>
+""".encode('utf-8')
+
+NO_IMPL = """<?xml version="1.0" encoding="UTF-8"?>
+<impl>
+</impl>
+""".encode('utf-8')
+
+class Mock(object):
+    pass
+
+class MockView(object):
+    def __init__(self, feature_dict):
+        self.feature_dict = feature_dict
+    
+    def get_feature(self, ref):
+        feature = Mock()
+        feature.get_value = lambda: self.feature_dict[ref]
+        feature.get_original_value = lambda: self.feature_dict[ref]
+        return feature
+
+class MockConfiguration(object):
+    def __init__(self, resources, features={}):
+        self.resources = resources
+        self.features = features
+    
+    def get_resource(self, ref):
+        res = Mock()
+        res.read = lambda: self.resources[ref]
+        res.close = lambda: None
+        return res
+    
+    def get_layer(self):
+        layer = Mock()
+        layer.list_implml = lambda: self.resources.keys()
+        return layer
+    
+    def get_doc(self, ref):
+        return utils.etree.fromstring(self.get_resource(ref).read())
+    
+    def get_default_view(self):
+        return MockView(self.features)
+
+class MockImpl(plugin.ImplBase):
+    def __init__(self, data):
+        self.data = data
+        self.generate_invoked = False
+    
+    @classmethod
+    def create(cls, resource_ref, configuration, data):
+        impl = cls(data)
+        plugin.ImplBase.__init__(impl, resource_ref, configuration)
+        return impl
+    
+    def generate(self, context=None):
+        if context and hasattr(context,'objects'):
+            context.objects.append(self) 
+        self.generate_invoked = True
+    
+    def __repr__(self):
+        return "MockImpl(%r)" % self.data
+    
+    def __eq__(self, other):
+        if type(self) == type(other):
+            return self.data == other.data
+        else:
+            return False
+    
+    def __ne__(self, other):
+        return not (self == other)
+        
+    def __lt__(self, other):
+        if type(self) == type(other):
+            return self.data < other.data
+        else:
+            return False
+
+class MockReaderBase(plugin.ReaderBase):
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, root_elem):
+        data = [cls.__name__, resource_ref]
+        for elem in root_elem.findall('{%s}elem' % cls.NAMESPACE):
+            data.append(elem.attrib)
+        return MockImpl.create(resource_ref, configuration, data)
+
+class MockReader1(MockReaderBase):
+    NAMESPACE = "http://www.test.com/xml/1"
+    FILE_EXTENSIONS = ['mock1ml']
+class MockReader2(MockReaderBase):
+    NAMESPACE = "http://www.test.com/xml/2"
+    FILE_EXTENSIONS = ['mock2ml']
+class MockReader3(MockReaderBase):
+    NAMESPACE = "http://www.test.com/xml/3"
+    IGNORED_NAMESPACES = ["http://www.test.com/xml/ignored/3"]
+    FILE_EXTENSIONS = ['mock3ml', 'test3ml']
+
+MOCK_READER_CLASSES = [MockReader1, MockReader2, MockReader3]
+
+mock_config = MockConfiguration({
+    'layer1/implml/multi1.implml'           : MULTI_IMPL_1,
+    'layer1/implml/multi2.implml'           : MULTI_IMPL_2,
+    'layer1/implml/multi3.implml'           : MULTI_IMPL_3,
+    'layer1/implml/unsupported1.implml'     : UNSUPPORTED_IMPL_1,
+    'layer1/implml/unsupported2.implml'     : UNSUPPORTED_IMPL_2,
+    'layer1/implml/single1.implml'          : SINGLE_IMPL_1,
+    'layer1/implml/single2.implml'          : SINGLE_IMPL_2,
+    'layer1/implml/single3.implml'          : SINGLE_IMPL_3,
+    'layer1/implml/none.implml'             : NO_IMPL,
+    'layer1/implml/broken.implml'           : 'Some invalid XML data...',
+    'layer1/implml/single1.mock1ml'         : SINGLE_IMPL_1,
+    'layer1/implml/single2.mock2ml'         : SINGLE_IMPL_2,
+    'layer1/implml/single3.mock3ml'         : SINGLE_IMPL_3,
+    'layer1/implml/single3.test3ml'         : SINGLE_IMPL_3,
+    'layer1/implml/ignored_ns_1.mock3ml'    : IGNORED_NAMESPACE_IMPL_1,
+    'layer1/implml/ignored_ns_2.mock3ml'    : IGNORED_NAMESPACE_IMPL_2,
+    'layer1/implml/multi1.dummyml'          : MULTI_IMPL_1,
+    'layer1/implml/dummy'                   : MULTI_IMPL_1,
+})
+
+class TestPluginImplBase(unittest.TestCase):
+    def setUp(self):
+        pass
+
+    def test_implbase_add_tags(self):
+        impl = plugin.ImplBase('test',None)
+        impl.set_tags({'target': ['test', 'foo']})
+        self.assertEquals(impl.get_tags()['target'],['test','foo'])
+        #self.assertEquals(impl.has_tag({}, policy='OR'), True)
+        self.assertEquals(impl.has_tag({'target': ['test']}, policy='OR'), True)
+        self.assertEquals(impl.has_tag({'target': ['test']}, policy='AND'), True)
+        self.assertEquals(impl.has_tag({'target': ['foo']}, policy='OR'), True)
+        self.assertEquals(impl.has_tag({'target': ['foo']}, policy='AND'), True)
+        self.assertEquals(impl.has_tag({'target': ['test','foo']}, policy='OR'), True)
+        self.assertEquals(impl.has_tag({'target': ['test','foo']}, policy='AND'), True)
+        self.assertEquals(impl.has_tag({'target': ['test2','foo']}, policy='OR'), True)
+        self.assertEquals(impl.has_tag({'target': ['test2','foo']}, policy='AND'), False)
+        self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='OR'), False)
+        self.assertEquals(impl.has_tag({'foo': ['foo']}, policy='AND'), False)
+        self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='AND'), False)
+        self.assertEquals(impl.has_tag({'target': ['foo'], 'foo':['bar']}, policy='OR'), True)
+    
+    def test_implbase_tags_with_refs(self):
+        config = MockConfiguration({}, features = {
+            'Foo.Bar'           : 'foobar',
+            'Foo.Baz'           : 'foobaz',
+            'Feature.TagName'   : 'tagname',
+            'Feature.TagValue'  : 'tagvalue',
+        })
+        
+        impl = plugin.ImplBase('test', config)
+        impl.set_tags({
+            'test'              : ['${Foo.Bar}', 'foo', 'bar', '${Foo.Bar} and ${Foo.Baz}'],
+            '${Feature.TagName}': ['${Feature.TagValue}']})
+        
+        expected = {
+            'test': ['foobar', 'foo', 'bar', 'foobar and foobaz'],
+            'tagname': ['tagvalue'],
+        }
+        self.assertEquals(impl.get_tags(), expected)
+    
+    def test_has_ref(self):
+        impl = plugin.ImplBase('test', None)
+        self.assertEquals(impl.has_ref('Foo.Bar'), None)
+        
+        impl.get_refs = lambda: ['Foo.Bar', 'Xyz']
+        
+        # Test using different supported parameter types
+        self.assertTrue(impl.has_ref('Foo.Bar'))
+        self.assertTrue(impl.has_ref(['Foo.Bar']))
+        self.assertTrue(impl.has_ref(('Foo.Bar',)))
+        
+        # Impl uses the exact given ref
+        self.assertTrue(impl.has_ref('Foo.Bar'))
+        self.assertTrue(impl.has_ref('Xyz'))
+        
+        # Impl uses the given ref's parent ref
+        self.assertTrue(impl.has_ref('Foo.Bar.Baz'))
+        self.assertTrue(impl.has_ref('Xyz.Zyx'))
+        
+        # Impl does not use the entire parent ref of 'Foo.Bar', only the
+        # 'Bar' sub-ref
+        self.assertFalse(impl.has_ref('Foo'))
+        
+        # Various refs almost matching a specified ref
+        self.assertFalse(impl.has_ref('Fo'))
+        self.assertFalse(impl.has_ref('Fog'))
+        self.assertFalse(impl.has_ref('Food'))
+        self.assertFalse(impl.has_ref('Foo.Ba'))
+        self.assertFalse(impl.has_ref('Foo.Bag'))
+        self.assertFalse(impl.has_ref('Foo.Bard'))
+        
+        # Various refs not at all in the impl's ref list
+        self.assertFalse(impl.has_ref('Yay'))
+        self.assertFalse(impl.has_ref(['Yay', 'Fhtagn']))
+        
+        # One of the refs in the given list matches
+        self.assertTrue(impl.has_ref(['Yay', 'Fhtagn', 'Foo.Bar']))
+        self.assertTrue(impl.has_ref(['Yay', 'Foo.Bar.Baz', 'Fhtagn']))
+        self.assertTrue(impl.has_ref(['Yay', 'Xyz', 'Fhtagn']))
+        
+    def test_impl_container_eval_context_with_tags(self):
+        container = plugin.ImplBase("norm", None)
+        context = plugin.GenerationContext()
+        self.assertTrue(container._eval_context(context))
+        container.set_tags({'target':['rofs2','core']})
+        context.tags = {'target': ['rofs2'], 'foobar': ['test']}
+        self.assertTrue(container._eval_context(context))
+        context.tags_policy = "AND"
+        self.assertFalse(container._eval_context(context))
+        container.set_tags({})
+        self.assertFalse(container._eval_context(context))
+        context.tags = {'target': ['rofs2']}
+        self.assertFalse(container._eval_context(context))
+        context.tags = {}
+        self.assertTrue(container._eval_context(context))
+
+class TestPluginImplSet(unittest.TestCase):
+    
+    def test_add_implementation_and_list(self):
+        container = plugin.ImplSet()
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        imp2a = plugin.ImplBase("implml/copy.content",None)
+        imp2b = plugin.ImplBase("implml/copy.content",None)
+        container.add_implementation(imp1)
+        container.add_implementation(imp2a)
+        container.add_implementation(imp2b)
+        self.assertEquals(sorted(container.list_implementation()),
+                          sorted(['implml/test.content',
+                                  'implml/copy.content']))
+
+    def test_add_implementation_and_get_implementations_by_file(self):
+        container = plugin.ImplSet()
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        imp2a = plugin.ImplBase("implml/copy.content",None)
+        imp2b = plugin.ImplBase("implml/copy.content",None)
+        container.add_implementation(imp1)
+        container.add_implementation(imp2a)
+        container.add_implementation(imp2b)
+        self.assertEquals(container.get_implementations_by_file("implml/test.content"), [imp1])
+        self.assertEquals(sorted(container.get_implementations_by_file("implml/copy.content")),
+                          sorted([imp2a, imp2b]))
+
+    def test_add_implementation_and_remove_implementation(self):
+        container = plugin.ImplSet()
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        imp2a = plugin.ImplBase("implml/copy.content",None)
+        imp2b = plugin.ImplBase("implml/copy.content",None)
+        container.add_implementation(imp1)
+        container.add_implementation(imp2a)
+        container.add_implementation(imp2b)
+        container.remove_implementation("implml/test.content")
+        self.assertEquals(len(container.list_implementation()),1)
+        self.assertEquals(container.list_implementation()[0],"implml/copy.content")
+
+    def test_add_implementation_and_remove_all(self):
+        container = plugin.ImplSet()
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        imp2a = plugin.ImplBase("implml/copy.content",None)
+        imp2b = plugin.ImplBase("implml/copy.content",None)
+        imp3  = plugin.ImplBase("implml/foo.content",None)
+        container.add_implementation(imp1)
+        container.add_implementation(imp2a)
+        container.add_implementation(imp2b)
+        container.add_implementation(imp3)
+        for implref in container.list_implementation():
+            container.remove_implementation(implref)
+        self.assertEquals(len(container.list_implementation()),0)
+
+    def test_create_impl_set(self):
+        plugin.create_impl_set('',None);
+        pass
+
+    def test_add_implementation_find_with_tags(self):
+        class TestPlugin(plugin.ImplBase):
+            pass
+        container = plugin.ImplSet()
+        imp1 = TestPlugin("implml/test.content",None)
+        imp2 = TestPlugin("implml/copy.content",None)
+        imp3 = TestPlugin("implml/foo.content",None)
+        imp1.set_tags({'target': ['core','rofs2','rofs3']})
+        imp2.set_tags({'target': ['rofs3','uda']})
+        imp3.set_tags({'target': ['mmc','uda']})
+        container.add_implementation(imp1)
+        container.add_implementation(imp2)
+        container.add_implementation(imp3)
+        self.assertEquals(list(container.filter_implementations(tags={'target' : ['rofs3']})),
+                          [imp1,imp2])
+        self.assertEquals(list(container.filter_implementations(tags={'target' : ['uda']})),
+                          [imp2,imp3])
+        self.assertEquals(list(container.filter_implementations(tags={'target' : ['mmc','uda']}, policy='AND')),
+                          [imp3])
+        self.assertEquals(list(container.filter_implementations(tags={'target' : ['mmc','uda']}, policy='OR')),
+                          [imp2, imp3])
+        cont = container.filter_implementations(tags={'target' : ['core']}) | container.filter_implementations(tags={'target' : ['mmc']}) 
+        self.assertEquals(len(cont),2)
+        self.assertEquals(list(cont), [imp1,imp3])
+
+        cont = container.filter_implementations(tags={'target' : ['rofs3']}) & container.filter_implementations(tags={'target' : ['uda']}) 
+        self.assertEquals(len(cont),1)
+        self.assertEquals(list(cont), [imp2])
+    
+    def test_pre_impl_filter(self):
+        resources = [
+            "foo.txt",
+            ".hidden_file",
+            ".test/test.txt",
+            "layer1/implml/.hidden",
+            "layer1/implml/test.crml",
+            "layer1/implml/test3.gcfml",
+            "layer1/implml/.svn/text-base/test.crml.svn-base",
+            "layer1/implml/subdir/test5.crml",
+            "layer1/implml/subdir/test6.ruleml",
+            "layer1/implml/subdir/.scripts/test6_ruleml.py",
+        ]
+        
+        expected = [
+            "foo.txt",
+            "layer1/implml/test.crml",
+            "layer1/implml/test3.gcfml",
+            "layer1/implml/subdir/test5.crml",
+            "layer1/implml/subdir/test6.ruleml",
+        ]
+        
+        self.assertEquals(expected, plugin.pre_filter_impls(resources))
+        
+        # Test with backslashes
+        resources = map(lambda path: path.replace('/', '\\'), resources)
+        expected = map(lambda path: path.replace('/', '\\'), expected)
+        self.assertEquals(expected, plugin.pre_filter_impls(resources))
+
+
+class TestPluginImplSetCopy(unittest.TestCase):
+    class TestImpl(plugin.ImplBase):
+        pass # No default invocation phase specified, should be 'normal'
+    class PreImpl(plugin.ImplBase):
+        DEFAULT_INVOCATION_PHASE = 'pre'
+    class NormalImpl(plugin.ImplBase):
+        DEFAULT_INVOCATION_PHASE = 'normal'
+    class PostImpl(plugin.ImplBase):
+        DEFAULT_INVOCATION_PHASE = 'post'
+
+    def setUp(self):
+        plugin.ImplFactory.set_reader_classes_override(MOCK_READER_CLASSES)
+    
+    def tearDown(self):
+        plugin.ImplFactory.set_reader_classes_override(None)
+    
+    def _get_impl_container(self):
+        impl_files = ['layer1/implml/single1.implml',
+                      'layer1/implml/single2.implml',
+                      'layer1/implml/single3.implml',
+                      'layer1/implml/multi1.implml',
+                      'layer1/implml/multi2.implml']
+        return plugin.create_impl_set(impl_files, mock_config)
+    
+
+    def test_get_test_impl_container(self):
+        container = self._get_impl_container()
+        # There are 5 ImplML files
+        self.assertEquals(len(container.list_implementation()), 5)
+        # ...but two of them contain 3 implementations each
+        self.assertEquals(len(container), 5)
+    
+    def _get_phase_test_impl_container(self):
+        return plugin.ImplSet([
+            self.TestImpl('foo.test', None),
+            self.NormalImpl('foo.norm', None),
+            self.PreImpl('foo.pre', None),
+            self.PostImpl('test.post', None),
+            self.PostImpl('foo.post', None),
+        ])
+    
+    def test_get_phase_test_impl_container(self):
+        container = self._get_phase_test_impl_container()
+        self.assertEquals(5, len(container))
+        self.assertEquals(len(container.list_implementation()), 5)
+        
+        def check(filename, phase):
+            impls = container.get_implementations_by_file(filename)
+            self.assertEquals(1, len(impls))
+            impl = impls[0]
+            self.assertEquals(impl.ref, filename)
+            self.assertEquals(impl.invocation_phase(), phase)
+        check('foo.test', 'normal')
+        check('foo.norm', 'normal')
+        check('foo.pre', 'pre')
+        check('test.post', 'post')
+        check('foo.post', 'post')
+        
+        return container
+    
+    def test_create_impl_set(self):
+        container = self._get_impl_container()
+        # There are 5 ImplML files
+        self.assertEquals(len(container.list_implementation()), 5)
+        # ...but two of them contain 3 implementations each
+        self.assertEquals(len(container), 5)
+    
+    def test_invocation_phases(self):
+        container = self._get_phase_test_impl_container()
+        phases = container.invocation_phases()
+        self.assertEquals(phases,['pre','normal','post'])
+ 
+    def test_copy(self):
+        container = self._get_impl_container()
+        newcontainer = container.copy()
+        self.assertTrue(newcontainer is not container)
+        self.assertEquals(len(newcontainer), 5)
+
+    def test_execute_generate(self):
+        container = self._get_impl_container()
+        container.execute(container, 'generate')
+        actual_impls = []
+        for impl in container:
+            if isinstance(impl, plugin.ImplContainer):
+                actual_impls += impl.get_all_implementations()
+            else:
+                actual_impls.append(impl)
+        for impl in actual_impls:
+            self.assertTrue(impl.generate_invoked)
+
+    def test_impl_container_generate(self):
+        container = self._get_impl_container()
+        context = plugin.GenerationContext()
+        context.history = ""
+        context.objects = []
+        container.generate(context)
+        self.assertEquals(len(context.objects), 9)
+        actual_impls = []
+        for impl in container:
+            if isinstance(impl, plugin.ImplContainer):
+                actual_impls += impl.get_all_implementations()
+            else:
+                actual_impls.append(impl)
+        for impl in actual_impls:
+            self.assertTrue(impl.generate_invoked)
+
+    def test_filter_all(self):
+        container = self._get_impl_container()
+        impl_list = container.filter_implementations()
+        self.assertEquals(len(impl_list), 5)
+
+    def test_filter_for_pre_phase(self):
+        container = self._get_phase_test_impl_container()
+        impl_list = list(container.filter_implementations(phase='pre'))
+        self.assertEquals(len(impl_list), 1)
+        self.assertEquals(impl_list[0].invocation_phase(), 'pre')
+        self.assertEquals(impl_list[0].ref, 'foo.pre')
+
+    def test_filter_for_normal_phase(self):
+        container = self._get_phase_test_impl_container()
+        impl_list = list(container.filter_implementations(phase='normal'))
+        self.assertEquals(len(impl_list), 2)
+        self.assertEquals(impl_list[0].invocation_phase(), 'normal')
+        self.assertEquals(impl_list[1].invocation_phase(), 'normal')
+
+    def test_filter_for_post_phase(self):
+        container = self._get_phase_test_impl_container()
+        impl_list = list(container.filter_implementations(phase='post'))
+        self.assertEquals(len(impl_list), 2)
+        self.assertEquals(impl_list[0].invocation_phase(), 'post')
+        self.assertEquals(impl_list[1].invocation_phase(), 'post')
+
+
+class TestPluginImplSettings(unittest.TestCase):
+    class Test1Impl(plugin.ImplBase):
+        IMPL_TYPE_ID = "test1"
+    class Test2Impl(plugin.ImplBase):
+        IMPL_TYPE_ID = "test2"
+    class Test3Impl(plugin.ImplBase):
+        IMPL_TYPE_ID = "test3"
+
+    def test_plugin_settings(self):
+        settings.SettingsFactory.cone_parser().read([os.path.join(ROOT_PATH,'test_defaults.cfg')])
+        impl = TestPluginImplSettings.Test1Impl("",None)
+        self.assertEquals(impl.output_root, 'output')
+        self.assertEquals(impl.output_subdir, '')
+        impl.output_subdir = 'foobar'
+        self.assertEquals(impl.get_tags(), {})
+        self.assertEquals(impl.output, 'output/foobar')
+
+        impl = TestPluginImplSettings.Test2Impl("",None)
+        self.assertEquals(impl.output_subdir, '')
+
+
+
+class TestReaders(unittest.TestCase):
+    
+    def setUp(self):
+        plugin.ImplFactory.set_reader_classes_override(MOCK_READER_CLASSES)
+    
+    def tearDown(self):
+        plugin.ImplFactory.set_reader_classes_override(None)
+    
+    def assert_namespace_list_equals(self, resource_ref, expected_namespaces):
+        self.assertEquals(
+            expected_namespaces,
+            _plugin_reader.ImplReader._get_namespaces(mock_config.get_doc(resource_ref)))
+    
+    def test_get_needed_reader_classes(self):
+        self.assert_namespace_list_equals('layer1/implml/none.implml', [])
+        
+        self.assert_namespace_list_equals('layer1/implml/single1.implml',
+            ['http://www.test.com/xml/1'])
+        
+        self.assert_namespace_list_equals('layer1/implml/single2.implml',
+            ['http://www.test.com/xml/2'])
+        
+        self.assert_namespace_list_equals('layer1/implml/multi1.implml',
+            ['http://www.symbianfoundation.org/xml/implml/1', 
+             'http://www.test.com/xml/1',
+             'http://www.test.com/xml/2',
+             'http://www.test.com/xml/3'])
+        
+        self.assert_namespace_list_equals('layer1/implml/multi2.implml',
+            ['http://www.symbianfoundation.org/xml/implml/1', 
+             'http://www.test.com/xml/1',
+             'http://www.test.com/xml/2',
+             'http://www.test.com/xml/3'])
+        
+        self.assert_namespace_list_equals('layer1/implml/multi3.implml',
+            ['http://www.symbianfoundation.org/xml/implml/1', 
+             'http://www.test.com/xml/1',
+             'http://www.test.com/xml/2'])
+        
+        self.assert_namespace_list_equals('layer1/implml/unsupported1.implml',
+            ['http://www.test.com/xml/1',
+             'http://www.test.com/xml/2',
+             'http://www.test.com/xml/4'])
+        
+        self.assert_namespace_list_equals('layer1/implml/unsupported2.implml',
+            ['http://www.test.com/xml/6',
+             'http://www.test.com/xml/2',
+             'http://www.test.com/xml/4'])
+    
+    def assert_read_impls_equal(self, expected, resource_ref):
+        actual = plugin.ImplFactory.get_impls_from_file(resource_ref, mock_config)
+        if len(actual) == 1 and isinstance(actual[0], plugin.ImplContainer):
+            actual = actual[0].get_all_implementations() 
+        self.assertEquals(expected, actual)
+        
+#        # Assert that the implementations have the correct impl indices set
+#        for i, impl in enumerate(actual):
+#            self.assertEquals(i, impl.index, "Impl %r does not have the expected index %r (is %r)" % (impl, i, impl.index))
+        
+    def test_get_impls_from_file(self):
+        self.assert_read_impls_equal(
+            [],
+            'layer1/implml/none.implml')
+        
+        file = 'layer1/implml/single1.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader1', file, {'x': '1'}, {'y': '2'}, {'z': '3'}])],
+            file)
+        
+        file = 'layer1/implml/single2.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader2', file])],
+            file)
+        
+        file = 'layer1/implml/single3.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader3', file, {'x': '1'}])],
+            file)
+        
+        file = 'layer1/implml/multi1.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader1', file, {'x': '1', 'y': '2'}]),
+             MockImpl(['MockReader2', file, {'x': '10', 'y': '20'}]),
+             MockImpl(['MockReader3', file, {'x': '100', 'y': '200'}, {'z': '300'}])],
+            file)
+        
+        file = 'layer1/implml/multi2.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader1', file, {'x': '1', 'y': '2'}]),
+             MockImpl(['MockReader2', file, {'x': '10', 'y': '20'}]),
+             MockImpl(['MockReader3', file, {'x': '100', 'y': '200'}, {'z': '300'}])],
+            file)
+        
+        file = 'layer1/implml/multi3.implml'
+        self.assert_read_impls_equal(
+            [MockImpl(['MockReader1', file, {'x': '1', 'y': '2'}]),
+             MockImpl(['MockReader2', file, {'x': '1', 'y': '2'}]),
+             MockImpl(['MockReader1', file, {'a': '1', 'b': '2'}]),
+             MockImpl(['MockReader2', file, {'a': '1', 'b': '2'}]),],
+            file)
+        
+        file = 'layer1/implml/ignored_ns_1.mock3ml'
+        self.assert_read_impls_equal([MockImpl(['MockReader3', file, {'x': '1'}])], file)
+        
+        file = 'layer1/implml/ignored_ns_2.mock3ml'
+        self.assert_read_impls_equal([MockImpl(['MockReader3', file, {'x': '1'}])], file)
+        
+        
+        self.assert_read_impls_equal([], 'layer1/implml/unsupported1.implml')
+        self.assert_read_impls_equal([], 'layer1/implml/unsupported2.implml')
+        
+        self.assert_read_impls_equal([], 'layer1/implml/broken.implml')
+    
+    def test_is_supported_impl_file(self):
+        def check(filename, expected):
+            self.assertEquals(expected, plugin.ImplFactory.is_supported_impl_file(filename))
+        check('test.implml', True)
+        check('layer/implml/test.implml', True)
+        check('layer/implml/test.mock1ml', True)
+        check('layer/implml/test.mock2ml', True)
+        check('layer/implml/test.mock3ml', True)
+        check('layer/implml/test.test3ml', True)
+        check('layer/implml/test.dummyml', False)
+        check('layer/implml/test.xml', False)
+        check('layer/implml/test', False)
+        check('layer/implml/test.IMPLML', True)
+        check('layer/implml/test.ImplML', True)
+        check('layer/implml/test.Mock1ML', True)
+    
+    def test_read_all_impls(self):
+        actual = list(plugin.get_impl_set(mock_config))
+        actual_impls = []
+        for impl in actual:
+            if isinstance(impl, plugin.ImplContainer):
+                actual_impls += impl.get_all_implementations()
+            else:
+                actual_impls.append(impl)
+        
+        expected = [
+            MockImpl(['MockReader1', 'layer1/implml/single1.implml', {'x': '1'}, {'y': '2'}, {'z': '3'}]),
+            MockImpl(['MockReader2', 'layer1/implml/single2.implml']),
+            MockImpl(['MockReader3', 'layer1/implml/single3.implml', {'x': '1'}]),
+            
+            MockImpl(['MockReader1', 'layer1/implml/single1.mock1ml', {'x': '1'}, {'y': '2'}, {'z': '3'}]),
+            MockImpl(['MockReader2', 'layer1/implml/single2.mock2ml']),
+            MockImpl(['MockReader3', 'layer1/implml/single3.mock3ml', {'x': '1'}]),
+            
+            MockImpl(['MockReader3', 'layer1/implml/single3.test3ml', {'x': '1'}]),
+            
+            MockImpl(['MockReader3', 'layer1/implml/ignored_ns_1.mock3ml', {'x': '1'}]),
+            MockImpl(['MockReader3', 'layer1/implml/ignored_ns_2.mock3ml', {'x': '1'}]),
+            
+            MockImpl(['MockReader1','layer1/implml/multi1.implml', {'y': '2', 'x': '1'}]),  
+            MockImpl(['MockReader2', 'layer1/implml/multi1.implml', {'y': '20', 'x': '10'}]),
+            MockImpl(['MockReader3', 'layer1/implml/multi1.implml', {'y': '200', 'x': '100'}, {'z': '300'}]),
+            
+            MockImpl(['MockReader1', 'layer1/implml/multi2.implml', {'x': '1', 'y': '2'}]),
+            MockImpl(['MockReader2', 'layer1/implml/multi2.implml', {'x': '10', 'y': '20'}]),
+            MockImpl(['MockReader3', 'layer1/implml/multi2.implml', {'x': '100', 'y': '200'}, {'z': '300'}]),
+            
+            MockImpl(['MockReader1', 'layer1/implml/multi3.implml', {'x': '1', 'y': '2'}]),
+            MockImpl(['MockReader2', 'layer1/implml/multi3.implml', {'x': '1', 'y': '2'}]),
+            MockImpl(['MockReader1', 'layer1/implml/multi3.implml', {'a': '1', 'b': '2'}]),
+            MockImpl(['MockReader2', 'layer1/implml/multi3.implml', {'a': '1', 'b': '2'}]),
+        ]
+        
+        if sorted(expected) != sorted(actual_impls):
+            print 50 * '-'
+            for impl in sorted(expected): print impl
+            print 50 * '-'
+            for impl in sorted(actual_impls): print impl
+            print 50 * '-'
+            
+        
+        self.assertEquals(sorted(expected), sorted(actual_impls))
+
+
+class TestTempFeatureDefinition(unittest.TestCase):
+    
+    def setUp(self):
+        plugin.ImplFactory.set_reader_classes_override(MOCK_READER_CLASSES)
+    
+    def tearDown(self):
+        plugin.ImplFactory.set_reader_classes_override(None)
+    
+    def assert_contains_feature(self, config, ref, type, value):
+        dview = config.get_default_view()
+        feature = dview.get_feature(ref)
+        self.assertEquals(type, feature.get_type())
+        self.assertEquals(value, feature.get_value())
+    
+    def test_create_feature(self):
+        config = api.Configuration("test.confml")
+        def add_feature(setting_ref, value):
+            config.add_feature(api.Feature(setting_ref), "ExistingFeature")
+            config.add_data(api.Data(fqr="ExistingFeature." + setting_ref, value=value))
+        add_feature('String', 'existing value')
+        add_feature('Boolean', '0')
+        add_feature('Boolean2', 'true')
+        
+        Tfd = _plugin_reader.TempVariableDefinition
+        feadefs = [Tfd('TempFeature.String',    'string',   'testing'),
+                   Tfd('TempFeature.Int',       'int',      '500'),
+                   Tfd('TempFeature.Real',      'real',     '1.5'),
+                   Tfd('TempFeature.Boolean',   'boolean',  'true'),
+                   Tfd('TempFeature.String2',   'string',   'xyz ${ExistingFeature.String} zyx'),
+                   Tfd('TempFeature.Boolean2',  'boolean',  '${ExistingFeature.Boolean}'),
+                   Tfd('TempFeature.Boolean3',  'boolean',  '${ExistingFeature.Boolean2}')]
+        for feadef in feadefs:
+            feadef.create_feature(config)
+        
+        # This needs to be done or the default view won't be up-to-date
+        config.recreate_default_view()
+        
+        self.assert_contains_feature(config, 'TempFeature.String', 'string', 'testing')
+        self.assert_contains_feature(config, 'TempFeature.Int', 'int', 500)
+        self.assert_contains_feature(config, 'TempFeature.Real', 'real', 1.5)
+        self.assert_contains_feature(config, 'TempFeature.Boolean', 'boolean', True)
+        self.assert_contains_feature(config, 'TempFeature.String2', 'string', 'xyz existing value zyx')
+        self.assert_contains_feature(config, 'TempFeature.Boolean2', 'boolean', False)
+        self.assert_contains_feature(config, 'TempFeature.Boolean3', 'boolean', True)
+    
+    def test_create_seq_feature(self):
+        Tsfd = _plugin_reader.TempVariableSequenceDefinition
+        feadef = Tsfd('TempFeature.Seq', [('String', 'string'),
+                                          ('Int', 'int'),
+                                          ('Real', 'real'),
+                                          ('Boolean', 'boolean'),
+                                          ('DefaultType', 'string')])
+        config = api.Configuration("test.confml")
+        feadef.create_feature(config)
+        self.assert_contains_feature(config, 'TempFeature.Seq', 'sequence', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.String', 'string', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Int', 'int', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Real', 'real', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Boolean', 'boolean', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.DefaultType', 'string', [])
+        
+        fea = config.get_default_view().get_feature('TempFeature.Seq')
+        fea.set_value([['test', '1', '2.0', 'true', 'foo']])
+        self.assertEquals(fea.get_value(), [['test', '1', '2.0', 'true', 'foo']])
+    
+    def _create_mock_impl(self, temp_var_defs):
+        impl = Mock()
+        impl.ref = "test.implml"
+        impl.get_temp_variable_definitions = lambda: temp_var_defs
+        return impl
+    
+    def test_create_from_impl_container(self):
+        impls = plugin.ImplSet()
+        Tfd = _plugin_reader.TempVariableDefinition
+        Tsfd = _plugin_reader.TempVariableSequenceDefinition
+        
+        feadefs = [Tfd('TempFeature.String',    'string',   'testing'),
+                   Tfd('TempFeature.Int',       'int',      '500')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        feadefs = [Tfd('TempFeature.Real',      'real',     '1.5'),
+                   Tfd('TempFeature.Boolean',   'boolean',  'true')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        feadefs = [Tsfd('TempFeature.Seq', [('String',  'string'),
+                                            ('Int',     'int'),
+                                            ('Real',    'real'),
+                                            ('Boolean', 'boolean')])]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        config = api.Configuration("test.confml")
+        impls.create_temp_features(config)
+        
+        self.assert_contains_feature(config, 'TempFeature.String', 'string', 'testing')
+        self.assert_contains_feature(config, 'TempFeature.Int', 'int', 500)
+        self.assert_contains_feature(config, 'TempFeature.Real', 'real', 1.5)
+        self.assert_contains_feature(config, 'TempFeature.Boolean', 'boolean', True)
+        self.assert_contains_feature(config, 'TempFeature.Seq', 'sequence', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.String', 'string', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Int', 'int', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Real', 'real', [])
+        self.assert_contains_feature(config, 'TempFeature.Seq.Boolean', 'boolean', [])
+        
+    
+    def test_create_from_impl_container_with_duplicates(self):
+        impls = plugin.ImplSet()
+        
+        Tfd = _plugin_reader.TempVariableDefinition
+        feadefs = [Tfd('TempFeature.String',    'string',   'testing'),
+                   Tfd('TempFeature.Int',       'int',      '500')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        feadefs = [Tfd('TempFeature.Real',      'real',     '1.5'),
+                   Tfd('TempFeature.Boolean',   'boolean',  'true'),
+                   Tfd('TempFeature.Int',       'int',      '500')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        config = api.Configuration("test.confml")
+        self.assertRaises(exceptions.AlreadyExists, impls.create_temp_features, config)
+    
+    def test_create_from_impl_container_with_existing(self):
+        impls = plugin.ImplSet()
+        
+        Tfd = _plugin_reader.TempVariableDefinition
+        feadefs = [Tfd('TempFeature.String',    'string',   'testing'),
+                   Tfd('TempFeature.Int',       'int',      '500')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        feadefs = [Tfd('TempFeature.Real',      'real',     '1.5'),
+                   Tfd('TempFeature.Boolean',   'boolean',  'true')]
+        impls.add_implementation(self._create_mock_impl(feadefs))
+        
+        config = api.Configuration("test.confml")
+        config.add_feature(api.Feature("Int"), "TempFeature")
+        self.assertRaises(exceptions.AlreadyExists, impls.create_temp_features, config)
+
+class TestCommonImplmlDataReader(unittest.TestCase):
+    
+    def _read_data(self, xml_data):
+        etree = utils.etree.fromstring(xml_data)
+        return _plugin_reader.CommonImplmlDataReader.read_data(etree)
+    
+    def test_simple_all_tags(self):
+        XML = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+            <phase name="pre"/>
+            <tag name="target" value="rofs3"/>
+            <tempVariable ref="Temp.Feature" type="string" value="test"/>
+            <tempVariableSequence ref="Temp.SeqFeature">
+                <tempVariable ref="Sub" type="int"/>
+            </tempVariableSequence>
+            <settingRefsOverride>
+                <settingRef value="Foo.Bar"/>
+            </settingRefsOverride>
+            <outputRootDir value="output_root"/>
+            <outputSubDir value="output_sub"/>
+        </test>"""
+        actual = self._read_data(XML)
+        
+        expected = _plugin_reader.CommonImplmlData()
+        expected.phase = 'pre'
+        expected.tags = {'target': ['rofs3']}
+        expected.tempvar_defs = [Tfd('Temp.Feature', 'string', 'test'),
+                                      Tsfd('Temp.SeqFeature', [('Sub', 'int')])]
+        expected.setting_refs_override = Sro(['Foo.Bar'])
+        expected.output_root_dir = 'output_root'
+        expected.output_sub_dir = 'output_sub'
+        
+        self.assertEquals(actual, expected)
+    
+    def test_invalid_phases(self):
+        XML = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+            <phase/>
+        </test>"""
+        self.assertRaises(exceptions.ParseError, self._read_data, XML)
+        
+        XML = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+            <phase name="foo"/>
+        </test>"""
+        self.assertRaises(exceptions.ParseError, self._read_data, XML)
+    
+    def test_valid_phases(self):
+        def run_test(phase ):
+            xml_data = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <phase name="%s"/>
+            </test>""" % phase
+            actual = self._read_data(xml_data)
+            expected = _plugin_reader.CommonImplmlData()
+            expected.phase = phase
+            self.assertEquals(actual, expected)
+        
+        run_test('pre')
+        run_test('normal')
+        run_test('post')
+    
+    def test_invalid_temp_features(self):
+        def run_test(element_xml_data):
+            xml_data = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                %s
+            </test>""" % element_xml_data
+            self.assertRaises(exceptions.ParseError, self._read_data, xml_data)
+        
+        run_test('<tempVariable/>')
+        run_test('<tempVariable ref="Foo.Bar" type="foo"/>')
+        run_test('<tempVariable ref="Foo.Bar" type="foo" value="x"/>')
+        
+        run_test('<tempVariableSequence/>')
+        run_test('<tempVariableSequence ref="Foo.Seq"/>')
+        run_test('<tempVariableSequence ref="Foo.Seq"><tempVariable/></tempVariableSequence>')
+        run_test('<tempVariableSequence ref="Foo.Seq"><tempVariable ref="SubFoo" type="foo"/></tempVariableSequence>')
+    
+    def test_valid_temp_feature_types(self):
+        def run_test(type):
+            # Test for simple features
+            xml_data = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <tempVariable ref="Foo.Bar" type="%s"/>
+            </test>""" % type
+            actual = self._read_data(xml_data)
+            expected = _plugin_reader.CommonImplmlData()
+            expected.tempvar_defs = [Tfd('Foo.Bar', type, '')]
+            self.assertEquals(actual, expected)
+            
+            # Test for sequence features
+            xml_data = """<test xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                    <tempVariableSequence ref="Foo.Bar">
+                        <tempVariable ref="Sub" type="%s"/>
+                    </tempVariableSequence>
+                </test>""" % type
+            actual = self._read_data(xml_data)
+            expected = _plugin_reader.CommonImplmlData()
+            expected.tempvar_defs = [Tsfd('Foo.Bar', [('Sub', type)])]
+            self.assertEquals(actual, expected)
+        
+        run_test('string')
+        run_test('int')
+        run_test('real')
+        run_test('boolean')
+    
+    def test_setting_refs_override(self):
+        def check(xml, expected_refs):
+            xml = '<test xmlns="http://www.symbianfoundation.org/xml/implml/1">%s</test>' % xml
+            actual = self._read_data(xml)
+            expected = _plugin_reader.CommonImplmlData()
+            expected.setting_refs_override = Sro(expected_refs)
+            self.assertEquals(actual, expected)
+        
+        check('<settingRefsOverride/>', [])
+        check('<settingRefsOverride refsIrrelevant="false"/>', [])
+        check('<settingRefsOverride refsIrrelevant="true"/>', None)
+        check("""
+                <settingRefsOverride>
+                    <settingRef value="Foo.Bar"/>
+                </settingRefsOverride>
+            """,
+            ['Foo.Bar'])
+        check("""
+                <settingRefsOverride>
+                    <settingRef value="Foo.Bar"/>
+                    <settingRef value="Foo.Baz"/>
+                    <settingRef value="Test.Setting"/>
+                </settingRefsOverride>
+            """,
+            ['Foo.Bar', 'Foo.Baz', 'Test.Setting'])
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_plugin_implcontainer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,298 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import os
+import logging
+import __init__
+from cone.public import *
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+
+
+class TestPluginImplContainer(unittest.TestCase):
+    class ImplTest(plugin.ImplBase):
+        def __init__(self,ref,configuration):
+            plugin.ImplBase.__init__(self,ref,configuration)
+            self.generate_invoked = False
+            self.refs = ["dummy1.too"]
+            self.output_files = []
+        def generate(self, context=None):
+            self.generate_invoked = True
+            if context and hasattr(context, 'objects'):
+                context.objects.append(self)
+
+        def get_refs(self):
+            return self.refs
+
+        def list_output_files(self):
+            return self.output_files
+
+    def test_impl_container_add(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        imp2a = plugin.ImplBase("implml/copy:21.content",None)
+        imp2b = plugin.ImplBase("implml/copy:24.content",None)
+        container.append(imp1)
+        container.append(imp2a)
+        container.append(imp2b)
+        self.assertEquals(container.impls, [imp1,imp2a, imp2b])
+
+    def test_impl_container_sub_container(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = plugin.ImplBase("implml/test.content",None)
+        container.append(imp1)
+        subcontainer = plugin.ImplContainer("implml/sub.implml", None)
+        imp2a = plugin.ImplBase("implml/sub.implml:21.content",None)
+        imp2b = plugin.ImplBase("implml/sub.implml:24.content",None)
+        subcontainer.append(imp2a)
+        subcontainer.append(imp2b)
+        container.append(subcontainer)
+        self.assertEquals(container.get_all_implementations(),[imp1,imp2a,imp2b])
+        for sub in container:
+            print sub
+        self.assertEquals(container.impls, [imp1,subcontainer])
+        container[0] = subcontainer
+        self.assertEquals(container.impls, [subcontainer,subcontainer])
+        del container[0]
+        self.assertEquals(container.impls, [subcontainer])
+
+    def test_impl_container_with_condition(self):
+        context = plugin.GenerationContext()
+        context.configuration = api.Configuration()
+        context.configuration.add_feature(api.Feature("test"))
+        context.configuration.add_feature(api.Feature("stringsub"),"test")
+        context.configuration.add_feature(api.Feature("intsub"),"test")
+        context.configuration.get_default_view().test.value = True
+        context.configuration.get_default_view().test.stringsub.value = "stringval"
+        context.configuration.get_default_view().test.intsub.value = 2
+
+        condition = rules.SimpleCondition("${test}", "true")
+        container = plugin.ImplContainer("norm", None)
+        container.condition = condition
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        container.append(imp1)
+        container.generate(context)
+        self.assertTrue(imp1.generate_invoked)
+        imp1.generate_invoked = False
+        context.configuration.get_default_view().test.value = False
+        container.generate(context)
+        self.assertFalse(imp1.generate_invoked)
+
+        imp1.generate_invoked = False
+        condition = rules.SimpleCondition("${test}", "false")
+        container.condition = condition
+        container.append(imp1)
+        container.generate(context)
+        self.assertTrue(imp1.generate_invoked)
+        imp1.generate_invoked = False
+        context.configuration.get_default_view().test.value = True
+        container.generate(context)
+        self.assertFalse(imp1.generate_invoked)
+
+        
+    def test_impl_container_generate(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        container.append(imp1)
+        container.append(imp2a)
+        container.append(imp2b)
+        container.generate()
+        self.assertTrue(imp1.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+
+    def test_impl_container_get_tags(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer = plugin.ImplContainer("sub", None)
+        container.append(imp1)
+        container.append(imp2a)
+        container.append(imp2b)
+        container.append(subcontainer)
+        self.assertEquals(container.get_tags(), {})
+        container.set_tags({'test':['foobar']})
+        self.assertEquals(container.get_tags(), {'test':['foobar']})
+        imp1.set_tags({'foo':['bar']})
+        self.assertEquals(container.get_tags(), {'test':['foobar'],
+                                                 'foo':['bar']})
+        imp2a.set_tags({'test':['bar'], 'one' :['more']})
+        
+        self.assertEquals(container.get_tags(), {'test':['foobar', 'bar'],
+                                                 'foo':['bar'],
+                                                 'one' :['more']})
+        subcontainer.set_tags({'test':['bar1']})
+        self.assertEquals(container.get_tags(), {'test':['foobar', 'bar', 'bar1'],
+                                                 'foo':['bar'],
+                                                 'one' :['more']})
+
+    def test_impl_container_get_phase(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer1 = plugin.ImplContainer("norm", None)
+        container.append(subcontainer1)
+        subcontainer1.append(imp1)
+        subcontainer1.append(imp2a)
+        subcontainer1.append(imp2b)
+        subcontainer1.set_invocation_phase("normal")
+        self.assertEquals(container.invocation_phase(), ["normal"])
+        imp1.set_invocation_phase('pre')
+        self.assertEquals(container.invocation_phase(), ["normal"])
+        subcontainer2 = plugin.ImplContainer("norm", None)
+        subimp = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subimp.set_invocation_phase('post')
+        subcontainer2.append(subimp)
+        subcontainer2.set_invocation_phase('post')
+        container.append(subcontainer2)
+        self.assertEquals(container.invocation_phase(), ['post','normal'])
+        
+    def test_impl_container_get_refs(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        container.append(imp1)
+        container.append(imp2a)
+        container.append(imp2b)
+        self.assertEquals(container.get_refs(), ["dummy1.too"])
+        imp2b.refs = ['dummy2.foo']
+        self.assertEquals(container.get_refs(), ["dummy1.too",
+                                                 "dummy2.foo",])
+        
+    def test_impl_container_list_output_files(self):
+        container = plugin.ImplContainer("norm", None)
+        subcontainer = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        container.append(subcontainer)
+        subcontainer.append(imp1)
+        subcontainer.append(imp2a)
+        subcontainer.append(imp2b)
+        self.assertEquals(container.list_output_files(), [])
+        imp2b.output_files= ['output/dummy2.txt']
+        self.assertEquals(container.list_output_files(), ['output/dummy2.txt'])
+        imp1.output_files= ['output/foobar/hee.txt']
+        self.assertEquals(container.list_output_files(), ['output/foobar/hee.txt',
+                                                          'output/dummy2.txt'])
+
+    def test_impl_container_set_output_root(self):
+        container = plugin.ImplContainer("norm", None)
+        subcontainer = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        container.append(subcontainer)
+        subcontainer.append(imp1)
+        subcontainer.append(imp2a)
+        subcontainer.append(imp2b)
+        self.assertEquals(imp1.get_output_root(), 'output')
+        container.set_output_root('foobar/test')
+        self.assertEquals(imp1.get_output_root(), 'foobar/test')
+
+    def test_impl_container_sub_container_generate(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        container.append(imp1)
+        subcontainer = plugin.ImplContainer("implml/sub.implml", None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer.append(imp2a)
+        subcontainer.append(imp2b)
+        container.append(subcontainer)
+        self.assertEquals(container.impls, [imp1,subcontainer])
+        container.append(subcontainer)
+        container.generate()
+        self.assertTrue(imp1.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+
+    def test_impl_container_sub_container_generate_with_generation_contexts(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        container.append(imp1)
+        subcontainer = plugin.ImplContainer("implml/sub.implml", None)
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer.append(imp2a)
+        subcontainer.append(imp2b)
+        container.append(subcontainer)
+        self.assertEquals(container.impls, [imp1,subcontainer])
+        context = plugin.GenerationContext()
+        context.objects = []
+        container.generate(context)
+        self.assertTrue(imp1.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertEquals(len(context.objects), 3)
+        self.assertEquals(context.objects, [imp1,imp2a,imp2b])
+
+    def test_impl_container_generate_with_generation_contexts_tags(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        subcontainer1 = plugin.ImplContainer("implml/sub1.implml", None)
+        subcontainer1.append(imp1)
+        
+        subcontainer2 = plugin.ImplContainer("implml/sub2.implml", None)
+        subcontainer2.set_tags({'target': ['rofs3','uda']})
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer2.append(imp2a)
+        subcontainer2.append(imp2b)
+        container.append(subcontainer1)
+        container.append(subcontainer2)
+        
+        context = plugin.GenerationContext()
+        context.tags = {'target': ['rofs3'], 'foobar' :['test']}
+        context.objects = []
+        container.generate(context)
+        self.assertFalse(imp1.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertEquals(len(context.objects), 2)
+        self.assertEquals(context.objects, [imp2a,imp2b])
+
+    def test_impl_container_generate_with_generation_phase(self):
+        container = plugin.ImplContainer("norm", None)
+        imp1  = TestPluginImplContainer.ImplTest("implml/test.content",None)
+        subcontainer1 = plugin.ImplContainer("implml/sub1.implml", None)
+        subcontainer1.append(imp1)
+        
+        subcontainer2 = plugin.ImplContainer("implml/sub2.implml", None)
+        subcontainer2.set_invocation_phase("post")
+        imp2a = TestPluginImplContainer.ImplTest("implml/copy:21.content",None)
+        imp2b = TestPluginImplContainer.ImplTest("implml/copy:24.content",None)
+        subcontainer2.append(imp2a)
+        subcontainer2.append(imp2b)
+        container.append(subcontainer1)
+        container.append(subcontainer2)
+        
+        context = plugin.GenerationContext()
+        context.phase = "post"
+        context.objects = []
+        container.generate(context)
+        self.assertFalse(imp1.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertTrue(imp2a.generate_invoked)
+        self.assertEquals(len(context.objects), 2)
+        self.assertEquals(context.objects, [imp2a,imp2b])
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_plugin_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,214 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import os
+import logging
+import __init__
+from cone.public import *
+from cone.public import _plugin_reader
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class ImplTest(plugin.ImplBase):
+    def __init__(self,ref,configuration):
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.generate_invoked = False
+        self.refs = ["dummy1.too"]
+        self.output_files = []
+    def generate(self, context=None):
+        self.generate_invoked = True
+        if context and hasattr(context, 'objects'):
+            context.objects.append(self)
+
+    def get_refs(self):
+        return self.refs
+
+    def list_output_files(self):
+        return self.output_files
+
+
+class TestPluginReader(unittest.TestCase):
+    def setUp(self):
+        pass
+
+class TestCommonNamespaceHandling(unittest.TestCase):
+    
+    def setUp(self):
+        pass
+        
+        
+    def tearDown(self):
+        pass
+    
+    def test_implcontainer_reader_get_condition(self):
+        root = utils.etree.fromstring("<container/>")
+        self.assertEquals(plugin.ImplContainerReader.get_condition(root), None)
+        
+        root = utils.etree.fromstring("<container condition='test'/>")
+        condition = plugin.ImplContainerReader.get_condition(root)
+        self.assertTrue(isinstance(condition, rules.SimpleCondition))
+        self.assertEquals(condition.left.expression, "test")
+        self.assertEquals(condition.right.expression, "true")
+        
+        root = utils.etree.fromstring("<container condition='${feature.one}' value='2'/>")
+        condition = plugin.ImplContainerReader.get_condition(root)
+        self.assertTrue(isinstance(condition, rules.SimpleCondition))
+        self.assertEquals(condition.left.expression, "${feature.one}")
+        self.assertEquals(condition.right.expression, "2")
+
+
+    def test_implcontainer_reader_get_reader_classes(self):
+        classes = plugin.ImplContainerReader.get_reader_classes()
+        self.assertTrue(classes.has_key('http://www.symbianfoundation.org/xml/implml/1'))
+        
+    def test_get_test_container(self):
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertTrue(isinstance(container, plugin.ImplContainer))
+
+    def test_get_test_container_with_sub_containers(self):
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+              <container />
+              <container />
+              <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <container />
+              </container>
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertTrue(isinstance(container, plugin.ImplContainer))
+        self.assertEquals(len(container), 3)
+    
+    def test_containers_with_phases(self):
+        xml_data = """<?xml version="1.0"?>
+            <implml:container xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+              <implml:container />
+              <implml:container />
+              <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <phase name="post"/>
+              </container>
+            </implml:container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertEquals(container.invocation_phase(), ['post','normal'])
+        self.assertEquals(container[2].invocation_phase(), ['post'])
+    
+    def test_containers_with_tags(self):
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+              <tag name="target" value="rofs2"/>
+              <tag name="foobar" value="test"/>
+              <container />
+              <container />
+              <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <tag name="target" value="rofs3"/>
+                <phase name="post"/>
+              </container>
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertEquals(container[2].get_tags(), {'target': ['rofs3']})
+        self.assertEquals(container.get_tags(), {'target': ['rofs2','rofs3'],
+                                                 'foobar': ['test']})
+
+    def test_tempfeature_definitions(self):
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+                <tempVariable ref="TempFeature.root" value="true"/>
+                <container>
+                    <tempVariable ref="TempFeature.String"   type="string"   value="testing"/>
+                    <tempVariable ref="TempFeature.Int"      type="int"      value="500"/>
+                    <tempVariable ref="TempFeature.Real"     type="real"     value="1.5"/>
+                    <tempVariable ref="TempFeature.Boolean"  type="boolean"  value="true"/>
+                    <tempVariable ref="TempFeature.Defaults"/>
+                    
+                    <tempVariableSequence ref="TempFeature.Seq">
+                        <tempVariable ref="String"   type="string"/>
+                        <tempVariable ref="Int"      type="int"/>
+                        <tempVariable ref="Real"     type="real"/>
+                        <tempVariable ref="Boolean"  type="boolean"/>
+                        <tempVariable ref="DefaultType"/>
+                    </tempVariableSequence>
+                </container>
+            </container>
+            """
+        
+        Tfd = _plugin_reader.TempVariableDefinition
+        Tsfd = _plugin_reader.TempVariableSequenceDefinition
+        expected_1 = [
+            Tfd('TempFeature.String', 'string', 'testing'),
+            Tfd('TempFeature.Int', 'int', '500'),
+            Tfd('TempFeature.Real', 'real', '1.5'),
+            Tfd('TempFeature.Boolean', 'boolean', 'true'),
+            Tfd('TempFeature.Defaults', 'string', ''),
+            Tsfd('TempFeature.Seq', [('String', 'string'),
+                                     ('Int', 'int',),
+                                     ('Real', 'real'),
+                                     ('Boolean', 'boolean'),
+                                     ('DefaultType', 'string')]),
+        ]
+        expected_2 = [Tfd('TempFeature.root', 'string', value='true')] + expected_1
+        
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertEquals(container[0].get_temp_variable_definitions(), expected_1)
+        self.assertEquals(container.get_temp_variable_definitions(), expected_2)
+
+    def test_get_test_container_with_condition(self):
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+                       condition="${feature.test}">
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertTrue(isinstance(container.condition, rules.SimpleCondition))
+        self.assertEquals(container.condition.left.expression, "${feature.test}")
+        self.assertEquals(container.condition.right.expression, "true")
+
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+                       condition="${feature.test}"
+                       value="false">
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        self.assertTrue(isinstance(container.condition, rules.SimpleCondition))
+        self.assertEquals(container.condition.left.expression, "${feature.test}")
+        self.assertEquals(container.condition.right.expression, "false")
+
+    def test_impl_container_with_condition(self):
+        context = plugin.GenerationContext()
+        context.configuration = api.Configuration()
+        context.configuration.add_feature(api.Feature("test"))
+        context.configuration.get_default_view().test.value = True
+
+        xml_data = """<?xml version="1.0"?>
+            <container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+                       condition="${test}"
+                       value="false">
+            </container>
+            """
+        container = plugin.ImplContainerReader.read_implementation(xml_data)
+        imp1  = ImplTest("implml/test.content",None)
+        container.append(imp1)
+        container.generate(context)
+        self.assertFalse(imp1.generate_invoked)
+        context.configuration.get_default_view().test.value = False
+        container.generate(context)
+        self.assertTrue(imp1.generate_invoked)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_project.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,293 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the CPF configuration
+"""
+import unittest
+import string
+import sys,os,shutil
+
+import __init__
+
+from cone.public import *
+#from cone.public import stringstorage
+from cone.storage import persistentdictionary
+
+class TestProjectOpen(unittest.TestCase):    
+    
+    def test_open_project(self):
+        
+        p = api.Project(api.Storage(""))
+        self.assertTrue(p)
+
+    def test_open_project_of_non_storage(self):
+        fs = ""
+        try:
+            p = api.Project(fs)
+            self.fail("Opening on top of non storage succeeds!!")
+        except exceptions.StorageException:
+            self.assertTrue(True)
+
+class TestProjectConfigurations(unittest.TestCase):    
+    def setUp(self):
+        self.prj = api.Project(api.Storage(""))
+    
+    def test_create_configuration(self):
+        self.prj.create_configuration("test.confml")
+        self.assertTrue(self.prj.test_confml)
+        self.assertEquals(self.prj.test_confml.get_path(),"test.confml")
+        
+    def test_create_and_getconfiguration(self):
+        self.prj.create_configuration("test.confml")
+        self.assertEquals(self.prj.get_configuration("test.confml").get_path(), "test.confml")
+
+    def test_create_multi_and_list(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        self.assertEquals(self.prj.list_configurations(), ["test1.confml",
+                                                           "test2.confml",
+                                                           "test3.confml"])
+    
+    def test_create_multi_and_list_with_filters(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        self.prj.create_configuration("test4.confml")
+        self.prj.create_configuration("foo1.confml")
+        self.prj.create_configuration("foo2.confml")
+        self.assertEquals(self.prj.list_configurations(r'test[24]\.confml'),
+                          ["test2.confml",
+                           "test4.confml"])
+        self.assertEquals(self.prj.list_configurations([r'test[24]\.confml', r'foo\d\.confml']),
+                          ["test2.confml",
+                           "test4.confml",
+                           "foo1.confml",
+                           "foo2.confml"])
+
+    def test_create_multi_and_remove_one(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        self.prj.remove_configuration("test2.confml")
+        self.assertEquals(self.prj.list_configurations(), ["test1.confml",
+                                                           "test3.confml"])
+
+    def test_create_multi_and_remove_all(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        for c in self.prj.list_configurations():
+            self.prj.remove_configuration(c)
+        self.assertEquals(self.prj.list_configurations(), [])
+
+    def test_create_multi_and_add_subconfigurations(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        self.prj.test2_confml.create_configuration("foo/root.confml")
+        conf = self.prj.test2_confml.create_configuration("fii/root.confml")
+        #self.assertEquals(conf.get_full_path(),'')
+        self.assertTrue(self.prj.is_configuration("test3.confml"))
+        # TODO: this is not working at the moment due to performance problem in
+        # Project.list_all_configurations()
+        # self.assertTrue(self.prj.is_configuration("fii/root.confml"))
+        
+        self.assertEquals(self.prj.list_configurations(), ["test1.confml",
+                                                           "test2.confml",
+                                                           "test3.confml"])
+        
+        self.assertEquals(self.prj.test2_confml.list_configurations(), ["foo/root.confml",
+                                                                 "fii/root.confml",])
+
+    def test_create_multi_and_add_subconfigurations_and_features(self):
+        self.prj.create_configuration("test1.confml")
+        self.prj.create_configuration("test2.confml")
+        self.prj.create_configuration("test3.confml")
+        self.prj.test2_confml.create_configuration("foo/root.confml")
+        self.prj.test2_confml.create_configuration("fii/root.confml")
+        self.prj.test2_confml.foo__root_confml.add_feature(api.Feature("testfea1"))
+        self.prj.test2_confml.foo__root_confml.add_feature(api.Feature("testfea2"))
+        self.prj.test2_confml.foo__root_confml.add_feature(api.Feature("testfea11"),"testfea1")
+        self.prj.test2_confml.fii__root_confml.add_feature(api.Feature("testfea3"))
+        self.prj.test2_confml.fii__root_confml.add_feature(api.Feature("testfea4"))
+        self.prj.test2_confml.fii__root_confml.add_feature(api.Feature("testfea31"),"testfea3")
+        self.assertEquals(self.prj.test2_confml.list_all_features(), ['testfea1',
+                                                           'testfea1.testfea11',  
+                                                           'testfea2', 
+                                                           'testfea3', 
+                                                           'testfea3.testfea31', 
+                                                           'testfea4'])
+
+
+class TestProjectConfigurationsStorage(unittest.TestCase):    
+    def test_create_configuration_and_store_storage(self):
+        prj = api.Project(api.Storage.open("temp/testproject.pk", "w"))
+        prj.create_configuration("test.confml")
+        prj.close()
+        self.assertTrue(os.path.exists("temp/testproject.pk"))
+        shutil.rmtree("temp")
+
+    def test_create_configuration_and_store_storage_and_open(self):
+        prj = api.Project(api.Storage.open("temp/testproject1.pk","w"))
+        config = prj.create_configuration("test.confml")
+        config.desc = "Descriptions"
+        prj.save()
+        prj.close()
+        
+        prj2 = api.Project(api.Storage.open("temp/testproject1.pk"))
+        self.assertEquals(prj2.list_configurations(), ['test.confml'])
+        self.assertEquals(prj2.test_confml.desc, "Descriptions")
+        shutil.rmtree("temp")
+
+    def test_create_configuration_hierarchy_and_store_storage_and_open(self):
+        prj = api.Project(api.Storage.open("temp/testproject2.pk","w"))
+        config = prj.create_configuration("test.confml")
+        config.desc = "Descriptions"
+        prj.test_confml.create_configuration("s60/root.confml")
+        prj.test_confml.s60__root_confml.add_feature(api.Feature("feature1"))
+        prj.test_confml.create_configuration("ncp/root.confml")
+        prj.save()
+        prj.close()
+        
+        prj2 = api.Project(api.Storage.open("temp/testproject2.pk"))
+        self.assertEquals(prj2.list_configurations(), ['test.confml'])
+        self.assertEquals(prj2.test_confml.desc, "Descriptions")
+        self.assertEquals(prj2.test_confml.list_all_features(),['feature1'])
+        prj2.close()
+        shutil.rmtree("temp")
+
+    def test_dump_configuration_with_include(self):
+        prj = api.Project(api.Storage.open("temp/testprojectinc.pk","w"))
+        config = prj.create_configuration("test.confml")
+        config.include_configuration("foo/foo.confml")
+        dumped = persistentdictionary.DictWriter().dumps(config)
+        children = dumped['Configuration']['children']
+        self.assertEquals(children,[{'ConfigurationProxy': {'dict': {'path': 'foo/foo.confml'}}}])
+        prj.close()
+        shutil.rmtree("temp")
+
+    def test_create_configuration_project_with_includes_and_reopen_storage(self):
+        prj = api.Project(api.Storage.open("temp/testprojectinc2.pk","w"))
+        config = prj.create_configuration("test.confml")
+        config.desc = "Descriptions"
+        config2 = config.create_configuration("foo/foo.confml")
+        config2.add_feature(api.Feature("feature1"))
+        config2.save()        
+        config2.close()        
+        prj.test_confml.include_configuration("foo/foo.confml")
+        prj.save()
+        prj.close()
+        
+        prj2 = api.Project(api.Storage.open("temp/testprojectinc2.pk"))
+        self.assertEquals(prj2.list_configurations(), ['test.confml'])
+        self.assertEquals(prj2.test_confml.list_configurations(), ['foo/foo.confml'])
+        foo = prj2.test_confml.get_configuration('foo/foo.confml')
+        self.assertEquals(prj2.get_configuration('test.confml').list_all_features(), ['feature1'])
+        self.assertEquals(prj2.test_confml.get_default_view().list_features(), ['feature1'])
+        prj2.close()
+        shutil.rmtree("temp")
+
+    def test_create_configuration_project_with_multiincludes_and_reopen_storage(self):
+        prj = api.Project(api.Storage.open("temp/testprojectinc3.pk","w"))
+        config = prj.create_configuration("test.confml")
+        prj.add_configuration(api.Configuration("s60/root.confml", namespace="com.nokia.s60"))
+        prj.create_configuration("foo/foo.confml")
+        prj.test_confml.include_configuration("foo/foo.confml")
+        prj.test_confml.include_configuration("s60/root.confml")
+        foofea = api.Feature("foofea")
+        foofea.add_feature(api.Feature("foofea_setting1"))
+        foofea.add_feature(api.Feature("foofea_setting2"))
+        prj.test_confml.foo__foo_confml.add_feature(foofea)
+        
+        s60fea = api.Feature("s60fea")
+        s60fea.add_feature(api.Feature("wlanset1"))
+        s60fea.add_feature(api.Feature("wlan_set2"))
+        prj.test_confml.s60__root_confml.add_feature(s60fea)
+        dview = prj.test_confml.get_default_view()
+        prj.save()
+        
+        prj2 = api.Project(api.Storage.open("temp/testprojectinc3.pk"))
+        self.assertEquals(prj2.list_configurations(), ['test.confml'])
+
+        dview2 = prj2.test_confml.get_default_view()
+        self.assertEquals(dview.list_all_features(),
+                          dview2.list_all_features())
+        testconf = prj2.get_configuration('test.confml')
+        my_view = testconf.get_default_view()
+        my_view.com.nokia.s60.s60fea.wlanset1.data = 1
+        prj2.close()
+        shutil.rmtree("temp")
+
+    def test_create_configuration_project_with_multiincludes_and_test_layer_actions(self):
+        prj = api.Project(api.Storage.open("temp/testprojectlayers.pk","w"))
+        config = prj.create_configuration("test.confml")
+        prj.add_configuration(api.Configuration("s60/root.confml", namespace="com.nokia.s60"))
+        prj.create_configuration("foo/foo.confml")
+        prj.create_configuration("foo/confml/component.confml").close()
+        prj.test_confml.include_configuration("foo/foo.confml")
+        prj.test_confml.include_configuration("s60/root.confml")
+        prj.test_confml.foo__foo_confml.create_configuration("data.confml")
+        foofea = api.Feature("foofea")
+        foofea.add_feature(api.Feature("foofea_setting1"))
+        foofea.add_feature(api.Feature("foofea_setting2"))
+        prj.test_confml.foo__foo_confml.add_feature(foofea)
+        prj.save()
+        foo_config = prj.test_confml.get_configuration("foo/foo.confml")
+        layer = foo_config.get_layer()
+        res = layer.open_resource("confml/component1.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.content_folder().open_resource("foobar.txt","w")
+        res.write("foo bar")
+        res.close()
+        self.assertEquals(layer.list_confml(), ['confml/component.confml', 'confml/component1.confml'])
+        self.assertEquals(layer.list_content(), ['content/foobar.txt'])
+        self.assertEquals(layer.list_all_resources(), ['confml/component.confml', 'confml/component1.confml', 'content/foobar.txt'])
+        self.assertEquals(foo_config.list_resources(), ['foo/foo.confml','foo/data.confml', 'foo/confml/component.confml', 'foo/confml/component1.confml', 'foo/content/foobar.txt'])
+        self.assertEquals(prj.test_confml.list_resources(), ['test.confml',
+                                                      'foo/foo.confml',
+                                                      'foo/data.confml',
+                                                      's60/root.confml',
+                                                      'foo/confml/component.confml', 
+                                                      'foo/confml/component1.confml', 
+                                                      'foo/content/foobar.txt'])
+        
+        
+        s60_config = prj.test_confml.get_configuration("s60/root.confml")
+        layer = s60_config.get_layer()
+        res = layer.open_resource("confml/component1.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.content_folder().open_resource("s60.txt","w")
+        res.write("foo bar")
+        res.close()
+        res = layer.content_folder().open_resource("foobar.txt","w")
+        res.write("foo bar")
+        res.close()
+        self.assertEquals(layer.list_confml(), ['confml/component1.confml'])
+        self.assertEquals(layer.list_content(), ['content/foobar.txt', 'content/s60.txt'])
+        self.assertEquals(prj.test_confml.layered_content().list_keys(), ['foobar.txt', 's60.txt'])
+        self.assertEquals(prj.test_confml.layered_content().get_values('foobar.txt'), ['foo/content/foobar.txt', 's60/content/foobar.txt'])
+        prj.close()
+        shutil.rmtree("temp")
+
+
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_public_api.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os
+import __init__
+from cone.public import *
+
+class TestPublicApiConfiguration(unittest.TestCase):
+    def setUp(self):
+        pass
+    
+    def test_api_configuration_creation(self):
+        config = api.Configuration("test")
+        self.assertTrue(config!=None)
+
+
+class TestPluginFactory(unittest.TestCase):
+    class FactoryTestImplReader(plugin.ReaderBase):
+        FILE_EXTENSIONS = ['factorytest']
+    
+    class ConeDummyReader(persistence.ConeReader):
+        @classmethod
+        def supported_elem(cls, elemname):
+            if elemname.lower() == "dummy":
+                return True
+            else:
+                return False
+        def __init__(self):
+            super(persistence.ConeReader,self).__init__()
+            
+    class ConeDummyWriter(persistence.ConeWriter):
+        @classmethod
+        def supported_class(cls, classname):
+            if classname.lower() == "dummy":
+                return True
+            else:
+                return False
+
+        def __init__(self):
+            super(persistence.ConeWriter,self).__init__()
+    
+
+
+    def test_factory_is_supported_impl_file(self):
+        plugin.ImplFactory.set_reader_classes_override([self.FactoryTestImplReader])
+        try:
+            self.assertTrue(api.Factory().is_supported_impl_file("some_file.factorytest"))
+            self.assertTrue(api.Factory().is_supported_impl_file("SOME_FILE.FACTORYTEST"))
+            self.assertFalse(api.Factory().is_supported_impl_file("some_file.foo"))
+        finally:
+            plugin.ImplFactory.set_reader_classes_override(None)
+    
+    def test_get_reader_fails(self):
+        try:
+            api.Factory().get_reader_for_elem("")
+            self.fail("Not existing reader creation succeeds?")
+        except exceptions.ConePersistenceError,e:
+            self.assertTrue(True)
+
+    def test_get_writer_fails(self):
+        try:
+            api.Factory().get_writer_for_class("")
+            self.fail("Not existing writer creation succeeds?")
+        except exceptions.ConePersistenceError,e:
+            self.assertTrue(True)
+
+    def test_get_reader_ok(self):
+        r = api.Factory().get_reader_for_elem("Dummy")
+        self.assertTrue(isinstance(r,TestPluginFactory.ConeDummyReader))
+
+    def test_get_reader_low(self):
+        r = api.Factory().get_reader_for_elem("dummy")
+        self.assertTrue(isinstance(r,TestPluginFactory.ConeDummyReader))
+
+    def test_get_reader_upper(self):
+        r = api.Factory().get_reader_for_elem("DUMMY")
+        self.assertTrue(isinstance(r,TestPluginFactory.ConeDummyReader))
+
+    def test_get_writer_ok(self):
+        r = api.Factory().get_writer_for_class("Dummy")
+        self.assertTrue(isinstance(r,TestPluginFactory.ConeDummyWriter))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_rules.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,484 @@
+# *-* coding: utf8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import sys, os
+import __init__
+
+from cone.public.api import CompositeConfiguration, Feature
+from cone.public.rules import ASTInterpreter, RelationContainerImpl, RELATIONS, get_tokens
+from cone.public.rules import ParseException, DefaultContext, BaseRelation, RequireExpression, OPERATORS
+
+#### TEST RELATIONS ####
+
+AA_BA = 'a.a require b.b'
+AB_BB = 'a.b require b.b'
+BA_CA = 'b.a require c.a and c.b and a.b'
+
+CB_DA = 'c.b require d.a'
+DA_DB = 'd.a require d.b'
+
+AC_AB_BA = 'a.c and a.a require b.a'
+
+EA_FSTAR = 'e.a require f.*'
+
+TEST_RELATIONS = {
+    'a.a' : [AA_BA],
+    'a.b' : [AB_BB],
+    'a.c' : [AC_AB_BA],
+    'b.a' : [BA_CA],
+    'c.b' : [CB_DA],
+    'd.a' : [DA_DB],
+    'e.a' : [EA_FSTAR]
+}
+
+class DummyRelationFactory():
+    def get_relations_for(self, configuration, ref):
+        rels = TEST_RELATIONS.get(ref)
+
+        if rels:
+            relation_container = RelationContainerImpl()
+            for rel in rels:
+                rel_s = rel.split(' ')
+                from_ref = rel_s[0]
+                relation_name = 'require'
+                to_ref = ' '.join(rel_s[2:])
+                relation = RELATIONS.get(relation_name)(configuration, from_ref, to_ref)
+                relation_container.add_relation(relation)
+                propagated_relations = self.get_relations_for(configuration, to_ref)
+                if propagated_relations:
+                    for relation in propagated_relations:
+                        relation_container.add_relation(relation)
+                
+            return relation_container
+        return None
+
+class DummyConfiguration(object):
+    VALUES = {
+        'a.a' : True,
+        'a.b' : False,
+        'a.c' : False,
+        'b.a' : True,
+        'b.b' : True,
+        'c.b' : False,
+        'd.a' : True,
+        'e.a' : True,
+        }
+
+    def get_feature(self, ref):
+        return DummyConfiguration.VALUES.get(ref, False)
+
+class DummyContext(DefaultContext):
+    def handle_terminal(self, expression):
+        return DummyConfiguration.VALUES.get(expression, False)
+
+class DummyBaseRelation(BaseRelation):
+    def __init__(self, data, left, right):
+        self.context = DummyContext(data)
+        super(DummyBaseRelation, self).__init__(data, left, right)
+
+class DummyRequireRelation(DummyBaseRelation):
+    KEY = 'require'
+
+    def __init__(self, data, left, right):
+        self.context = DummyContext(data)
+        super(DummyRequireRelation, self).__init__(data, left, right)
+
+RELATIONS[DummyRequireRelation.KEY] = DummyRequireRelation
+OPERATORS['require'] = RequireExpression
+multilines = \
+"""
+APs.AP configures KCRUidCommsDatCreator.KCommsDatCreatorInputFileName = 'VariantData_commsdat.xml' and
+  KCRUidStartupSettings.KCRKeyAccessPointPlugin = '0' and
+  KCRUidStartupSettings.KCRKeyStreamingPlugin = '0' and
+  KCRUidStartupSettings.KCRKeyMusicShopPlugin = '0' and
+   KCRUidStartupSettings.KCRKeyDeviceManagementPlugin = '0' and
+  KCRUidStartupSettings.KCRKeyAGPSPlugin = '0'
+"""
+
+class TestRelations(unittest.TestCase):
+
+    def setUp(self):
+        self.configuration = DummyConfiguration()
+
+    def test_has_ref(self):
+        """
+        Tests the relation and relation container
+        """
+        factory = DummyRelationFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.a')
+        ret= rels.execute()
+        self.assertTrue(ret)
+        
+    def test_not_has_ref(self):
+        factory = DummyRelationFactory()
+        # depends on c.a which has no value in conf
+        rels = factory.get_relations_for(self.configuration, 'b.a')
+        ret = rels.execute()
+        self.assertFalse(ret)
+
+        for rel in rels:
+            ip = rel.interpreter
+            self.assertTrue(ip.errors)
+            errors = ip.errors
+            self.assertTrue(errors.get('b.a'))
+
+    def test_not_has_ref_in_container(self):
+        factory = DummyRelationFactory()
+        rels = factory.get_relations_for(self.configuration, 'c.b')
+        ret = rels.execute()
+        self.assertFalse(ret)
+
+    def test_two_on_the_left(self):
+        factory = DummyRelationFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.c')
+        ret = rels.execute()
+        self.assertTrue(ret)
+
+
+class TestASTInterpreter(unittest.TestCase):
+    def test_require(self):
+        ip = ASTInterpreter('a excludes b require 0')
+        ret = ip.eval()
+
+    def test_get_tokens(self):
+        self.assertEquals(get_tokens("foo=(2+1) * 3"),['foo','=','(','2','+','1',')','*','3'])
+        self.assertEquals(get_tokens("Arithmetic.MixedResult3 = (Arithmetic.Value2 / 2 + Arithmetic.Value1 * 9) - 7"),['Arithmetic.MixedResult3', '=', '(', 'Arithmetic.Value2', '/', '2', '+', 'Arithmetic.Value1', '*', '9', ')', '-', '7'])
+        print get_tokens(multilines)
+        self.assertEquals(len(get_tokens(multilines)),25)
+    
+    def test_get_unindented_multiline_tokens(self):
+        self.assertEquals(
+            get_tokens("foo = 2+bar\nand foobar = 3 and\nfubar=4"),
+            ['foo', '=', '2', '+', 'bar', 'and', 'foobar', '=', '3', 'and', 'fubar', '=', '4'])
+    
+    def test_get_tab_separated_tokens(self):
+        self.assertEquals(
+            get_tokens("foo\tconfigures\t\tbar\t=\t5"),
+            ['foo', 'configures', 'bar', '=', '5'])
+
+    def test_get_unicode_tokens(self):
+        self.assertEquals(
+            get_tokens(u'xÿz configures xzÿ = ÿxá'),
+            [u'xÿz', 'configures', u'xzÿ', '=', u'ÿxá'])
+    
+    def test_get_unicode_tokens_2(self):
+        self.assertEquals(
+            get_tokens(u'ελληνικά configures ünicode = u"test string" + ελληνικά'),
+            [u'ελληνικά', 'configures', u'ünicode', '=', 'u"test string"', '+', u'ελληνικά'])
+    
+    def test_get_unicode_tokens_3(self):
+        self.assertEquals(
+            get_tokens(u'oöoä äöoö oöo öoö äaäa'),
+            [u'oöoä', u'äöoö', u'oöo', u'öoö', u'äaäa'])
+    
+    def test_get_unicode_tokens_4(self):
+        self.assertEquals(
+            get_tokens(u'ünicode.rêf1 require rêf2 . ελληνικά'),
+            [u'ünicode.rêf1', u'require', u'rêf2.ελληνικά'])
+    
+    def test_get_unicode_tokens_multiline(self):
+        tokenstr = u"""
+            foo=(2+1) * 3
+            xÿz configures xzÿ = ÿxá
+            ελληνικά configures ünicode = u"test string" + ελληνικά"""
+        expected = [
+            'foo', '=', '(', '2', '+', '1', ')', '*', '3',
+            u'xÿz', 'configures', u'xzÿ', '=', u'ÿxá',
+            u'ελληνικά', 'configures', u'ünicode', '=', 'u"test string"', '+', u'ελληνικά',
+        ]
+        actual = get_tokens(tokenstr)
+        self.assertEquals(actual, expected, '\n%r \n!= \n%r' % (actual, expected))
+    
+    def test_multiline_string(self):
+        tokenstr = '''
+"""
+tes-
+ti
+"""
+        '''
+        expected = ['"""\ntes-\nti\n"""']
+        self.assertEquals(get_tokens(tokenstr), expected)
+
+    def test_syntax_error(self):
+        try:
+            ip = ASTInterpreter('a and and')
+            self.assertTrue(False)
+        except ParseException:
+            self.assertTrue(True)
+
+    def test_empty_expression(self):
+        expression = ''
+        ip = ASTInterpreter(expression)
+        result = ip.eval()
+        self.assertFalse(result)
+
+    def test_no_expression(self):
+        ip = ASTInterpreter()
+        result = ip.eval()
+        self.assertFalse(result)       
+
+        try:
+            ip.create_ast(None)
+            self.assertFalse(True)
+        except ParseException:
+            self.assertTrue(True)
+
+        ip.create_ast('1 and 1')
+        result = ip.eval()
+        self.assertTrue(result)       
+
+    def test_one_param_ops(self):
+        ip = ASTInterpreter('1 and truth 1')
+        result = ip.eval()
+        self.assertTrue(result)
+        
+        ip.create_ast('1 and truth 0')
+        result = ip.eval()
+        self.assertFalse(result)
+
+        ip.create_ast(u'1 and truth not 0')
+        result = ip.eval()
+        self.assertTrue(result)
+
+    def test_infix_to_postfix(self):
+        expression = '1 and not 1'
+        ip = ASTInterpreter(expression)
+        self.assertEqual(ip.postfix_array, ['1', '1', 'not', 'and'])
+        self.assertFalse(ip.eval())
+
+    def test_infix_to_postfix_pars(self):
+        expression = '1 and ( 0 or 1 and 1 )'
+        ip = ASTInterpreter(expression)
+        self.assertEqual(ip.postfix_array, ['1', '0', '1', 'or', '1', 'and', 'and'])
+        self.assertTrue(ip.eval())
+
+    def test_not(self):
+        ip = ASTInterpreter(u'not 1',)
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'not 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast('not STRING_VALUE')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_not_with_multiple(self):
+        ip = ASTInterpreter(u'1 and not 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+        ip.create_ast(u'1 and not 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_and(self):
+        ip = ASTInterpreter(u'1 and 1 and 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'1 and 1 and 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+    def test_nand(self):
+        ip = ASTInterpreter(u'1 nand 1 nand 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 nand 1 nand 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 nand 0 nand 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'0 nand 0 nand 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+    def test_or(self):
+        ip = ASTInterpreter(u'1 or 1 or 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+    def test_or_for_exclude(self):
+        """
+        On exclude case if OR returns True -> some element is selected
+        and the rule evaluation should fail, the exclude rule should
+        evaluate if PostfixRuleEngine.eval(expression) -> return False
+        """
+        ip = ASTInterpreter(u'1 or 1 or 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 or 1 or 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 or 0 or 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 or 1 or 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 or 0 or 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 or 0 or 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 or 0 or 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_nor(self):
+        ip = ASTInterpreter(u'1 nor 1 nor 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'1 nor 1 nor 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 nor 1 nor 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 nor 0 nor 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+
+    def test_xor(self):
+        ip = ASTInterpreter(u'1 xor 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'1 xor 0 xor 0')
+        ret = ip.eval()
+        self.assertTrue(ret)  
+
+    def test_eq_cmp(self):
+        ip = ASTInterpreter(u'1 == 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+        
+        ip.create_ast(u'1 == 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'DEFINED == DEFINED')
+        ret = ip.eval()
+        self.assertTrue(ret)        
+
+        ip.create_ast(u'DEFINED == UNDEFINED')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_neq_cmp(self):
+        ip = ASTInterpreter(u'1 != 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'1 != 0')
+        ret = ip.eval()
+        self.assertTrue(ret)   
+
+    def test_lt_cmp(self):
+        ip = ASTInterpreter(u'0 < 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'-1 < 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'-1 < -2')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'2 < 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_gt_cmp(self):
+        ip = ASTInterpreter(u'0 > -1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'2 > 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 > 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+        ip.create_ast(u'-1 > 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_lte_cmp(self):
+        ip = ASTInterpreter(u'0 <= 1')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 <= 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'1 <= 0')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_gte_cmp(self):
+        ip = ASTInterpreter(u'1 >= 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 >= 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+        ip.create_ast(u'0 >= 1')
+        ret = ip.eval()
+        self.assertFalse(ret)
+
+    def test_extract_refs(self):
+        refs = ASTInterpreter.extract_refs('a.a and ( b.c and d.e )')
+        self.assertTrue('a.a' in refs)
+        self.assertTrue('b.c' in refs)
+        self.assertTrue('d.e' in refs)
+        self.assertTrue('and' not in refs)
+
+    def test_one_of(self):
+        """ Test for showing that relation one-of is basically "LEFT and R1 xor R2"
+        """
+        ip = ASTInterpreter(u'1 and 1 and 1 xor 0')
+        ret = ip.eval()
+        self.assertTrue(ret)
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_rules_on_configuration.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,277 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import operator as ops
+import unittest
+import sys, os
+import __init__
+import tokenize
+import StringIO
+
+from cone.public import api,exceptions, utils
+from cone.public.rules import ASTInterpreter, RelationContainerImpl
+from cone.public.rules import ParseException, DefaultContext, BaseRelation
+from cone.public import rules
+
+#### TEST RELATIONS ####
+
+AA_BA = 'a.a == "foo" requires b.b != 0'
+AB_BB = 'a.b configures b.b = a.b+":"+ "test"'
+BA_CA = 'b.a requires c.a and c.b and a.b'
+
+CB_DA = 'c.b requires d.a'
+DA_DB = 'd.a requires d.b'
+
+AC_AB_BA = 'a.c and a.a requires b.a'
+
+EA_FSTAR = 'e.a requires f.*'
+
+TEST_RELATIONS = {
+    'a.a' : [AA_BA, 'a.a == "test" requires b.a'],
+    'a.b' : [AB_BB],
+    'a.c' : [AC_AB_BA],
+    'b.a' : [BA_CA],
+    'c.b' : [CB_DA],
+    'd.a' : [DA_DB],
+    'e.a' : [EA_FSTAR]
+}
+
+def get_test_configuration():
+    config = api.Configuration()
+    config.add_feature(api.Feature('a'))
+    config.add_feature(api.Feature('a'),'a')
+    config.add_feature(api.Feature('b'),'a')
+    config.add_feature(api.Feature('c'),'a')
+    config.add_feature(api.Feature('b'))
+    config.add_feature(api.Feature('a'),'b')
+    config.add_feature(api.Feature('b'),'b')
+    config.add_feature(api.Feature('c'))
+    config.add_feature(api.Feature('a'),'c')
+    config.add_feature(api.Feature('b'),'c')
+    config.add_feature(api.Feature('d'))
+    config.add_feature(api.Feature('a'),'d')
+    config.add_feature(api.Feature('b'),'d')
+    config.add_feature(api.Feature('e'))
+    config.add_feature(api.Feature('a'),'e')
+    dview = config.get_default_view()
+    dview.get_feature('a.a').set_value('test')
+    dview.get_feature('a.b').set_value('hey')
+    dview.get_feature('a.c').set_value(False)
+    dview.get_feature('b.a').set_value(True)
+    dview.get_feature('b.b').set_value(True)
+    dview.get_feature('c.a').set_value(True)
+    dview.get_feature('c.b').set_value(True)
+    dview.get_feature('d.a').set_value(False)
+    dview.get_feature('d.b').set_value(False)
+    return config
+
+class TestFactory():
+    def get_relations_for(self, configuration, ref):
+        rels = TEST_RELATIONS.get(ref)
+        if rels:
+            relation_container = RelationContainerImpl()
+            for rel in rels:
+                (left_expression,relation_name,right_expression) = parse_rule(rel)
+                relation = rules.RELATIONS.get(relation_name)(configuration, left_expression, right_expression)
+                relation_container.add_relation(relation)
+                propagated_relations = self.get_relations_for(configuration, right_expression)
+                if propagated_relations:
+                    for relation in propagated_relations:
+                        relation_container.add_relation(relation)
+            return relation_container
+        return None
+
+def parse_rule(rulestring):
+    """
+    Divide the given rule string into (left side, relation, right side) components. 
+    @return: Triple (left side, relation, right side)
+    """
+    left_expression = ''
+    relation_name = None
+    right_expression = ''
+    for token in rules.get_tokens(rulestring):
+        if relation_name == None:
+            if token in rules.RELATIONS.keys():
+                relation_name = token
+            else:
+                left_expression += ' ' + token
+        else:
+            right_expression += ' ' + token
+    
+    if relation_name == None:
+        raise exceptions.ParseError('invalid rule definition %s' % rulestring)
+    
+    return (left_expression,relation_name,right_expression)
+
+class ConfigurationContext(DefaultContext):
+    def handle_terminal(self, expression):
+        try:
+            value = self.data.get_feature(expression).get_value()
+            if value != None:
+                #print "handle_terminal %s = %s" % (expression,value)
+                return value
+            else:
+                raise exceptions.NotBound('Feature %s has no value' % expression)
+        except exceptions.NotFound,e:
+            """ return the expression itself if it is not a fearef """
+            #print "handle_terminal constant %s" % (expression)
+            try:
+                return eval(expression)
+            except (NameError,SyntaxError), e:
+                return expression
+
+    def eval(self, ast, expression, value):
+        #print "expression %s = %s" % (expression,value)
+        pass
+        
+class ConfigurationBaseRelation(BaseRelation):
+    def __init__(self, data, left, right):
+        self.context = ConfigurationContext(data)
+        super(ConfigurationBaseRelation, self).__init__(data, left, right)
+
+class RequireRelation(ConfigurationBaseRelation):
+    KEY = 'requires'
+    def __init__(self, data, left, right):
+        super(RequireRelation, self).__init__(data, left, right)
+        self.context = ConfigurationContext(data)
+
+class ConfigureRelation(ConfigurationBaseRelation):
+    KEY = 'configures'
+    def __init__(self, data, left, right):
+        super(ConfigureRelation, self).__init__(data, left, right)
+        self.context = ConfigurationContext(data)
+
+def handle_configure(self, left, right):
+    if left and right:
+        return True
+    elif not left:
+        return True
+    return False
+
+def handle_set(self, left, right):
+    left.set_value(right)
+
+class ConfigureExpression(rules.TwoOperatorExpression):
+    PRECEDENCE = rules.PRECEDENCES['RELATION_OPERATORS']
+    KEY = 'configures'
+    OP = handle_configure
+
+    def eval(self, context):
+        super(ConfigureExpression, self).eval(context)
+        if not self.value:
+            left_keys = []
+            for ref in self.ast.extract_refs(str(self.left)):
+                for key in context.get_keys(ref):
+                    left_keys.append(key)
+
+            for key in left_keys:
+                self.ast.add_error(key, { 'error_string' : 'CONFIGURES right side value is "False"',
+                                          'left_key' : key,
+                                          'rule' : self.ast.expression
+                                          })
+        return self.value
+
+def handle_plus(self, a,b):
+    #print "%s adding a: %s to b: %s" % (self, a,b)
+    return a + b
+
+class ConcatExpression(rules.TwoOperatorExpression):
+    PRECEDENCE = rules.PRECEDENCES['ADDSUB_OPERATORS']
+    KEY= '+'
+    OP = handle_plus
+
+
+class SetExpression(rules.TwoOperatorExpression):
+    PRECEDENCE = rules.PRECEDENCES['SET_OPERATORS']
+    KEY= '='
+    OP = handle_set
+
+    def eval(self, context):
+        try:
+            variable = context.data.get_feature(self.left.expression)
+            variable.set_value(self.right.eval(context))
+            return True
+        except exceptions.NotFound:
+            return False
+
+class TestRelations(unittest.TestCase):
+
+    def setUp(self):
+        self.configuration = get_test_configuration()
+        
+        self.RELATIONS_BACKUP = rules.RELATIONS
+        self.OPERATORS_BACKUP = rules.OPERATORS
+        rules.RELATIONS = rules.RELATIONS.copy()
+        rules.OPERATORS = rules.OPERATORS.copy()
+        self.assertTrue(self.RELATIONS_BACKUP is not rules.RELATIONS)
+        self.assertTrue(self.OPERATORS_BACKUP is not rules.OPERATORS)
+        
+        rules.RELATIONS[RequireRelation.KEY] = RequireRelation
+        rules.RELATIONS[ConfigureRelation.KEY] = ConfigureRelation
+        rules.OPERATORS[ConfigureExpression.KEY] = ConfigureExpression
+        rules.OPERATORS[ConcatExpression.KEY] = ConcatExpression
+        rules.OPERATORS[SetExpression.KEY] = SetExpression
+    
+    def tearDown(self):
+        rules.RELATIONS = self.RELATIONS_BACKUP
+        rules.OPERATORS = self.OPERATORS_BACKUP
+
+    def test_has_ref(self):
+        """
+        Tests the relation and relation container
+        """
+        factory = TestFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.a')
+        ret= rels.execute()
+        self.assertTrue(ret)
+
+    def test_has_ref(self):
+        """
+        Tests the relation and relation container
+        """
+        factory = TestFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.a')
+        ret= rels.execute()
+        self.assertTrue(ret)
+        
+    def test_not_has_ref(self):
+        factory = TestFactory()
+        # depends on c.a which has no value in conf
+        rels = factory.get_relations_for(self.configuration, 'b.a')
+        ret = rels.execute()
+        self.assertTrue(ret)
+
+    def test_not_has_ref_in_container(self):
+        factory = TestFactory()
+        rels = factory.get_relations_for(self.configuration, 'c.b')
+        ret = rels.execute()
+        self.assertFalse(ret)
+
+    def test_two_on_the_left(self):
+        factory = TestFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.c')
+        ret = rels.execute()
+        self.assertTrue(ret)
+
+    def test_configure_right_side(self):
+        factory = TestFactory()
+        rels = factory.get_relations_for(self.configuration, 'a.b')
+        ret = rels.execute()
+        self.assertTrue(ret)
+        self.assertEquals(self.configuration.get_default_view().get_feature('b.b').get_value(),'hey:test')
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_rules_simplecondition.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,133 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import os
+import re
+import logging
+import __init__
+from cone.public import *
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestContext(object):
+    """ DefaultContext implements ConE specific context for handling rules
+    """
+    def __init__(self, data):
+        self.data = data
+
+    def eval(self, ast, expression, value):
+        pass
+
+    def get_keys(self, refs):
+        return ASTInterpreter.extract_refs(refs)
+
+    def get_children_for_reference(self, reference):
+        # implement ConE specific children expansion
+        pass
+
+    def handle_terminal(self, expression):
+        try:
+            m = re.match("\${(.*)}", expression)
+            if m:
+                return self.data[m.group(1)]
+            elif expression in ['true','1','True']:
+                return True
+            elif expression in ['false','0','False']:
+                return False
+            else:
+                return eval(expression)
+        except:
+            return expression
+
+class TestPluginCondition(unittest.TestCase):
+    
+    def test_create_plugin_condition(self):
+        condition = rules.SimpleCondition("foo.bar", "True")
+
+    def test_create_plugin_and_eval_booleans(self):
+        context = TestContext(None)
+        condition = rules.SimpleCondition("1", "True")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("0", True)
+        self.assertFalse(condition.eval(context))
+
+    def test_create_plugin_and_eval_integers(self):
+        context = TestContext(None)
+        condition = rules.SimpleCondition("1", "2")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("112", "2")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("2", "2")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition(2, 2)
+        self.assertTrue(condition.eval(context))
+
+    def test_create_plugin_and_eval_string(self):
+        context = TestContext(None)
+        condition = plugin.rules.SimpleCondition("test", "foo")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("test", "")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("test foo", "test foo")
+        self.assertTrue(condition.eval(context))
+
+    def test_create_plugin_and_eval_data_reference(self):
+        context = TestContext({'test' : 1, 'foo' : 2, 'bar' : True})
+        condition = rules.SimpleCondition("${test}", 1)
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test}", False)
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("${test}", "${foo}")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("${test}", "${bar}")
+        self.assertTrue(condition.eval(context))
+        
+    def test_create_plugin_and_eval_data_reference_on_generation_context(self):
+        context = plugin.GenerationContext()
+        context.configuration = api.Configuration()
+        context.configuration.add_feature(api.Feature("test"))
+        context.configuration.add_feature(api.Feature("stringsub"),"test")
+        context.configuration.add_feature(api.Feature("intsub"),"test")
+        condition = rules.SimpleCondition("${test}", None)
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test.stringsub}", "None")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test.intsub}", "None")
+        self.assertTrue(condition.eval(context))
+        context.configuration.get_default_view().test.value = True
+        context.configuration.get_default_view().test.stringsub.value = "stringval"
+        context.configuration.get_default_view().test.intsub.value = 2
+        condition = rules.SimpleCondition("${test}", "true")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test}", "false")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("${test.stringsub}", "tes")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("${test.stringsub}", "stringval")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test.intsub}", "1")
+        self.assertFalse(condition.eval(context))
+        condition = rules.SimpleCondition("${test.intsub}", "2")
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test.intsub}", 2)
+        self.assertTrue(condition.eval(context))
+        condition = rules.SimpleCondition("${test.intsub}", 1)
+        self.assertFalse(condition.eval(context))
+        try:
+            condition = rules.SimpleCondition("${boo}", "false")
+            self.fail("access of non existing elements succeds?")
+        except:
+            pass
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_settings.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,102 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import StringIO
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,settings
+
+import ConfigParser
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+configdata = \
+'''
+[DEFAULT]
+output_root=output
+output_subdir=
+plugin_output=
+output=%(output_root)s/%(output_subdir)s/%(plugin_output)s
+
+plugin_targets = 'rofs2','rofs3'
+
+generate_targets = 'rofs3'
+generate_layers  = -1
+generate_impls   =
+
+
+[CRML]
+plugin_output=%(plugin_output)s/private/1234567
+tags={target : [%(plugin_targets)s]}
+
+[CONTENT]
+tags={target : ['rofs2','rofs3','uda']}
+
+[ROFS3]
+output_subdir=rofs3
+'''
+
+imagedefault = \
+'''
+[DEFAULT]
+subdir=content
+foobar=fs/content
+'''
+
+class TestConfigParser(unittest.TestCase):
+    def tearDown(self):
+        settings.SettingsFactory.clear()
+        
+    def test_config_parser_from_string(self):
+        config = ConfigParser.ConfigParser()
+        config.readfp(StringIO.StringIO(configdata))
+        config.readfp(StringIO.StringIO(imagedefault))
+        self.assertEquals(config.get('ROFS3','output'),'output/rofs3/')
+        self.assertEquals(config.get('CRML','tags'),"{target : ['rofs2','rofs3']}")
+
+    def test_get_parser(self):
+        settings.SettingsFactory.defaultconfig = os.path.join(ROOT_PATH,'test_defaults.cfg')
+        s = settings.SettingsFactory.cone_parser()
+        cs = settings.ConeSettings(s)
+        self.assertEquals(s.get('DEFAULT','output'),'output//')
+
+    def test_cone_settings(self):
+        settings.SettingsFactory.defaultconfig = os.path.join(ROOT_PATH,'test_defaults.cfg')
+        s = settings.SettingsFactory.cone_parser()
+        cs = settings.ConeSettings(s)
+        self.assertEquals(cs.get('output'),'output//')
+        self.assertEquals(cs.get('foobar'),None)
+        self.assertEquals(cs.get('foobar', 'test'),'test')
+
+    def test_cone_settings_with_invalid_section(self):
+        settings.SettingsFactory.defaultconfig = os.path.join(ROOT_PATH,'test_defaults.cfg')
+        settings.SettingsFactory.configsettings = None
+        s = settings.SettingsFactory.cone_parser()
+        cs = settings.ConeSettings(s,'FOOBAR')
+        self.assertEquals(cs.get('output'),'output//')
+        self.assertEquals(cs.get('foobar'),None)
+        self.assertEquals(cs.get('foobar', 'test'),'test')
+        self.assertEquals(cs.get('output','',{'output_subdir':'content',
+                                              'output_subdir':'content'}),'output/content/')
+
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_storage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,434 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test Respource
+"""
+import unittest
+import string
+import sys,os
+import pickle
+import __init__
+
+from cone.public import api, exceptions, utils
+
+ROOT_PATH       = os.path.dirname(os.path.abspath(__file__))
+temp_dir        = os.path.join(ROOT_PATH, "temp/storage")
+storage_path    = os.path.join(temp_dir, "layertest.pk")
+
+class TestStorage(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    def test_create_storage(self):
+        res = api.Storage("")
+        self.assertTrue(res)
+
+    def test_get_root(self):
+        path = os.path.join(temp_dir, "foo/faa.pk")
+        store = api.Storage.open(path,"w")
+        self.assertEquals(store.get_path(),path)
+
+    def test_set_path(self):
+        path = os.path.join(temp_dir, "foo/faa.pk")
+        store = api.Storage.open(path,"w")
+        self.assertEquals(store.get_path(),path)
+        store.set_current_path("faa")
+        self.assertEquals(store.get_current_path(),"faa")
+
+    def test_get_more_read(self):
+        storage = api.Storage("")
+        self.assertEquals(storage.get_mode("r"),storage.MODE_READ)
+        self.assertEquals(storage.get_mode("rb"),storage.MODE_READ)
+        
+    def test_get_more_write(self):
+        storage = api.Storage("")
+        self.assertEquals(storage.get_mode("w"),storage.MODE_WRITE)
+        self.assertEquals(storage.get_mode("wb"),storage.MODE_WRITE)
+
+    def test_get_more_append(self):
+        storage = api.Storage("")
+        self.assertEquals(storage.get_mode("a"),storage.MODE_APPEND)
+        self.assertEquals(storage.get_mode("ab"),storage.MODE_APPEND)
+
+    def test_get_more_unknown(self):
+        storage = api.Storage("")
+        self.assertEquals(storage.get_mode("1"),storage.MODE_UNKNOWN)
+        self.assertEquals(storage.get_mode("2b"),storage.MODE_UNKNOWN)
+
+class TestStorageGeneric(unittest.TestCase):
+    def test_list_resources(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        self.assertEquals(store.list_resources(""), [])
+
+    def test_open_resource_nonexisting(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        try:
+            res = store.open_resource("test")
+            res.close()
+            self.fail("Opening non existing resource succeeds")
+        except exceptions.NotResource,e:
+            pass
+
+    def test_is_resource_nonexisting(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        self.assertFalse(store.is_resource("test"))
+
+    def test_open_resource_is_resource(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test","w")
+        res.write("Testing writing more")
+        res.close()
+        self.assertTrue(store.is_resource('test'))
+
+    def test_open_resource_write_and_write(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test","w")
+        res.write("Testing writing more")
+        res.close()
+        res = store.open_resource("test","w")
+        res.write("writing")
+        res.close()
+        self.assertEquals(store._get('test').data, 'writing')
+    
+    def test_get_size_on_write_only_resource_fails(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test","w")
+        res.write("Writing foobar")
+        self.assertRaises(exceptions.StorageException, res.get_size)
+        res.close()
+    
+    def test_open_resource_and_get_size(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test","w")
+        res.write("Writing foobar")
+        res.close()
+        
+        res = store.open_resource("test","r")
+        self.assertEquals(res.get_size(), 14)
+        res.close()
+    
+    def test_write_fails_on_read_mode(self):
+        store = api.Storage.open(storage_path, "w")
+        self.assertTrue(store)
+        res = store.open_resource("test","w")
+        res.write("Testing writing more")
+        res.close()
+        resr = store.open_resource("test","r")
+        try:
+            resr.write("Testing writing more")
+            resr.close()
+            self.fail("Writing succeeds on read mode?")
+        except exceptions.StorageException, e:
+            pass
+
+    def test_open_resource_append(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test","a")
+        res.write("Testing append.\n")
+        res.close()
+        res = store.open_resource("test","a")
+        res.write("appending!")
+        res.close()
+        self.assertEquals(store.test.data, 'Testing append.\nappending!')
+    
+    def test_open_multiple_no_close_and_write_closed(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test","a")
+        res1.write("Testing append.\n")
+        res1.close()
+        res2 = store.open_resource("test","a")
+        res2.write("appending!")
+        res2.close()
+        try:
+            res2.write("sss")
+            self.fail("writing on closed object succeeds?")
+        except ValueError:
+            pass
+        self.assertEquals(store.test.data, 'Testing append.\nappending!')
+
+    def test_open_many_to_one(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test/foo.txt","a")
+        res1.write("Testing\n")
+        res1.close()
+        res1 = store.open_resource("test/foo.txt","w")
+        res1.close()
+        self.assertEquals(store.list_resources('', True),['test/foo.txt'])
+
+    def test_open_many(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test/foo.txt","a")
+        res1.write("Testing\n")
+        res1.close()
+        res2 = store.open_resource("test/bar.txt","a")
+        res2.write("Writing bar!")
+        res2.close()
+        self.assertEquals(store.test.foo.data, 'Testing\n')
+        self.assertEquals(store.test.bar.data, 'Writing bar!')
+
+    def test_open_many_to_a_hierarchy_and_list_folders(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        root= store.open_resource("root.txt","a")
+        root.write("root\n")
+        root.close()
+        res1 = store.open_resource("test/foo.txt","a")
+        res1.write("Testing\n")
+        res1.close()
+        res2 = store.open_resource("test/bar.txt","a")
+        res2.write("Writing bar!")
+        res2.close()
+        self.assertEquals(store.list_resources('/'), ['root.txt'])
+        self.assertEquals(store.list_resources('/test'), ['test/bar.txt',
+                                                          'test/foo.txt'])
+        self.assertEquals(store.list_resources('/',True), ['root.txt',
+                                                           'test/bar.txt',
+                                                           'test/foo.txt'])
+
+    def test_open_resource_and_delete(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test1.txt","a")
+        res.write("Testing append.\n")
+        res.close()
+        res = store.open_resource("test2.txt","w")
+        res.write("Testing append.\n")
+        res.close()
+        res = store.open_resource("test3.txt","w")
+        res.write("Testing append.\n")
+        res.close()
+        for res in store.list_resources(''):
+            store.delete_resource(res)
+        self.assertEquals(store.list_resources(''), [])
+
+    def test_open_resources_and_read(self):
+        store = api.Storage.open(storage_path,"w")
+        self.assertTrue(store)
+        res = store.open_resource("test1.txt","w")
+        res.write("Testing reading.\n")
+        res.close()
+        res = store.open_resource("test2.txt","w")
+        res.write("Testing reading.\n")
+        res.close()
+        res = store.open_resource("test3.txt","w")
+        res.write("Testing reading.\n")
+        res.close()
+        for res in store.list_resources(''):
+            res = store.open_resource(res)
+            self.assertEquals(res.read(), "Testing reading.\n")
+    
+    def test_open_resources_and_save_and_dump(self):
+        temp_file = os.path.join(temp_dir, "FooStore.pk")
+        store = api.Storage.open(temp_file, "w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading.\n")
+        res2 = store.open_resource("test2.txt","w")
+        res2.write("Testing reading.\n")
+        res3 = store.open_resource("test3.txt","w")
+        res3.write("Testing reading.\n")
+        store.save()
+        
+    def test_open_resources_and_load(self):
+        temp_file = os.path.join(temp_dir, "store.pk")
+        store = api.Storage.open(temp_file,"w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading.\n")
+        res2 = store.open_resource("test2.txt","w")
+        res2.write("Testing reading.\n")
+        res3 = store.open_resource("test3.txt","w")
+        res3.write("Testing reading.\n")
+        store.close()
+        store2 = api.Storage.open(temp_file)
+        self.assertEquals(store2.list_resources(''), ['test1.txt',
+                                                     'test2.txt',
+                                                     'test3.txt'])
+        self.assertEquals(store2.open_resource("test1.txt").read(),'Testing reading.\n')
+        self.assertEquals(store2.open_resource("test2.txt").read(),'Testing reading.\n')
+        self.assertEquals(store2.open_resource("test3.txt").read(),'Testing reading.\n')
+
+    def test_import_resources(self):
+        temp_file = os.path.join(temp_dir, "importsource.pk")
+        store = api.Storage.open(temp_file, "w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading.\n")
+        res2 = store.open_resource("test2.txt","w")
+        res2.write("Testing reading.\n")
+        res3 = store.open_resource("test3.txt","w")
+        res3.write("Testing reading.\n")
+        store.save()
+        res3.close()
+        store2 = api.Storage.open(temp_file, "w")
+        store2.import_resources(store.list_resources(''), store)
+        self.assertEquals(store2.open_resource("test1.txt").read(),store.open_resource('test1.txt').read())
+        self.assertEquals(store2.open_resource("test2.txt").read(),store.open_resource('test2.txt').read())
+        self.assertEquals(store2.open_resource("test3.txt").read(),store.open_resource('test3.txt').read())
+        store2.close()
+        
+    def test_export_resources(self):
+        temp_file = os.path.join(temp_dir, "exportsource.pk")
+        store = api.Storage.open(temp_file, "w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading.\n")
+        res2 = store.open_resource("test2.txt","w")
+        res2.write("Testing reading.\n")
+        res3 = store.open_resource("test3.txt","w")
+        res3.write("Testing reading.\n")
+        store.save()
+        store2 = api.Storage.open(temp_file, "w")
+        store.export_resources(store.list_resources(''), store2)
+        res2 = store2.open_resource("test1.txt")
+        res1 = store.open_resource('test1.txt')
+        self.assertEquals(res1.read(),res2.read())
+        self.assertEquals(store2.open_resource("test2.txt").read(),store.open_resource('test2.txt').read())
+        self.assertEquals(store2.open_resource("test3.txt").read(),store.open_resource('test3.txt').read())
+        store2.close()
+
+    def test_export_modify_and_close_and_open(self):
+        temp_file = os.path.join(temp_dir, "exportsource.pk")
+        store = api.Storage.open(temp_file,"w")
+        self.assertTrue(store)
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading.\n")
+        res1.close()
+        
+        res2 = store.open_resource("test2.txt","w")
+        res2.write("Testing reading.\n")
+        res3 = store.open_resource("test3.txt","w")
+        res3.write("Testing reading.\n")
+        
+        res1 = store.open_resource("test1.txt","w")
+        res1.write("Testing reading too.\n")
+        res1.close()
+        
+        store.close()
+        
+        modified_temp_file = os.path.join(temp_dir, "modified.pk")
+        store2 = api.Storage.open(modified_temp_file, "w")
+        store.export_resources(store.list_resources(''), store2)
+        store2.delete_resource('test3.txt')
+        resr = store2.open_resource('test2.txt')
+        resw = store2.open_resource('test2.txt','w')
+        resw.write("Now this sould be different")
+        store2.close()
+        store3 = api.Storage.open(modified_temp_file)
+        self.assertEquals(store3.list_resources(''), ['test1.txt',
+                                                     'test2.txt'])
+        self.assertEquals(store3.open_resource("test2.txt").read(),'Now this sould be different')
+        self.assertEquals(store3.open_resource("test1.txt").read(),'Testing reading too.\n')
+        
+
+    def test_get_path_set_path(self):
+        temp_file = os.path.join(temp_dir, "subpath.pk")
+        store = api.Storage.open(temp_file,"w")
+        self.assertEquals(store.get_path(),temp_file)
+        self.assertEquals(store.get_current_path(),"")
+        store.set_current_path("subdir")
+        self.assertEquals(store.get_current_path(),"subdir")
+
+    def test_set_path_open_resource(self):
+        temp_file = os.path.join(temp_dir, "subpath.pk")
+        if os.path.exists(temp_file): os.unlink(temp_file)
+        
+        store = api.Storage.open(temp_file,"w")
+        self.assertEquals(store.get_path(),temp_file)
+        store.set_current_path("subdir")
+        self.assertEquals(store.get_current_path(),"subdir")
+        res = store.open_resource("foo.txt","w")
+        res.write("foo")
+        res.close()
+        self.assertEquals(store.list_resources(""), ["foo.txt"])
+        store.set_current_path("/")
+        self.assertEquals(store.list_resources("", True), ["subdir/foo.txt"])
+        store.close()
+        os.unlink(temp_file)
+
+    def test_create_folder(self):
+        temp_file = os.path.join(temp_dir, "subpath.pk")
+        store = api.Storage.open(temp_file,"w")
+        store.create_folder("subdir/test")
+        self.assertTrue(store.is_folder("subdir/test"))
+
+    def test_create_folder_and_delete_folder(self):
+        temp_file = os.path.join(temp_dir, "subpath.pk")
+        store = api.Storage.open(temp_file,"w")
+        store.create_folder("subdir/test")
+        self.assertTrue(store.is_folder("subdir/test"))
+        store.delete_folder("subdir/test")
+        self.assertFalse(store.is_folder("subdir/test"))
+        self.assertTrue(store.is_folder("subdir"))
+
+class TestFolder(unittest.TestCase):    
+
+    def test_create_folder(self):
+        store = api.Storage.open(storage_path,"w")
+        layer = api.Folder(store, "foo")
+        self.assertTrue(layer)
+
+    def test_get_path(self):
+        store = api.Storage.open(storage_path,"w")
+        layer = api.Folder(store, "foo")
+        self.assertTrue(layer)
+        self.assertEquals(layer.get_current_path(),"foo")
+
+    def test_open_resource(self):
+        store = api.Storage.open(storage_path,"w")
+        layer = api.Folder(store, "foo")
+        self.assertTrue(layer)
+        res = layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_resources("", True),["confml/test.confml"])
+        self.assertEquals(store.list_resources("", True),["foo/confml/test.confml"])
+
+    def test_create_two_layers_and_open_resource(self):
+        store = api.Storage.open(storage_path,"w")
+        foo_layer = api.Folder(store, "foo")
+        bar_layer = api.Folder(store, "bar")
+        res = foo_layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = foo_layer.open_resource("root.confml","w")
+        res.close()
+        res = bar_layer.open_resource("confml/root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(foo_layer.list_resources("", True),['confml/test.confml', 'root.confml'])
+        self.assertEquals(store.list_resources("", True),['bar/confml/root.confml','foo/confml/test.confml','foo/root.confml'])
+        
+        foo_layer.delete_resource("confml/test.confml")
+        self.assertEquals(foo_layer.list_resources("", True),["root.confml"])
+        self.assertEquals(store.list_resources("", True),["bar/confml/root.confml","foo/root.confml"])
+
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,643 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import token
+import sys,os,re
+import __init__
+
+from cone.public import utils, rules, api, exceptions
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.abspath(os.path.join(ROOT_PATH,'utils-testdata'))
+
+class T(object): 
+    def __init__(self,str=""): self.str = str
+
+class TestResourceRefs(unittest.TestCase):
+    def test_join_two_refs(self):
+        self.assertEquals(utils.resourceref.join_refs(['foo/bar/test','fancy.ref']),'foo/bar/test/fancy.ref')
+        self.assertEquals(utils.resourceref.join_refs(['foo/bar/test','/absref/fancy.ref']),'/absref/fancy.ref')
+
+    def test_join_three_refs(self):
+        self.assertEquals(utils.resourceref.join_refs(['foo/bar/test','fancy/ref','test1.12']),'foo/bar/test/fancy/ref/test1.12')
+
+    def test_join_two_refs_with_empty_first_ref(self):
+        self.assertEquals(utils.resourceref.join_refs(['','fancy/ref']),'fancy/ref')
+
+    def test_join_two_refs_with_empty_last_ref(self):
+        self.assertEquals(utils.resourceref.join_refs(['fancy/ref','']),'fancy/ref/')
+
+    def test_join_two_refs_with_two_emtpy_refs(self):
+        self.assertEquals(utils.resourceref.join_refs(['','']),'')
+
+    def test_join_three_refs_with_empty(self):
+        self.assertEquals(utils.resourceref.join_refs(['foo/bar/test','','test1/12']),'foo/bar/test/test1/12')
+
+    def test_join_three_refs_with_extra_slashes(self):
+        self.assertEquals(utils.resourceref.join_refs(['foo/bar/test/','/','one/']),'/one/')
+
+    def test_join_three_refs_with_extra_slashes_and_begin_slash(self):
+        self.assertEquals(utils.resourceref.join_refs(['/foo/bar/test/','/','one/']),'/one/')
+
+    def test_filter_files(self):
+        filtered = utils.resourceref.filter_resources(['test.txt','foo.dat','teat/data/bar.confml'],"\.txt")
+        self.assertEquals(filtered[0],'test.txt')
+    
+    def test_filter_files_confmls(self):
+        filtered = utils.resourceref.filter_resources(['test.txt','foo.confml','test/data/bar.confml'],"\.confml")
+        self.assertEquals(filtered[0],'foo.confml')
+
+    def test_neg_filter_resources(self):
+        filtered = utils.resourceref.neg_filter_resources(['test.txt','foo.dat','teat/data/bar.confml'],"\.txt")
+        self.assertEquals(filtered[0],'foo.dat')
+        self.assertEquals(filtered[1],'teat/data/bar.confml')
+
+    def test_filter_files_with_extension(self):
+        filtered = utils.resourceref.filter_resources(['test.txt','foo.dat','teat/data/bar.confml'],".*\.dat")
+        self.assertEquals(filtered[0],'foo.dat')
+
+    def test_neg_filter_resources(self):
+        filtered = utils.resourceref.neg_filter_resources(['/test/.svn/test.txt','.svn/test/foo.dat','teat/data/bar.confml'],"\.svn")
+        self.assertEquals(filtered[0],'teat/data/bar.confml')
+
+    def test_insert_begin_slash_without(self):
+        self.assertEquals(utils.resourceref.insert_begin_slash('data/folder/siitake.txt'),'/data/folder/siitake.txt')
+
+    def test_insert_begin_slash_with(self):
+        self.assertEquals(utils.resourceref.insert_begin_slash('/data/folder/siitake.txt'),'/data/folder/siitake.txt')
+
+    def test_remove_begin_slash_without(self):
+        self.assertEquals(utils.resourceref.remove_begin_slash('data/folder/siitake.txt'),'data/folder/siitake.txt')
+
+    def test_remove_beging_slash_with(self):
+        self.assertEquals(utils.resourceref.remove_begin_slash('/data/folder/siitake.txt'),'data/folder/siitake.txt')
+
+    def test_add_end_slash_without(self):
+        self.assertEquals(utils.resourceref.add_end_slash('data/folder'),'data/folder/')
+
+    def test_add_end_slash_with(self):
+        self.assertEquals(utils.resourceref.add_end_slash('data/folder/'),'data/folder/')
+
+    def test_remove_end_slash_without(self):
+        self.assertEquals(utils.resourceref.remove_end_slash('data/folder'),'data/folder')
+
+    def test_remove_end_slash_with(self):
+        self.assertEquals(utils.resourceref.remove_end_slash('/data/folder/'),'/data/folder')
+
+    def test_split_ref_with_empty_elem(self):
+        self.assertEquals(utils.resourceref.split_ref(''),[])
+
+    def test_split_ref_two_elems(self):
+        self.assertEquals(utils.resourceref.split_ref('aaa/bbb'),['aaa','bbb'])
+
+    def test_split_ref_two_elems_and_begin_slash(self):
+        self.assertEquals(utils.resourceref.split_ref('/aaa/bbb'),['aaa','bbb'])
+
+    def test_split_ref_two_elems_and_end_slash(self):
+        self.assertEquals(utils.resourceref.split_ref('aaa/bbb/'),['aaa','bbb'])
+
+    def test_psplit_ref_with_tree_elems(self):
+        self.assertEquals(utils.resourceref.psplit_ref('aaa/bbb/ccc.txt'),('aaa/bbb','ccc.txt'))
+
+    def test_psplit_ref_with_two_elems(self):
+        self.assertEquals(utils.resourceref.psplit_ref('aaa/bbb'),('aaa','bbb'))
+
+    def test_psplit_ref_with_one_elems(self):
+        self.assertEquals(utils.resourceref.psplit_ref('aaa.conf'),('','aaa.conf'))
+
+    def test_psplit_ref_with_empty_elem(self):
+        self.assertEquals(utils.resourceref.psplit_ref(''),('',''))
+
+    def test_norm_ref(self):
+        self.assertEquals(utils.resourceref.norm('dir/with/something/skeleton.txt'),
+                                     'dir/with/something/skeleton.txt')
+
+    def test_norm_ref_with_begin_dot(self):
+        self.assertEquals(utils.resourceref.norm('./skeleton.txt'),
+                                     'skeleton.txt')
+
+    def test_norm_ref_with_begin_dot(self):
+        self.assertEquals(utils.resourceref.norm('.svn'),
+                                     '.svn')
+
+    def test_norm_ref_with_empty_string(self):
+        self.assertEquals(utils.resourceref.norm(''),
+                                     '')
+
+    def test_norm_ref_with_backslash(self):
+        self.assertEquals(utils.resourceref.norm('dir\\with\\something\\skeleton.txt'),
+                                     'dir/with/something/skeleton.txt')
+
+    def test_norm_ref_with_backslash_and_forward_slash(self):
+        self.assertEquals(utils.resourceref.norm('dir\\with/something\\skeleton.txt'),
+                                     'dir/with/something/skeleton.txt')
+
+    def test_norm_ref_with_begin_slash(self):
+        self.assertEquals(utils.resourceref.norm('/dir/with/something\\skeleton.txt'),
+                                     '/dir/with/something/skeleton.txt')
+
+    def test_norm_ref_with_begin_backslash(self):
+        self.assertEquals(utils.resourceref.norm('\\dir\\with\\something\\skeleton.txt'),
+                                     '/dir/with/something/skeleton.txt')
+
+    def test_norm_ref_with_end_slash(self):
+        self.assertEquals(utils.resourceref.norm('/dir/with/something/'),
+                                     '/dir/with/something')
+
+    def test_norm_ref_with_end_backslash(self):
+        self.assertEquals(utils.resourceref.norm('dir/with/something\\'),
+                                     'dir/with/something')
+
+    def test_norm_ref_with_spaces(self):
+        self.assertEquals(utils.resourceref.norm('dir/with/some thing/some.txt'),
+                                     'dir/with/some thing/some.txt')
+
+    def test_norm_ref_with_spaces_and_hyphens(self):
+        self.assertEquals(utils.resourceref.norm('"dir/with/some thing/some.txt"'),
+                                     'dir/with/some thing/some.txt')
+
+    def test_norm_ref_with_spaces_and_hyphens_and_begin_slash(self):
+        self.assertEquals(utils.resourceref.norm('"/dir/with/some thing/some.txt"'),
+                                     '/dir/with/some thing/some.txt')
+
+    def test_replace_dir_part(self):
+        filename = utils.resourceref.replace_dir('dir/to/replace/with/something/skeleton.txt',
+                                  'dir/to\\replace',
+                                  'somethingelse/123/')
+        self.assertEquals(filename,'somethingelse/123/with/something/skeleton.txt')
+
+    def test_replace_dir_part_with_one_part(self):
+        filename = utils.resourceref.replace_dir('dir/to/replace/with/dir/dir.txt',
+                                  'dir',
+                                  'somethingelse/123/')
+        self.assertEquals(filename,'somethingelse/123/to/replace/with/dir/dir.txt')
+
+    def test_replace_dir_part_with_empty_target(self):
+        filename = utils.resourceref.replace_dir('dir/to/replace/with/dir/dir.txt',
+                                  'dir',
+                                  '')
+        self.assertEquals(filename,'to/replace/with/dir/dir.txt')
+
+    def test_replace_dir_part_with_no_match(self):
+        filename = utils.resourceref.replace_dir('foo\\skeleton.txt',
+                                  'dir/to\\replace',
+                                  'somethingelse/123/')
+        self.assertEquals(filename,'foo/skeleton.txt')
+
+    def test_replace_dir_part_with_begin_slash(self):
+        filename = utils.resourceref.replace_dir('dir/to/replace/with/dir/dir.txt',
+                                  'dir/to/replace',
+                                  '/epoc32/testing')
+        self.assertEquals(filename,'/epoc32/testing/with/dir/dir.txt')
+
+    def test_replace_dir_with_match(self):
+        filename = utils.resourceref.replace_dir('foo/test',
+                                  'foo/test',
+                                  '')
+        self.assertEquals(filename,'')
+
+    def test_replace_dir_from_empty(self):
+        filename = utils.resourceref.replace_dir('foo/test',
+                                  '',
+                                  'output/bar')
+        self.assertEquals(filename,'output/bar/foo/test')
+
+    def test_remove_ext(self):
+        self.assertEquals(utils.resourceref.remove_ext('fii/faa/foo.confml'),'fii/faa/foo')
+
+    def test_remove_ext_from_dot_beginning_file(self):
+        self.assertEquals(utils.resourceref.remove_ext('.metadata'),'.metadata')
+
+    def test_remove_ext_from_file_without_ext(self):
+        self.assertEquals(utils.resourceref.remove_ext('fii/faa/foo'),'fii/faa/foo')
+
+    def test_remove_ext_from_file_without_path(self):
+        self.assertEquals(utils.resourceref.remove_ext('fii.faa.foo'),'fii.faa')
+
+    def test_get_ext(self):
+        self.assertEquals(utils.resourceref.get_ext('fii/faa/foo.confml'),'confml')
+
+    def test_get_ext_without_ext(self):
+        self.assertEquals(utils.resourceref.get_ext('fii/faa/foo'),'')
+
+    def test_get_filename(self):
+        self.assertEquals(utils.resourceref.get_filename('fii/faa/foo.confml'),'foo.confml')
+
+    def test_get_filename_without_filename(self):
+        self.assertEquals(utils.resourceref.get_filename('fii/faa/'),'')
+
+    def test_get_filename_with_onepart(self):
+        self.assertEquals(utils.resourceref.get_filename('fii'),'fii')
+
+    def test_get_path(self):
+        self.assertEquals(utils.resourceref.get_path('fii/faa/foo.confml'),'fii/faa')
+
+    def test_get_path_without_filename(self):
+        self.assertEquals(utils.resourceref.get_path('fii/faa/'),'fii/faa')
+
+    def test_get_path_with_onepart(self):
+        self.assertEquals(utils.resourceref.get_path('fii'),'')
+
+    def test_to_dottedref(self):
+        self.assertEquals(utils.resourceref.to_dottedref('fii/faa/foo.confml'),'fii_faa_foo')
+
+    def test_to_dottedref_from_single_elem(self):
+        self.assertEquals(utils.resourceref.to_dottedref('fii'),'fii')
+
+    def test_to_dottedref_from_dotted(self):
+        self.assertEquals(utils.resourceref.to_dottedref('fii.faa.foo'),'fii.faa')
+
+    def test_to_dottedref_with_ext(self):
+        self.assertEquals(utils.resourceref.to_dottedref('.metadata'),'metadata')
+
+    def test_to_objref_dotted_start(self):
+        self.assertEquals(utils.resourceref.to_objref('../foo/bar/test.confml'),'____foo__bar__test_confml')
+
+    def test_to_objref_dot_in_name_start(self):
+        self.assertEquals(utils.resourceref.to_objref('/foo.bar/test.confml'),'_foo_bar_test_confml')
+
+    def test_to_objref_number_in_name_start(self):
+        self.assertEquals(utils.resourceref.to_objref('_1.0.test_one'),'_1_0_test_one')
+        self.assertEquals(utils.resourceref.to_objref('0.test_one'),'_0_test_one')
+        self.assertEquals(utils.resourceref.to_objref('1.0.test_one'),'_1_0_test_one')
+
+    def test_to_objref_unicode(self):
+        self.assertEquals(utils.resourceref.to_objref(u'fooäbar'),'foo_bar')
+        self.assertEquals(utils.resourceref.to_objref(u'foo:bar-testöne'),'foo_bar_test_ne')
+        self.assertEquals(utils.resourceref.to_objref('foo1.1test.confml'),'foo1_1test_confml')
+        self.assertEquals(utils.resourceref.to_objref('sub:417-48964:_hw_drv:_display_driver_common_features_-_thermal_event_handling_in_rdisplaykernel_and_thermal_management_for_display_module_behind_feature_flag'),
+                          'sub_417_48964__hw_drv__display_driver_common_features___thermal_event_handling_in_rdisplaykernel_and_thermal_management_for_display_module_behind_feature_flag')
+
+    def test_to_objref_dot_in_name_start(self):
+        self.assertEquals(utils.resourceref.to_objref('/foo.bar/test.confml'),'__foo_bar__test_confml')
+
+    def test_to_hash_dotted_start(self):
+        self.assertEquals(utils.resourceref.to_hash('../foo/bar/test.confml'),'0x5a063087')
+        self.assertEquals(utils.resourceref.to_hash('../foo/bar/test.confml'),'0x5a063087')
+
+    def test_to_hash(self):
+        self.assertEquals(utils.resourceref.to_hash('../fo.o/number.txt'),'-0x1b381b13')
+
+    def test_to_dref(self):
+        self.assertEquals(utils.resourceref.to_dref('fii/faa/foo.confml'),'fii.faa.foo')
+
+    def test_to_dref_with_ext(self):
+        self.assertEquals(utils.resourceref.to_dref('.metadata'),'metadata')
+
+    def test_to_dref_from_single_elem(self):
+        self.assertEquals(utils.resourceref.to_dref('fii'),'fii')
+
+    def test_to_dref_from_dotted(self):
+        self.assertEquals(utils.resourceref.to_dref('fii.faa.foo'),'fii.faa')
+
+class TestUtils(unittest.TestCase):    
+    def test_distinct_array_with_single_values(self):
+        self.assertEquals(utils.distinct_array(['1','2','1','1']),['1','2'])
+
+    def test_distinct_array_with_single_values(self):
+        self.assertEquals(utils.distinct_array(['1','2','3','1','2','4']),['1','2','3','4'])
+
+    def test_list_files_from_testdata(self):
+        files = utils.list_files(testdata)
+        self.assertTrue(files[0].endswith('scrot.txt'))
+        self.assertTrue(files[1].endswith('test.txt'))
+
+    def test_list_files_from_current_dir(self):
+        files = utils.list_files('.')
+        self.assertTrue(len(files)>0)
+
+    def test_pathmatch_with_same_path(self):
+        self.assertEquals(utils.pathmatch('test.foo','test.foo'),True)
+
+    def test_pathmatch_with_diff_path(self):
+        self.assertEquals(utils.pathmatch('test.bar','test.foo'),False)
+
+    def test_pathmatch_with_star(self):
+        self.assertEquals(utils.pathmatch('test.foo.*','test.foo.bar'),True)
+
+    def test_pathmatch_with_star(self):
+        self.assertEquals(utils.pathmatch('test.foo.*','test.foo.bar.fiba'),False)
+
+    def test_pathmatch_with_twostar(self):
+        self.assertEquals(utils.pathmatch('test.foo.**','test.foo.bar.fiba'),True)
+
+    def test_filter_objs_ref(self):
+        obj = T("com.nokia.foo.bar")
+        filters = []
+        filters.append(lambda x: re.match(".*nokia.*", x.str))
+        self.assertEquals(utils.filter(obj,filters),True)
+
+    def test_filter_objs_ref_not(self):
+        obj = T("foo.bar")
+        filters = []
+        filters.append(lambda x: re.match("foo$", x.str))
+        self.assertEquals(utils.filter(obj,filters),False)
+
+    def test_filter_objs_type(self):
+        obj = T()
+        filters = []
+        filters.append(lambda x: isinstance(x,T))
+        self.assertEquals(utils.filter(obj,filters),True)
+
+    def test_filter_objs_type_not(self):
+        class F(object): pass
+        obj = T()
+        filters = []
+        filters.append(lambda x: isinstance(x,F))
+        self.assertEquals(utils.filter(obj,filters),False)
+
+class TestDottedRefs(unittest.TestCase):
+    def test_join_two_refs(self):
+        self.assertEquals(utils.dottedref.join_refs(['foo.bar.test','fancy.ref']),'foo.bar.test.fancy.ref')
+
+    def test_join_three_refs(self):
+        self.assertEquals(utils.dottedref.join_refs(['foo.bar.test','fancy.ref','test1.12']),'foo.bar.test.fancy.ref.test1.12')
+
+    def test_join_two_refs_with_empty_first_ref(self):
+        self.assertEquals(utils.dottedref.join_refs(['','fancy.ref']),'fancy.ref')
+
+    def test_join_two_refs_with_empty_last_ref(self):
+        self.assertEquals(utils.dottedref.join_refs(['fancy.ref','']),'fancy.ref')
+
+    def test_join_two_refs_with_two_emtpy_refs(self):
+        self.assertEquals(utils.dottedref.join_refs(['','']),'')
+
+    def test_join_three_refs_with_empty(self):
+        self.assertEquals(utils.dottedref.join_refs(['foo.bar.test','','test1.12']),'foo.bar.test.test1.12')
+
+    def test_split_ref_with_tree_elems(self):
+        self.assertEquals(utils.dottedref.split_ref('aaa.bbb.ccc'),['aaa','bbb','ccc'])
+
+    def test_split_ref_with_empty_elem(self):
+        self.assertEquals(utils.dottedref.split_ref(''),[])
+
+    def test_split_ref_with_empty_elem_between(self):
+        self.assertEquals(utils.dottedref.split_ref('aaa..bbb'),['aaa','bbb'])
+
+    def test_psplit_ref_with_tree_elems(self):
+        self.assertEquals(utils.dottedref.psplit_ref('aaa.bbb.ccc'),('aaa.bbb','ccc'))
+
+    def test_psplit_ref_with_two_elems(self):
+        self.assertEquals(utils.dottedref.psplit_ref('aaa.bbb'),('aaa','bbb'))
+
+    def test_psplit_ref_with_one_elems(self):
+        self.assertEquals(utils.dottedref.psplit_ref('aaa'),('','aaa'))
+
+    def test_psplit_ref_with_empty_elem(self):
+        self.assertEquals(utils.dottedref.psplit_ref(''),('',''))
+
+    def test_ref2filter_with_one_elem(self):
+        self.assertEquals(utils.dottedref.ref2filter('test'),'test$')
+
+    def test_ref2filter_with_two_elems(self):
+        self.assertEquals(utils.dottedref.ref2filter('test.foo'),'test\.foo$')
+
+    def test_ref2filter_with_three_elems(self):
+        self.assertEquals(utils.dottedref.ref2filter('test.foo.bar'),'test\.foo\.bar$')
+
+    def test_ref2filter_with_one_star(self):
+        self.assertEquals(utils.dottedref.ref2filter('*'),'[^\.]*$')
+
+    def test_ref2filter_with_two_elems_one_star(self):
+        self.assertEquals(utils.dottedref.ref2filter('test.foo.*'),'test\.foo\.[^\.]*$')
+
+    def test_ref2filter_with_two_elems_two_stars(self):
+        self.assertEquals(utils.dottedref.ref2filter('test.foo.*'),'test\.foo\.[^\.]*$')
+
+    def test_remove_extension(self):
+        self.assertEquals(utils.dottedref.remove_last('fii/foo.dat'),'fii/foo')
+
+    def test_remove_last_elem(self):
+        self.assertEquals(utils.dottedref.remove_last('fii.foo.faa.dat'),'fii.foo.faa')
+
+    def test_remove_last_elem_from_single(self):
+        self.assertEquals(utils.dottedref.remove_last('fii'),'fii')
+
+    def test_get_last_elem_from_single(self):
+        self.assertEquals(utils.dottedref.get_last('fii'),'fii')
+
+    def test_get_last_elem_from_empty(self):
+        self.assertEquals(utils.dottedref.get_last(''),'')
+
+    def test_get_last_elem_from_multi(self):
+        self.assertEquals(utils.dottedref.get_last('fii.faa.foo'),'foo')
+
+    def test_remove_begin_dot_without(self):
+        self.assertEquals(utils.dottedref.remove_begin_dot('data.folder.siitake'),
+                                                               'data.folder.siitake')
+
+    def test_remove_beging_dot_with(self):
+        self.assertEquals(utils.dottedref.remove_begin_dot('.data.folder.siitake'),
+                                                        'data.folder.siitake')
+
+    def test_get_list_index(self):
+        self.assertEquals(utils.dottedref.get_index('data[0]'),0)
+
+    def test_get_list_with_long_index(self):
+        self.assertEquals(utils.dottedref.get_index('data[123]'),123)
+
+    def test_get_list_index_with_no_index(self):
+        self.assertEquals(utils.dottedref.get_index('data'),None)
+
+    def test_get_name_with_index(self):
+        self.assertEquals(utils.dottedref.get_name('data[0]'),'data')
+
+    def test_get_name_normal(self):
+        self.assertEquals(utils.dottedref.get_name('data'),'data')
+        
+    def test_extract_delimited_tokens(self):
+        def check(expected, string, delimiters=None):
+            if delimiters != None:  actual = utils.extract_delimited_tokens(string, delimiters)
+            else:                   actual = utils.extract_delimited_tokens(string)
+            self.assertEquals(expected, actual)
+        
+        check([], '')
+        check(['x'], '${x}')
+        check(['x'], '@{x}', delimiters=('@{', '}'))
+        check(['my.ref1', 'my.ref2'],"test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
+        check(['my.ref1', 'my\nmultiline\nref'],"test1 ${my.ref1} test2 ${ my.ref1 } ${my\nmultiline\nref}")
+        check(['my.ref1', 'my.ref2', u'????????.????????'], u"test1 ${my.ref1} test2 ${ my.ref2 } ${????????.????????}")
+    
+    def test_extract_delimited_token_tuples(self):
+        def check(expected, string, delimiters=None):
+            if delimiters != None:  actual = utils.extract_delimited_token_tuples(string, delimiters)
+            else:                   actual = utils.extract_delimited_token_tuples(string)
+            self.assertEquals(expected, actual)
+        
+        check([], '')
+        check([('x', '${x}')], '${x}')
+        check([('x', '@{x}')], '@{x}', delimiters=('@{', '}'))
+        check([('my.ref1', '${my.ref1}'), ('my.ref1', '${ my.ref1 }'), ('my.ref2', '${my.ref2}')],
+              "test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2} yeah ${my.ref2}")
+        check([('my.ref1', '${my.ref1}'), ('my.ref1', '${ my.ref1 }'), ('my\nmultiline\nref', '${my\nmultiline\nref}')],
+              "test1 ${my.ref1} test2 ${ my.ref1 } ${my\nmultiline\nref}")
+        check([('my.ref1', '${my.ref1}'), ('my.ref2', '${ my.ref2 }'), (u'????????.????????', u'${????????.????????}')],
+              u"test1 ${my.ref1} test2 ${ my.ref2 } ${????????.????????}")
+    
+    def test_expand_delimited_tokens(self):
+        def check(expected, string, delimiters=None):
+            def expand(ref, index):
+                return "<%d: %s>" % (index, ref)
+            if delimiters != None:  actual = utils.expand_delimited_tokens(string, expand, delimiters)
+            else:                   actual = utils.expand_delimited_tokens(string, expand)
+            self.assertEquals(expected, actual)
+        
+        check('test', 'test')
+        check('<0: x>', '${x}')
+        check('<0: x>', '@{x}', delimiters=('@{', '}'))
+        check('<0: x>  <1: y> <0: x>', '${x}  ${y} ${ x }')
+        check(u'<0: my.ref1>  test <1: ????????.????????>', u'${ my.ref1 }  test ${????????.????????}')
+        check('<0: my.ref1>  test <1: my\nmultiline\nref>', '${ my.ref1}  test ${my\nmultiline\nref}')
+    
+    def test_expand_refs_by_default_view(self):
+        VALUES = {'Test.Color'  : 'brown',
+                  'Test.Animal1': 'fox',
+                  'Test.Animal2': 'dog'}
+        class DummyFeature(object):
+            def __init__(self, ref):
+                self.ref = ref
+            def get_original_value(self):
+                return VALUES[self.ref]
+        class DummyDefaultView(object):
+            def get_feature(self, ref):
+                if ref in VALUES: return DummyFeature(ref)
+                else:             raise exceptions.NotFound()
+        dview = DummyDefaultView()
+        
+        result = utils.expand_refs_by_default_view(
+            "The quick ${Test.Color} ${Test.Animal1} jumps over the lazy ${Test.Animal2}.",
+            dview)
+        self.assertEquals(result, "The quick brown fox jumps over the lazy dog.")
+        
+        # Test expanding with a non-existent ref
+        result = utils.expand_refs_by_default_view(
+            "The quick ${Test.Color} ${Test.Foo} jumps over the lazy ${Test.Animal2}.",
+            dview)
+        self.assertEquals(result, "The quick brown  jumps over the lazy dog.")
+        
+        # Test expanding with a non-existent ref and a custom default value
+        result = utils.expand_refs_by_default_view(
+            "The quick ${Test.Color} ${Test.Foo} jumps over the lazy ${Test.Animal2}.",
+            dview,
+            default_value_for_missing = 'giraffe')
+        self.assertEquals(result, "The quick brown giraffe jumps over the lazy dog.")
+        
+
+class TestUtilsSubclasses(unittest.TestCase):    
+
+    def setUp(self):
+        pass
+
+    def test_all_subclasses_with_none(self):
+        class base(object): pass
+        classnames = utils.all_subclasses(base)
+        self.assertEquals(len(classnames),0)
+
+    def test_all_subclasses_class_tree(self):
+        class base(object): pass
+        class class1(base): pass
+        class class2(base): pass
+        class class12(class1): pass
+        class class123(class2): pass
+        classnames = utils.all_subclasses(base)
+        self.assertEquals(len(classnames),4)
+
+class TestUtilsDataMapRef(unittest.TestCase):    
+
+    def setUp(self):
+        pass
+
+    def test_get_feature_ref(self):
+        map = "foo/bar[@key='key 1']"
+        ref = utils.DataMapRef.get_feature_ref(map)
+        self.assertEquals(ref,'foo/bar')
+
+    def test_get_key_value(self):
+        map = "foo/bar[@key='key 1']"
+        value = utils.DataMapRef.get_key_value(map)
+        self.assertEquals(value,'key 1')
+
+
+class TestMakeList(unittest.TestCase):
+    def test_get_list_string(self):
+        self.assertEquals(utils.get_list('test'), ['test'])
+
+    def test_get_list_from_list(self):
+        self.assertEquals(utils.get_list(['test']), ['test'])
+
+    def test_get_list_from_list2(self):
+        self.assertEquals(utils.get_list(['test','test2']), ['test','test2'])
+
+    def test_is_list(self):
+        self.assertEquals(utils.is_list(['test','test2']), True)
+
+    def test_is_list_false(self):
+        self.assertEquals(utils.is_list('test'), False)
+
+    def test_add_list_with_list(self):
+        self.assertEquals(utils.add_list(['test','test2'], 'foo'), ['test','test2','foo'])
+
+    def test_add_list_with_none(self):
+        self.assertEquals(utils.add_list([], 'foo'), ['foo'])
+
+    def test_add_list_with_string(self):
+        self.assertEquals(utils.add_list('bar', 'foo'), ['bar','foo'])
+
+    def test_add_list_with_string2(self):
+        self.assertEquals(utils.add_list(['bar','test'], 'foo'), ['bar','test','foo'])
+
+    def test_prepend_list_with_none(self):
+        self.assertEquals(utils.prepend_list([], 'foo'), ['foo'])
+
+    def test_prepend_string_with_string(self):
+        self.assertEquals(utils.prepend_list('bar', 'foo'), ['foo','bar'])
+
+    def test_prepend_list_with_string(self):
+        self.assertEquals(utils.prepend_list(['bar','test'], 'foo'), ['foo','bar','test'])
+
+from cone.confml import model as confmlmodel
+        
+class TestModelGetters(unittest.TestCase):
+    def test_get_module_specific_class(self):
+        cls = utils.get_class(confmlmodel,api.Configuration)
+        self.assertEquals(cls, confmlmodel.ConfmlConfiguration)
+
+    def test_get_module_specific_class_with_None_model(self):
+        cls = utils.get_class(None,api.Configuration)
+        self.assertEquals(cls, api.Configuration)
+
+class TestXmlUtilFunctions(unittest.TestCase):
+    def test_split_tag_namespace(self):
+        self.assertEquals(
+            utils.xml.split_tag_namespace("test"),
+            (None, 'test'))
+        
+        self.assertEquals(
+            utils.xml.split_tag_namespace("{http://www.test.com/xml/1}test"),
+            ('http://www.test.com/xml/1', 'test'))
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_valueset.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,129 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test sets
+"""
+import unittest
+import sets
+import sys
+import os
+import __init__
+
+from cone.public import api,exceptions,utils
+
+
+class TestOption(unittest.TestCase):
+    def test_create_option(self):
+        elem = api.Option('test','123')
+        self.assertTrue(elem)
+        self.assertTrue(elem.get_name(),'test')
+        self.assertTrue(elem.get_value(),'123')
+
+    def test_option_compare(self):
+        elem1 = api.Option('test','1')
+        elem2 = api.Option('foo','2')
+        elem3 = api.Option('test','3')
+        self.assertFalse(elem1==elem2)
+        self.assertFalse(elem1==elem3)
+        self.assertTrue(elem1=='opt_value_1')
+        self.assertTrue(elem2=='opt_value_2')
+        self.assertTrue('opt_value_2' == elem2)
+
+class TestSets(unittest.TestCase):    
+
+    def test_create_set(self):
+        ss = api.ValueSet([1,3,4])
+        self.assertTrue(1 in ss)
+        self.assertFalse(2 in ss)
+        self.assertTrue(3 in ss)
+        self.assertTrue(4 in ss)
+        self.assertFalse(5 in ss)
+
+    def test_create_set_with_range(self):
+        r = range(0,100000)
+        ss = api.ValueSet(r)
+        for i in r:
+            self.assertTrue(i in ss)
+        self.assertFalse(12345678 in ss)
+        self.assertFalse(-1 in ss)
+        self.assertFalse('test' in ss)
+
+    def test_set_union(self):
+        ss1 = api.ValueSet([1,3,4])
+        ss2 = api.ValueSet([2,5,6])
+        ss3 = ss1.union(ss2)
+        self.assertFalse(0 in ss3)
+        self.assertTrue(1 in ss3)
+        self.assertTrue(2 in ss3)
+        self.assertTrue(3 in ss3)
+        self.assertTrue(4 in ss3)
+        self.assertTrue(5 in ss3)
+        self.assertTrue(6 in ss3)
+    
+    def test_set_intersection(self):
+        ss1 = api.ValueSet([1,2,3,4])
+        ss2 = api.ValueSet([2,5,6])
+        ss3 = ss1.intersection(ss2)
+        self.assertFalse(0 in ss3)
+        self.assertFalse(1 in ss3)
+        self.assertTrue(2 in ss3)
+        self.assertFalse(3 in ss3)
+        self.assertFalse(4 in ss3)
+        self.assertFalse(5 in ss3)
+        self.assertFalse(6 in ss3)
+
+
+class TestRange(unittest.TestCase):    
+    def test_create_integer_range(self):
+        r= api.ValueRange(1,100)
+        self.assertTrue(1 in r)
+        self.assertTrue(2 in r)
+        self.assertTrue(3 in r)
+        self.assertTrue(4 in r)
+        self.assertFalse(0 in r)
+        self.assertFalse(101 in r)
+
+class TestRegexp(unittest.TestCase):    
+    def test_create_regexp(self):
+        r= api.ValueRe('.*')
+        self.assertTrue('test' in r)
+        self.assertTrue('foo.foo' in r)
+        self.assertTrue('haahiis' in r)
+        self.assertTrue('1235' in r)
+
+    def test_create_regexp_allows_only_letters(self):
+        r= api.ValueRe('^[A-Za-z]*$')
+        self.assertTrue('test' in r)
+        self.assertFalse('foo.foo' in r)
+        self.assertTrue('haahiis' in r)
+        self.assertFalse('1235' in r)
+        self.assertTrue('Haaa' in r)
+
+    def test_create_regexp_allows_windows_drive(self):
+        r= api.ValueRe('^[A-Za-z]:$')
+        self.assertTrue('C:' in r)
+        self.assertFalse('foo.foo' in r)
+        self.assertTrue('h:' in r)
+        self.assertFalse('1235' in r)
+        self.assertFalse('Haaa' in r)
+
+    def test_create_regexp_allows_windows_path(self):
+        r= api.ValueRe('^[:\\\\A-Za-z1-9_\.]*$')
+        #self.assertTrue('C:' in r)
+        self.assertTrue('foo.foo' in r)
+        self.assertTrue('X:\\aaa\\bbb\ccc' in r)
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_views.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,208 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public import api,exceptions,utils
+
+class TestViews(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    def test_create_view(self):
+        view = api.View("view1")
+        self.assertTrue(view)
+        self.assertTrue(view.ref, "view1")
+
+    def test_view_add(self):
+        view = api.View("view1")
+        view._add(api.Group("Test"))
+        self.assertEquals(view._list(),['Test'])
+
+#    def test_view_add_child_incorrect_class(self):
+#        view = api.View("view1")
+#        try:
+#            view._add(api.Feature("Test"))
+#            self.fail("Adding incorrect class succeeds!")
+#        except exceptions.IncorrectClassError,e:
+#            pass
+
+#    def test_group_add_child_incorrect_class(self):
+#        group = api.Group("Group")
+#        try:
+#            group._add(api.Feature("Test"))
+#            self.fail("Adding incorrect class succeeds!")
+#        except exceptions.IncorrectClassError,e:
+#            pass
+
+#    def test_feature_add_child_incorrect_class(self):
+#        feature = api.Feature("Feature")
+#        try:
+#            feature._add(api.Group("Test"))
+#            self.fail("Adding incorrect class succeeds! This succeeds because of Base class support in model.")
+#        except exceptions.IncorrectClassError,e:
+#            pass
+
+    def test_feature_add(self):
+        feature = api.Feature("Feature")
+        feature._add(api.Feature("Test"))
+        self.assertEquals(feature._list(),['Test'])
+
+    def test_view_add_groups_and_features_and_list_all(self):
+        view = api.View("view1")
+        view._add(api.Group("group1"))
+        view._add(api.Group("group2"))
+        view._add(api._FeatureProxy("feature1"))
+        view.group1._add(api.Group("group21"))
+        view.group1.group21._add(api._FeatureProxy("feature211"))
+        view.group1.group21._add(api._FeatureProxy("feature212"))
+        view.feature1._add(api._FeatureProxy("feature11"))
+        self.assertEquals(sorted(view._list_traverse()),
+                          sorted(['group1', 
+                                           'group2', 
+                                           'feature1', 
+                                           'group1.group21', 
+                                           'group1.group21.feature211', 
+                                           'group1.group21.feature212', 
+                                           'feature1.feature11']))
+
+    def test_view_add_groups_and_features_and_list_features(self):
+        view = api.View("view1")
+        view._add(api.Group("group1"))
+        view._add(api.Group("group2"))
+        view._add(api._FeatureProxy("feature1"))
+        view.group1._add(api.Group("group21"))
+        view.group1.group21._add(api._FeatureProxy("feature211"))
+        view.group1.group21._add(api._FeatureProxy("feature212"))
+        view.feature1._add(api._FeatureProxy("feature11"))
+        self.assertEquals(sorted(view.list_all_features()),
+                          sorted(['feature1', 
+                                          'group1.group21.feature211', 
+                                          'group1.group21.feature212', 
+                                          'feature1.feature11']))
+
+
+    def test_view_add_features_with_view_add_feature(self):
+        view = api.View("view1")
+        view.add_feature(api.Feature("feature1"))
+        view.add_feature(api.Feature("feature2"), "com.nokia.s60")
+        view.com.nokia.s60.feature2.add_feature(api.Feature("feature21"))
+        self.assertEquals(sorted(view.list_all_features()),
+                          sorted(['feature1', 
+                                          'com.nokia.s60.feature2', 
+                                          'com.nokia.s60.feature2.feature21', 
+                                          ]))
+
+
+    def test_view_add_features_and_get_features(self):
+        view = api.View("view1")
+        view.add_feature(api.Feature("feature1"))
+        view.add_feature(api.Feature("feature2"), "com.nokia.s60")
+        view.com.nokia.s60.feature2.add_feature(api.Feature("feature21"))
+        self.assertEquals(view.get_feature("com.nokia.s60.feature2"), view.com.nokia.s60.feature2)
+
+    def test_view_get_features(self):
+        view = api.View("view1")
+        view.add_feature(api.Feature("feature1",type='boolean'))
+        view.add_feature(api.Feature("feature2"))
+        view.add_feature(api.Feature("feature11", type='boolean'),"feature1")
+        view.add_feature(api.Feature("feature12"),"feature1")
+        self.assertEquals(view.get_features("feature2"), [view.feature2])
+        self.assertEquals(view.get_features("feature2.*"), [])
+        self.assertEquals(view.get_features("feature1.*"), [view.feature1.feature11, view.feature1.feature12])
+        self.assertEquals(view.get_features("feature1.*", name='feature11'), [view.feature1.feature11])
+        self.assertEquals(view.get_features("**", filters=[lambda x: x.get_type()=='boolean']), 
+                          [view.feature1,
+                           view.feature1.feature11])
+
+    def test_view_add_features_and_remove_features(self):
+        view = api.View("view1")
+        view.add_feature(api.Feature("feature1"))
+        view.add_feature(api.Feature("feature2"), "com.nokia.s60")
+        view.com.nokia.s60.feature2.add_feature(api.Feature("feature21"))
+        
+        self.assertEquals(view.list_all_features(),['feature1', 'com.nokia.s60.feature2', 'com.nokia.s60.feature2.feature21'])
+        self.assertEquals(view.get_group("com.nokia.s60").list_features(),['feature2'])
+        for fearef in view.list_features():
+            view.remove_feature(fearef)
+        self.assertEquals(view.list_all_features(),['com.nokia.s60.feature2', 'com.nokia.s60.feature2.feature21'])
+
+    def test_view_add_groups_remove_groups(self):
+        view = api.View("view1")
+        view.add_group("Group one")
+        view.add_group("Group two")
+        view.add_feature(api.Feature("feature2"),"Group one")
+        self.assertEquals(view.list_groups(),['Group one',  'Group two'])
+        view.remove_group("Group two")
+        self.assertEquals(view.list_groups(),['Group one'])
+        view.get_group('Group one').add_feature(api.Feature("testing"))
+        self.assertEquals(view.get_group('Group one').list_features(),['feature2','testing'])
+        self.assertEquals(view.list_all_features(),['Group one.feature2', 'Group one.testing'])
+        view.remove_group("Group one")
+        self.assertEquals(view.list_groups(),[])
+        self.assertEquals(view.list_features(),[])
+
+    def test_view_add_featurelink(self):
+        view = api.View("view1")
+        view.add_group("Group one")
+        view.add_group("Group two")
+        view.add_feature(api.Feature("feature2"),"Group one")
+        self.assertEquals(view.list_groups(),['Group one',  'Group two'])
+        view.remove_group("Group two")
+        #view.add(api.FeatureGroup('foo.*'))
+        self.assertEquals(view.list_groups(),['Group one'])
+        view.get_group('Group one').add(api.FeatureLink("testing"))
+        g1 = view.get_group('Group one')
+        self.assertEquals(g1.list_features(),['feature2'])
+        self.assertEquals(view.list_all_features(),['Group one.feature2'])
+        view.remove_group("Group one")
+
+        self.assertEquals(view.list_groups(),[])
+        self.assertEquals(view.list_features(),[])
+
+    def compareview(self,view1,view2):
+        self.assertEquals(view1.ref, view2.ref)
+        self.assertEquals(view1.container, view2.container)
+        self.assertEquals(view1.name, view2.name)
+        self.assertEquals(view1.support_data, view2.support_data)
+
+
+    def test_clone_view_with_featurelink(self):
+        view1 = api.View("view1")
+        view1.add_group("Group one")
+        view1.add_group("Group two")
+        view1.get_group('Group one').add(api.FeatureLink("testing"))
+        fea2 = api.Feature("feature2")
+        view1.add_feature(fea2,"Group one")
+        view1.add_feature(api.Feature("feature3"),"Group one")
+        self.assertEquals(view1.list_groups(),['Group one',  'Group two'])
+        
+        view2 = view1._clone(recursion=True)
+        self.compareview(view1,view2)
+        self.assertEquals(view2.list_groups(),['Group one',  'Group two'])
+        self.assertEquals(view2.get_group('Group one')._list(),['testing', 'feature2', 'feature3'])
+        #self.assertEquals(view2.get_group('Group one').feature2._obj, fea2)
+        
+        
+if __name__ == '__main__':
+      unittest.main()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/tests/unittest_xml_parsing.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,130 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os
+import unittest
+import StringIO
+import __init__
+
+from cone.public import utils, exceptions
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class ElementTreeBackendTester(object):
+    """
+    Base tester class that contains all test cases.
+    
+    The actual test case classes derive from this and set the
+    class attributes BACKEND_ID and LINE_NUMBERS.
+    """
+    
+    DATA = u"""<?xml version="1.0" encoding="UTF-8"?>
+            <root xmlns="http://www.test.com/xml/1">
+                <!-- Comment -->
+                <elem1 attr1="test" attr2="test 2"/>
+                <elem2>カタカナ</elem2>
+                <elem3>
+                    <!-- Comment 2 -->
+                    some text
+                </elem3>
+            </root>""".encode('utf-8')
+    
+    # ID of the ElementTree back-end to use in the tests
+    BACKEND_ID = None
+    
+    # Whether to check if line numbers in elements are correct or None
+    LINE_NUMBERS = False
+    
+    def setUp(self):
+        self.orig_backend_id = utils.etree.get_backend_id()
+        utils.etree.set_backend_id(self.BACKEND_ID)
+    
+    def tearDown(self):
+        utils.etree.set_backend_id(self.orig_backend_id)
+    
+    def assert_lineno_equals(self, actual, expected):
+        if self.LINE_NUMBERS:
+            self.assertEquals(actual, expected)
+        else:
+            self.assertEquals(actual, None)
+    
+    def test_correct_parser_set(self):
+        self.assertEquals(utils.etree.get_backend_id(), self.BACKEND_ID)
+    
+    def test_fromstring_successful(self):
+        root = utils.etree.fromstring(self.DATA)
+        self.assertEquals(root.tag, '{http://www.test.com/xml/1}root')
+        children = [e for e in root]
+        self.assertEquals(len(children), 3)
+        self.assertEquals(children[0].tag, '{http://www.test.com/xml/1}elem1')
+        self.assertEquals(children[1].tag, '{http://www.test.com/xml/1}elem2')
+        self.assertEquals(children[2].tag, '{http://www.test.com/xml/1}elem3')
+        self.assertEquals(children[1].text, u'カタカナ')
+        
+        self.assert_lineno_equals(utils.etree.get_lineno(root), 2)
+        self.assert_lineno_equals(utils.etree.get_lineno(children[0]), 4)
+        self.assert_lineno_equals(utils.etree.get_lineno(children[1]), 5)
+        self.assert_lineno_equals(utils.etree.get_lineno(children[2]), 6)
+    
+    def test_tostring_ascii(self):
+        root = utils.etree.fromstring(self.DATA)
+        output = utils.etree.tostring(root)
+    
+    def test_tostring_utf_8(self):
+        root = utils.etree.fromstring(self.DATA)
+        output = utils.etree.tostring(root, 'UTF-8')
+    
+    def test_tostring_utf_16(self):
+        root = utils.etree.fromstring(self.DATA)
+        output = utils.etree.tostring(root, 'UTF-16')
+    
+    def test_fromstring_failed(self):
+        data = """<?xml version="1.0" encoding="UTF-8"?>
+            <root xmlns="http://www.test.com/xml/1">
+                <elem1 attr1="test" attr2="test 2"/>
+                <elem2>testing</elem3>
+            </root>"""
+        try:
+            etree = utils.etree.fromstring(data)
+            self.fail("XmlParseError not raised!")
+        except exceptions.XmlParseError, e:
+            self.assertEquals(e.lineno, 4)
+
+# ============================================================================
+# Actual test cases
+# ============================================================================
+
+# NOTE:
+# The test classes MUST inherit the two super-classes in the order
+# (ElementTreeBackendTester, unittest.TestCase), or otherwise setUp() and
+# tearDown() will not be overridden correctly
+
+class TestElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
+    BACKEND_ID = utils.etree.BACKEND_ELEMENT_TREE
+    LINE_NUMBERS = True
+
+class TestCElementTreeBackend(ElementTreeBackendTester, unittest.TestCase):
+    BACKEND_ID = utils.etree.BACKEND_C_ELEMENT_TREE
+    LINE_NUMBERS = False
+
+class TestLxmlBackend(ElementTreeBackendTester, unittest.TestCase):
+    BACKEND_ID = utils.etree.BACKEND_LXML
+    LINE_NUMBERS = True
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/public/utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,621 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+import os
+import re
+import StringIO
+import tokenize
+import inspect
+import traceback
+import logging
+import imghdr
+from token import ENDMARKER, NAME, NUMBER, STRING
+import api
+import mimetypes
+import exceptions
+
+import _etree_wrapper
+etree = _etree_wrapper.ElementTreeWrapper()
+
+class resourceref(object):
+    """
+    Class container for set of resource reference related functions
+    """
+    @classmethod
+    def filter_resources(cls, resources, regexp):
+        """
+        Filter out all resources that do not match the given regexp
+        @return a array of resources that match the given resource
+        """
+        test = re.compile(regexp, re.IGNORECASE)
+        return [r for r in resources if test.search(r)]
+    
+    @classmethod
+    def neg_filter_resources(cls, resources, regexp):
+        """
+        Filter out all resources that do match the given regexp
+        @return a array of resources that dont match the given resource
+        """
+        test = re.compile(regexp, re.IGNORECASE)
+        return [r for r in resources if not test.search(r)]
+
+    @classmethod
+    def insert_begin_slash(cls, ref):
+        if not ref.startswith('/'): 
+            return '/' + ref
+        return ref
+    
+    @classmethod
+    def remove_begin_slash(cls, ref):
+        if ref.startswith('/'): 
+            return ref.replace('/', '', 1)
+        return ref
+
+    @classmethod
+    def remove_end(self, path, str):
+        try:
+            (ret, sep, rest) = path.partition(str)
+            return ret
+        except ValueError:
+            return path
+
+    @classmethod
+    def add_end_slash(cls, ref):
+        if not ref.endswith('/'): 
+            return ref+'/'
+        return ref
+    
+    @classmethod
+    def remove_end_slash(cls, ref):
+        if ref.endswith('/'): 
+            return ref[:-1]
+        return ref
+    
+    @classmethod
+    def norm(cls, ref):
+        """
+        Normalize the reference to common cone form. 
+        1. Always with forward slashes 
+        2. no beginning slash
+        3. no end slash
+        @return: A normalized reference string
+        """
+        
+        # Do not modify emtpy string at all
+        if not ref == '':
+            normref = os.path.normpath(ref)
+            normref = normref.replace('\\','/').replace('"','').replace('//','/')
+        else:
+            normref = ref
+        return normref
+    
+    @classmethod
+    def replace_dir(cls, ref, frompart, topart):
+        """
+        Replace a part of directory beginning from ref.
+        @param ref: the resource reference
+        @param frompart: the part of directory name to be replaced
+        @param topart: the partial name which replaces the frompart
+        @return: a refenence with forward slashes
+        """
+        # Normalize all paths and replace the name with string replace
+        # 
+        normref = cls.norm(ref)
+        normfrom = cls.norm(frompart)
+        normto = cls.norm(topart)
+        # Add the end slash to from and to as it should be a dir (if not empty)
+        if normto != "": normto = cls.add_end_slash(normto)
+        if normfrom != "": normfrom = cls.add_end_slash(normfrom)
+        if normref != "": normref = cls.add_end_slash(normref)
+        retref = cls.norm(normref.replace(normfrom, normto, 1))
+        if retref  != "": retref = cls.remove_end_slash(retref)
+        return retref
+
+    @classmethod
+    def join_refs(cls, refs):
+        """
+        join a list of dotted references together with dots
+        1. ignore empty refs
+        2. no dot include begin dot
+        3. no dot include end dot
+        @param refs: a list of references
+        @return: A normalized dotted reference
+        """
+        # Create a copy of references without any empty strings
+        import posixpath
+        paramdict = {}
+        retref = posixpath.join(*refs)
+        #retref = "/".join([ref for ref in refs if ref != ''])
+        #subs = re.sub('/+', '/', retref)
+        return retref
+
+    @classmethod
+    def split_ref(cls, ref):
+        """
+        Replace a part of directory beginning from ref.
+        @param ref: the resource reference
+        @return: a list of path elems
+        """
+        return [r for r in ref.split('/') if r]
+    
+    @classmethod
+    def psplit_ref(cls, ref):
+        """
+        pop split that splits the last element of the array 
+        1. empty ref returns an empty list
+        @param ref: a resource references string (e.g. aaa/bbb/ccc.txt)
+        @return: A tuple of references (with given param ('aaa/bbb','ccc.txt')
+        """
+        refs = ref.rsplit('/', 1)
+        return ("".join(refs[0:-1]), refs[-1])
+
+    @classmethod
+    def remove_ext(cls, ref):
+        """
+        Remove file extension from ref 
+        1. remove file extension
+        @return: a reference. E.g. (foo/test.confml) => foo/test
+        """
+        filenameparts = cls.get_filename(ref).rsplit('.', 1)
+        path = cls.get_path(ref)
+        if len(filenameparts)==2 and filenameparts[0] != "":
+            return cls.join_refs([path, filenameparts[0]])
+        else:
+            return ref
+
+    @classmethod
+    def get_ext(cls, ref):
+        """
+        get file extension from ref 
+        1. get file extension
+        @return: a reference. E.g. (foo/test.confml) => confml
+        """
+        if len(ref.rsplit('.', 1)) == 2: 
+            return ref.rsplit('.', 1)[1]
+        else:
+            return ""
+
+    @classmethod
+    def get_filename(cls, ref):
+        """
+        get file name part from ref 
+        1. get file extension
+        @return: a reference. E.g. (foo/test.confml) => confml
+        """
+        return ref.rsplit('/', 1)[-1]
+
+    @classmethod
+    def get_path(cls, ref):
+        """
+        get file name part from ref 
+        1. get file extension
+        @return: a reference. E.g. (foo/test.confml) => confml
+        """
+        if len(ref.rsplit('/', 1)) == 2: 
+            return ref.rsplit('/', 1)[0]
+        else:
+            return ""
+
+    @classmethod
+    def to_dottedref(cls, ref):
+        """
+        Convert a resource ref to dotted ref 
+        1. remove file extension
+        2. convert path delims to dots
+        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
+        """
+        newref = cls.remove_ext(ref).replace('/', '_').replace(' ', '_')
+        return dottedref.remove_begin_dot(newref)
+
+
+    @classmethod
+    def to_objref(cls, ref):
+        """
+        Convert a resource ref to dotted ref 
+        1. remove file extension
+        2. convert path delims to dots
+        3. using double underscores for directory separation
+        @return: a dotted reference. E.g. (foo/test.confml) => foo_test
+        """
+        ref = ref.replace('/', '__')
+        newref = ''
+        first_token = True
+        try:
+            for toknum, tokval, spos, epos, _ in tokenize.generate_tokens(StringIO.StringIO(unicode(ref)).readline):
+                if toknum == ENDMARKER:
+                    break
+                elif toknum == NAME:
+                    newref += str(tokval)
+                elif toknum == NUMBER:
+                    # Add a character before the number token if the first token is a number
+                    if first_token:
+                        newref += '_'
+                    # replace a possible dot in number .123
+                    newref += str(tokval.replace('.','_'))
+                elif toknum == STRING:
+                    newref += str(tokval.replace('"', ''))
+                else:
+                    newref += '_'
+                # After first round set the first token to false
+                first_token = False
+        except tokenize.TokenError:
+            pass
+        return newref
+        
+    @classmethod
+    def to_dref(cls, ref):
+        """
+        Convert a resource ref to dotted ref 
+        1. remove file extension
+        2. convert path delims to dots
+        @return: a dotted reference. E.g. (foo/test.confml) => foo.test
+        """
+        return dottedref.remove_begin_dot(cls.remove_ext(ref).replace('/','.'))
+
+    @classmethod
+    def to_hash(cls, ref):
+        """
+        Convert a resource ref to to hash 32 bit integer
+        @return: 
+        """
+        return "%s" % hex(hash(ref))
+
+class dottedref(object):
+    """
+    Class container for set of dotted reference related functions
+    """
+    @classmethod
+    def join_refs(cls, refs):
+        """
+        join a list of dotted references together with dots
+        1. ignore empty refs
+        2. no dot include begin dot
+        3. no dot include end dot
+        @param refs: a list of references
+        @return: A normalized dotted reference
+        """
+        # Create a dotted reference without any empty strings
+        return '.'.join([ref for ref in refs if ref.strip()])
+    
+    @classmethod
+    def split_ref(cls, ref):
+        """
+        split a dotted references string to a list of ref elements
+        1. empty ref returns an empty list
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A list of references (with given param ['aaa','bbb','ccc']
+        """
+        # list of reference parts without any empty strings
+        return [r for r in ref.split('.') if r]
+    
+    @classmethod
+    def psplit_ref(cls, ref):
+        """
+        pop split that splits the last element of the array 
+        1. empty ref returns an empty list
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A tuple of references (with given param ('aaa.bbb','ccc')
+        """
+        refs = ref.rsplit('.', 1)
+        return ("".join(refs[0:-1]), refs[-1])
+    
+    @classmethod
+    def remove_last(cls, ref):
+        """
+        removes the last element of the ref 
+        1. empty ref returns an empty list
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A reference (with given param ('aaa.bbb')
+        """
+        return ref.rsplit('.', 1)[0]
+
+    @classmethod
+    def get_last(cls, ref):
+        """
+        returns the last element of the ref 
+        1. empty ref returns an empty string
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A reference (with given param ('ccc')
+        """
+        return ref.rsplit('.', 1)[-1]
+
+    @classmethod
+    def get_name(cls, ref):
+        """
+        returns the last element of the ref 
+        1. empty ref returns an empty string
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A reference (with given param ('ccc')
+        """
+        if re.match('^(.*)\[.*\]$', ref):
+            return re.match('^(.*)\[.*\]$', ref).group(1)
+        else:
+            return ref
+
+    @classmethod
+    def get_index(cls, ref):
+        """
+        returns the last element of the ref 
+        1. empty ref returns an empty string
+        @param ref: a dotted references string (e.g. aaa.bbb.ccc)
+        @return: A reference (with given param ('ccc')
+        """
+        if re.match('^.*\[(\d+)\]$', ref):
+            return int( re.match('^.*\[(\d+)\]$', ref).group(1) )
+        else:
+            return None
+
+    @classmethod
+    def remove_begin_dot(cls, ref):
+        """
+        removes all the dots from the begin of the ref 
+        @param ref: a dotted references string (e.g. .aaa.bbb.ccc)
+        @return: A reference (with given param ('aaa.bbb.ccc')
+        """
+        return ref.lstrip('.')
+
+    @classmethod
+    def ref2filter(cls, ref):
+        elems = []
+        for refelem in dottedref.split_ref(ref):
+            if refelem == "**":
+                elems.append(".*")
+            else:
+                elems.append(refelem.replace("*","[^\.]*"))
+        return "\\.".join(elems)+"$"
+    
+def extract_delimited_tokens(string, delimiters=('${', '}')):
+    """
+    Return a list of all tokens delimited by the given strings in the given string.
+    This function returns basically the first row of the result of
+    extract_delimited_token_tuples(), with duplicates removed.
+    
+    >>> dottedref.extract_refs("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
+    ['my.ref1', 'my.ref2']
+    """
+    ref_tuples = extract_delimited_token_tuples(string, delimiters)
+    return distinct_array([ref for ref, raw_ref in ref_tuples])
+
+def extract_delimited_token_tuples(string, delimiters=('${', '}')):
+    """
+    Extract a list of (token, raw_token) tuples from the given string.
+    'token' is the the token extracted from the string and trimmed (surrounding
+    whitespace removed), and raw_token is the unmodified match from the
+    string, which can be used for replacing.
+    
+    >>> dottedref.extract_ref_tuples("test1 ${my.ref1} test2 ${ my.ref1 } ${my.ref2}")
+    [('my.ref1', '${my.ref1}'), ('my.ref1', '${ my.ref1 }'), ('my.ref2', '${my.ref2}')]
+    """
+    pattern = '%s.*?%s' % (re.escape(delimiters[0]), re.escape(delimiters[1]))
+    matches = distinct_array(re.findall(pattern, string, re.DOTALL))
+    
+    result = []
+    for match in matches:
+        ref = match[len(delimiters[0]):-len(delimiters[1])].strip()
+        result.append((ref, match))
+    return result
+
+def expand_delimited_tokens(string, expander_func, delimiters=('${', '}')):
+    """
+    Expand all tokens in the given string using the given expander function.
+    
+    @param string: The string to expand.
+    @param expander_func: The function used for expanding. Should take two parameters:
+        1 - The token to expand.
+        2 - The index of the token in the string.
+    @param delimiters: Tuple specifying the delimiters for tokens.
+    @return: The expanded string.
+    """
+    # Collect a dictionary of token-entry pairs
+    class Entry(object):
+        pass
+    tokens = {}
+    for index, (token, raw_token) in enumerate(extract_delimited_token_tuples(string, delimiters)):
+        if token not in tokens:
+            entry = Entry()
+            entry.index = index
+            entry.raw_tokens = []
+            entry.value = unicode(expander_func(token, index))
+            tokens[token] = entry
+        else:
+            entry = tokens[token]
+        
+        entry.raw_tokens.append(raw_token)
+    
+    # Replace all tokens with the expanded values
+    result = string
+    for entry in tokens.itervalues():
+        for raw_token in entry.raw_tokens:
+            result = result.replace(raw_token, entry.value)
+    return result
+
+def expand_refs_by_default_view(string, default_view, delimiters=('${', '}'), default_value_for_missing=''):
+    """
+    Convenience function for expanding the refs in a string using setting values.
+    @param default_value_for_missing: The default value used if a setting for
+        a reference cannot be found.
+    @return: The expanded string.
+    """
+    def expand(ref, index):
+        try:
+            return default_view.get_feature(ref).get_original_value()
+        except exceptions.NotFound:
+            logging.getLogger('cone').error("Feature '%s' not found" % ref)
+            return default_value_for_missing
+    return expand_delimited_tokens(string, expand, delimiters)
+
+def distinct_array(arr):
+    newarray = []
+    for val in arr:
+        try:
+            # test to see whether the value already is in thearray
+            newarray.index(val)
+        except ValueError:
+            newarray.append(val)
+    return newarray
+
+
+def list_files(path):    
+    """
+    Get an array of files in a folder
+    """
+    retarray = []
+    # Walk through all files in the layer
+    path = os.path.abspath(path)
+    for root, dirs, files in os.walk(path):
+        for name in files:
+            entry = os.path.join(root, name)
+            entry = os.path.normpath(os.path.abspath(entry))
+            if os.path.isfile(entry):
+                retarray.append(entry)
+    return retarray
+
+def all_subclasses(classname):
+    """
+    @return: A list of all subclasses of classname
+    """
+    subclasses = classname.__subclasses__()
+    # Create copy of the subclasses list for the iteration, 
+    # so that added items are not recursed again
+    for subclass in classname.__subclasses__():
+        subclasses += all_subclasses(subclass)
+    return subclasses
+
+def pathmatch(pattern, refpath):
+    """
+    Check for matching pattern for a ref path
+    """
+    filter = dottedref.ref2filter(pattern)
+    return re.match(filter, refpath) != None
+
+def filter(obj, filters):
+    for filter in filters:
+        if not filter(obj):
+            return False
+    return True
+
+def get_list(elem):
+    if not isinstance(elem, list):
+        return [elem]
+    else:
+        return elem
+
+def add_list(elem, add):
+    retlist = get_list(elem)
+    retlist.append(add)
+    return retlist
+
+def prepend_list(elem, prepend):
+    retlist = get_list(elem)
+    retlist.insert(0, prepend)
+    return retlist
+
+def is_list(elem):
+    return isinstance(elem, list)
+
+def get_class(modelinstance, classinstance):
+    """
+    Get the actual model specific implementation class for a classinstance
+    """
+    for attr in dir(modelinstance):
+        modelclass = getattr(modelinstance, attr)
+        if inspect.isclass(modelclass): 
+            if issubclass(modelclass, classinstance):
+                return modelclass
+    return classinstance
+
+class DataMapRef(object):
+    """
+    Utility class for handling map attributes in data section
+    """
+    @classmethod
+    def get_feature_ref(cls, map):
+        index = map.find("@")
+        if index != -1:
+            parts = map.split("@")
+            return parts[0][:-1]
+        else:
+            return None
+        
+    @classmethod
+    def get_key_value(cls, map):
+        index = map.find("@")
+        if index != -1:
+            parts = map.split("@")
+            key = parts[1][:-1]
+            keys = key.split("=")
+            value = keys[1].strip()
+            return value[1:-1]
+        else:
+            return None
+        
+
+class xml(object):
+    """
+    Class container for set of XML-related helper functions.
+    """
+    
+    @classmethod
+    def split_tag_namespace(cls, xml_tag):
+        """
+        Split the given XML tag into a (namespace, tag) tuple.
+        
+        >>> ReaderBase._split_tag_namespace("test")
+        (None, 'test')
+        >>> ReaderBase._split_tag_namespace("{http://www.test.com/xml/1}test")
+        ('http://www.test.com/xml/1', 'test')
+        """
+        if xml_tag.startswith('{'):
+            parts = xml_tag[1:].split('}')
+            return (parts[0], parts[1])
+        else:
+            return (None, xml_tag)
+
+def log_exception(logger, msg, msg_level=logging.ERROR, traceback_level=logging.DEBUG):
+    """
+    Log an exception so that the given message and the exception's
+    traceback are logged separately with the given log levels.
+    
+    The purpose is to print minimal information to the user when running
+    the CLI (default level for STDOUT logging is WARNING), but the traceback
+    should still be available in the log file (which uses the level DEBUG
+    by default).
+    
+    Note that this function should be only used in an exception handler.
+    """
+    logger.log(msg_level, msg)
+    logger.log(traceback_level, traceback.format_exc())
+
+def make_content_info(resource, data):
+    """
+    Factory for ContentInfo
+    """
+    cnt_inf = None
+    
+    if resource != None:
+        guessed_type = mimetypes.guess_type(resource.get_path())
+        mimetype = None
+        mimesubtype = None
+        
+        if guessed_type != None:
+            mimetype, mimesubtype = guessed_type[0].split('/') 
+        
+        if mimetype == 'image' and mimesubtype == 'x-ms-bmp':
+            cnt_inf = api.BmpImageContentInfo(resource, data)
+        else:
+            cnt_inf = api.ContentInfo(mimetype, mimesubtype)
+    return cnt_inf
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,57 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+import os,sys,unittest
+from optparse import OptionParser, OptionGroup
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(ROOT_PATH,'..'))
+#sys.path.insert(0, os.path.join(ROOT_PATH,'../testautomation'))
+
+import cone.storage.tests
+import cone.core.tests
+import cone.confml.tests
+import cone.carbon.tests
+import cone.public.tests
+#from testautomation import testcli
+
+def collect_suite():
+    suite = unittest.TestSuite()
+    suite.addTests(cone.storage.tests.collect_suite())
+    suite.addTests(cone.core.tests.collect_suite())
+    suite.addTests(cone.confml.tests.collect_suite())
+    suite.addTests(cone.carbon.tests.collect_suite())
+    suite.addTests(cone.public.tests.collect_suite())
+    return suite
+
+if __name__ == '__main__':
+    import nose
+    setuptools_incompat = ('report', 'prepareTest',
+                           'prepareTestLoader', 'prepareTestRunner',
+                           'setOutputStream')
+
+    plugins = nose.plugins.manager.RestrictedPluginManager(exclude=setuptools_incompat)
+    allfiles = nose.config.all_config_files() + ['nose_unittests.cfg']
+    conf = nose.config.Config(files=allfiles,
+                  plugins=plugins)
+    conf.configure(argv=['collector'])
+    print "conf :", conf.include
+    nose.main(config=conf)
+
+#if __name__ == '__main__':
+#    testcli.run(collect_suite())
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys,os
+
+__all__ = ['resources','filestorage','zipstorage','stringstorage','webstorage']
+
+storages = ['filestorage','zipstorage','stringstorage','webstorage']
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/authenticate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,153 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+"""
+
+"""
+
+
+import getpass
+import urllib, urllib2
+import urlparse
+from HTMLParser import HTMLParser
+import sys
+import os
+import logging
+import re
+
+
+class SSOHTMLParser(HTMLParser):
+    """
+    Simple html parser which understand what is needed to show the current
+    version of the SSO login page. End parsing at <\html>, which is in
+    current version of login page inside <noscript> before other stuff on page.
+    Asks form inputs of types text and password from the user.
+    The data is saved in varables inside class
+    """
+    def __init__(self, *argv, **kwargs):
+        HTMLParser.__init__(self, *argv, **kwargs)
+        self.html_end = False
+        self.httpdata = {}
+        self.input_requested = False
+        self.input_entered = False
+        self.method = ''
+        self.action = ''
+        self.username = kwargs.get('username')
+        self.password = kwargs.get('password')
+        
+    def handle_starttag(self, tag, attrs):
+        attrs = dict(attrs)
+        if self.html_end:
+            return
+        if tag == 'br':
+            print
+        elif tag == 'form':
+            self.action = attrs.get('action')
+            self.method = attrs.get('method')
+        elif tag == 'input':
+            inputtype = attrs.get('type', 'text')
+            if inputtype == 'hidden':
+                # Should the username be also overridable
+                self.httpdata[attrs.get('name')] = attrs.get('value')
+            if inputtype == 'password':
+                self.input_requested = True
+                data = self.password
+                if data:
+                    self.input_entered = True
+                self.httpdata[attrs.get('name')] = data
+            if inputtype == 'text':
+                self.input_requested = True
+                data = raw_input()
+                if data:
+                    self.input_entered = True
+                self.httpdata[attrs.get('name')] = data
+            if inputtype == 'submit':
+                self.httpdata['submit'] = attrs.get('value')
+
+    def handle_endtag(self, tag):
+        if self.html_end:
+            return
+        if tag == 'tr':
+            print
+        if tag == 'title':
+            print
+        if tag == 'html':
+            self.html_end = True
+
+    def handle_data(self, data):
+        if self.html_end:
+            return
+        if data.strip():
+            print data.strip(),
+
+class CarbonAuthHandler(urllib2.AbstractHTTPHandler):
+    handler_order = 600
+    
+    def add_password(self, username, password):
+        """
+        Add username and password
+        """
+        self.username = username
+        self.password = password
+
+    def https_response(self, request, response):
+        """
+        Catches responses which are from sso login page and asks for the
+        information from the command line and posts it.
+        After posting urllib2 takes care of following redirects back to
+        original page.
+        """
+        if (re.match('login.*\.europe\.nokia\.com', request.get_host())):
+            sso_parser = SSOHTMLParser(username=self.username, password=self.password)
+            sso_parser.feed(response.read())
+            # !sso_parser.input_requested when we have posted the form and
+            # are reading the redirect back. We don't want to handle that
+            if sso_parser.input_requested:
+                if not sso_parser.input_entered:
+                    # By entering empty username and password you get
+                    # out of infinite invalid login loop
+                    # Only bad thing that the SSO login page doesen't
+                    # tell you that login failed, only shows the same text
+                    # again
+                    raise urllib2.URLError("No login data entered")
+                newurl = urlparse.urljoin(request.get_full_url(), sso_parser.action)
+                ssoreq = urllib2.Request(newurl,
+                                         urllib.urlencode(sso_parser.httpdata),
+                                         origin_req_host=request.get_origin_req_host(),
+                                         unverifiable=True,
+                                         )
+                return self.parent.open(ssoreq)
+        return response
+
+    def http_response(self, request, response):
+        """
+        Catches responses which are from normal carbon authenticatoin page and uses set password if found
+        or asks for the information from the command line and posts it.
+        After posting urllib2 takes care of following redirects back to
+        original page.
+        """    
+        if response.code == 200 and (re.match('.*/extauth/login/?.*', request.get_full_url())):
+            loginreq = urllib2.Request(request.get_full_url(),
+                                     urllib.urlencode({ 'username' : self.username, 
+                                                        'password' : self.password,
+                                                        'submit' : 'login'}
+                                                      ),
+                                     origin_req_host=request.get_origin_req_host(),
+                                     unverifiable=True,
+                                     )
+            return self.parent.open(loginreq)
+        else:            
+            return response
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/common.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,85 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import logging
+import xml.parsers.expat
+
+from cone.public import api, utils
+from cone.storage import metadata
+
+class StorageBase(api.Storage):
+    """
+    A general base class for all storage type classes
+    """
+    METADATA_FILENAME = ".metadata"
+
+    def __init__(self,path):
+        super(StorageBase, self).__init__(path)
+        self.meta = self.read_metadata()
+
+    def get_active_configuration(self): 
+        """
+        Return the active configuration. 
+        If the storage holds only one configuration, it will be always active  
+        """
+        root_confmls = self.list_resources("/")
+        root_confmls = utils.resourceref.filter_resources(root_confmls,"\.confml")
+        if self.meta.get_root_file() == '' and len(root_confmls) == 1:
+            return root_confmls[0]
+        else:
+            return self.meta.get_root_file()
+            
+
+    def set_active_configuration(self, ref):
+        self.meta.set_root_file(ref)
+
+    def read_metadata(self):
+        meta = None
+        if not self.is_resource(self.METADATA_FILENAME):
+            logging.getLogger('cone').info("No metadata found for: %s" % (self.get_path()))
+            # return empty metadata object
+            meta = metadata.Metadata()
+        else:
+            res = self.open_resource(self.METADATA_FILENAME)
+            try:
+                try:
+                    meta = metadata.MetadataReader().fromstring(res.read())
+                except xml.parsers.expat.ExpatError:
+                    """ in case of xml parsing error return empty metadata """
+                    meta = metadata.Metadata()
+            finally:
+                res.close()
+        return meta
+
+    def write_metadata(self):
+        # Try to update the metadata, which might fail on ZipStorage
+
+        try:
+            if self.get_mode(self.mode) != api.Storage.MODE_READ:
+                # update the active configuration
+                self.set_active_configuration(self.get_active_configuration())
+                metares = self.open_resource(self.METADATA_FILENAME,"wb")
+                metadata.MetadataWriter().toresource(self.meta,metares)
+                metares.close()
+        except Exception,e:
+            logging.getLogger('cone').error("Could not save metadata. Exception %s" % e)
+        return
+
+    def close(self):
+        if self.get_current_path() == "": 
+            self.write_metadata()
+        super(StorageBase, self).close()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/configurationpersistence.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,118 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from cone.public import persistence
+ 
+# list of namespaces supported. the first one in the list is always used in writing
+CONFIGURATION_NAMESPACES = ["http://www.s60.com/xml/confml/1"]
+INCLUDE_NAMESPACES       = ["http://www.w3.org/2001/xinclude","http://www.w3.org/2001/XInclude"]
+
+class ConfigurationReader(persistence.ConeReader):
+    """
+    Parses a single CPF configuration project root confml file. Parses the XInclude statements to 
+    find out the layers inside the project
+    """ 
+
+    class_type = "Configuration"
+
+    def __init__(self):
+        self.configuration_namespaces = CONFIGURATION_NAMESPACES
+        self.include_namespaces       = INCLUDE_NAMESPACES
+            
+    def fromstring(self, xml_as_string):
+        configuration = api.CompositeConfiguration(None)
+        etree = ElementTree.fromstring(xml_as_string)
+        configuration.desc = self.parse_desc(etree)
+        configuration.meta = self.parse_meta(etree)
+        configuration.set_name(self.parse_name(etree))
+        for inc in self.parse_includes(etree):
+            configuration.add_layer(inc)
+    
+        return configuration
+
+    def parse_includes(self,etree):
+        include_elems = []
+        include_elems.extend(etree.getiterator("{%s}include" % self.include_namespaces[0]))
+        include_elems.extend(etree.getiterator("{%s}include" % self.include_namespaces[1]))
+        includes = []
+        for inc in include_elems:
+            includes.append(inc.get('href').replace('#/',''))
+        return includes
+    
+    def parse_meta(self,etree):
+        meta_elem = etree.find("{%s}meta" % self.configuration_namespaces[0])
+        meta = {}
+        if meta_elem:      
+            # There must be a nicer way to do this!! :(
+            for elem in meta_elem.getiterator():
+                m = re.match("{.*}(?P<tagname>.*)",elem.tag)
+                if m and m.group('tagname') != 'meta':
+                    meta[m.group('tagname')] = elem.text 
+        return meta
+     
+    def parse_desc(self,etree):
+        desc = ""
+        desc_elem = etree.find("{%s}desc" % self.configuration_namespaces[0])
+        if desc_elem != None:
+            desc = desc_elem.text
+        return desc
+    
+    def parse_name(self,etree):
+        return etree.get("name")
+
+
+class ConfigurationWriter(persistence.ConeWriter):
+    """
+    Parses a single CPF configuration project root confml file. Parses the XInclude statements to 
+    find out the layers inside the project
+    """ 
+
+    class_type = "Configuration"
+
+    def __init__(self):
+        self.configuration_namespace = CONFIGURATION_NAMESPACES[0]
+        self.include_namespace       = INCLUDE_NAMESPACES[0]
+    
+    def tostring(self,configuration,indent=True):
+        root = ElementTree.Element("configuration")
+        root.set("xmlns",self.configuration_namespace)
+        root.set("xmlns:xi",self.include_namespace)
+        root.set("name",configuration.ref) 
+        root.append(self.to_desc(configuration.desc))
+        root.append(self.to_meta(configuration.meta))
+        for inc in configuration.list_layers():
+            root.append(self.to_include(inc))
+        if indent:
+            self.indent(root)
+        return ElementTree.tostring(root)
+ 
+    def to_desc(self,desc):
+        elem = ElementTree.Element("desc")
+        elem.text = desc
+        return elem 
+      
+    def to_meta(self,meta):
+        elem = ElementTree.Element("meta")
+        for key in meta.keys():
+            selem = ElementTree.SubElement(elem,key)
+            selem.text = meta[key]
+        return elem 
+    
+    def to_include(self,include):
+        elem = ElementTree.Element("xi:include")
+        elem.set("href",include)
+        return elem 
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/filestorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,350 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import re
+import logging
+import xml.parsers.expat
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImpotError:
+            from xml.etree import ElementTree
+            
+from cone.public import exceptions  
+from cone.public import api, utils
+#from cone.storage.configurationpersistence import ConfigurationReader, ConfigurationWriter
+from cone.storage import metadata, common
+from cone.confml import persistentconfml
+debug = 0
+
+class FileStorage(common.StorageBase):
+    """
+    A file system based implementation for Storage.
+    @param path : path to the storage folder
+    @param mode: the mode for the folder. Default is a=append that expects the folder to exist.
+    """
+    
+    def __init__(self,path,mode="r", **kwargs):
+        super(FileStorage, self).__init__(path)
+        self.logger = logging.getLogger('cone')
+        self.logger.debug("FileStorage path %s" % self.get_path())
+        self.persistentmodule = persistentconfml
+        self.mode = mode
+        if mode.find("a")!=-1 or mode.find("r")!=-1:
+            # check that the given folder exists and is a folder    
+            if not os.path.isdir(self.get_path()):
+                raise exceptions.StorageException("The given data folder for storage does not exist! %s" % self.get_path())
+        elif mode.find("w")!=-1:
+            # check if the given folder exists and create it if it does not
+            if not os.path.exists(os.path.abspath(self.get_path())):
+                os.makedirs(self.get_path())
+        else:
+            raise exceptions.StorageException("Unsupported creation mode given! %s" % mode)
+        
+        
+
+    @classmethod
+    def supported_storage(cls,path):
+        """
+        Class method for determing if the given clas supports a storage by given path. 
+        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
+        @param path:
+        @return: Boolean value. True if the storage of the path is supported. False if not.  
+        """
+        if path.startswith('http://'):
+            return False
+        path = os.path.abspath(path)
+        (name,ext) = os.path.splitext(path)
+        if path != "" and ext == "":
+            return True
+        elif os.path.isdir(path):
+            return True
+        else:
+            return False
+
+    def open_resource(self,path,mode="r"):
+        # make sure that path exists if we are creating a file
+        path = utils.resourceref.remove_end_slash(path)
+        path = utils.resourceref.remove_begin_slash(path)
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        fullpath = utils.resourceref.join_refs([self.get_path(),path])
+        if mode.find("w") != -1:
+            dirpath = os.path.dirname(fullpath)
+            if not os.path.exists(dirpath):
+                os.makedirs(dirpath)
+        try:
+            res = FileResource(self,path,mode,open(fullpath,mode)) 
+            self.__opened__(res)
+            return res
+        except IOError,e:
+            raise exceptions.NotResource("%s, %s" % (path,e) )
+
+    def delete_resource(self,path):
+        if self.is_resource(path):
+            try:
+                path = utils.resourceref.remove_begin_slash(path)
+                path = utils.resourceref.join_refs([self.get_path(),self.get_current_path(),path])
+                for res in self.__get_open__(path):
+                    res.close()
+                    self.__closed__(res)
+                os.unlink(path)
+            except IOError:
+                raise exceptions.NotResource(path)
+        else:
+            raise exceptions.NotResource(path)
+
+    def close_resource(self, res):
+        """
+        Close the given resource instance. Normally this is called by the Resource object 
+        in its own close.
+        @param res: the resource object to close. 
+        """
+        try:
+            self.__closed__(res)
+            #if not res.get_mode() == api.Storage.MODE_READ:
+            #    self._get(utils.resourceref.to_dref(res.path)).data = res.getvalue()
+        except KeyError,e:
+            raise exceptions.StorageException("No such %s open resource! %s" % (res.path,e))
+            
+
+    def save_resource(self, res):
+        """
+        Flush the changes of a given resource instance. Normally this is called by the Resource object 
+        in its own save.
+        @param res: the resource to the resource to save. 
+        """
+        if not self.__has_resource__(res):
+            raise exceptions.NotResource("No such %s open resource!" % res.path)
+        else:
+            res.save()
+
+    def is_resource(self,path):
+        path = utils.resourceref.remove_begin_slash(path)
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        path = utils.resourceref.join_refs([self.get_path(),path])
+        norm_path = os.path.normpath(path)
+        return os.path.isfile(norm_path)
+
+    def fix_entry(self,entry,current_root):
+        entry = entry.replace(current_root,'')
+        entry = entry.replace("\\","/")
+        entry = utils.resourceref.remove_begin_slash(entry)
+        return entry
+
+
+    def list_resources(self,path,recurse=False,empty_folders=False):
+        """
+        Get an array of files in a folder
+        """
+        
+        retarray = []
+        path = utils.resourceref.remove_begin_slash(path)
+        fullpath = utils.resourceref.join_refs([self.get_path(),self.get_current_path(),path])
+        joined = os.path.join(self.get_path(), self.get_current_path())
+        current_root = os.path.normpath(os.path.abspath(joined))
+        # return always unix type file paths
+        if recurse:    
+            # Walk through all files in the layer
+            for root, dirs, files in os.walk(fullpath):
+                for name in files:
+                    entry = os.path.join(root, name)
+                    entry = os.path.normpath(os.path.abspath(entry))
+                    if os.path.isfile(entry):
+                        retarray.append(self.fix_entry(entry,current_root))
+                        
+                if empty_folders: 
+                    for name in dirs:
+                        entry = os.path.join(root, name)
+                        entry = os.path.normpath(os.path.abspath(entry))
+                        if  os.path.isdir(entry)  and  len(os.listdir(entry)) ==0:
+                            retarray.append(self.fix_entry(entry,current_root))
+                        
+        else:
+            filelist = os.listdir(fullpath)
+            for name in filelist:
+                entry = os.path.join(path, name)
+                entry = os.path.normpath(entry)
+                entry = entry.replace("\\","/")               
+                entry = utils.resourceref.remove_begin_slash(entry)
+                # ignore non file entries
+                fileentry = os.path.join(current_root,entry)
+                if os.path.isfile(fileentry):
+                    if debug: print "list_resources adding %s" % entry
+                    retarray.append(entry)
+                    
+                if os.path.isdir(fileentry) and empty_folders:
+                    if debug: print "list_resources adding %s" % entry
+                    retarray.append(entry)
+        return retarray
+
+    def import_resources(self,paths,storage):
+        for path in paths:
+            if not storage.is_resource(path):
+                logging.getLogger('cone').warning("The given path is not a Resource in the storage %s! Ignoring from export!" % path)
+                continue
+            wres = self.open_resource(path,'wb')
+            res  = storage.open_resource(path,"rb")
+            wres.write(res.read())
+            wres.close()
+            res.close()
+    
+    def export_resources(self,paths,storage,empty_folders=False):
+        """
+        
+        
+        """
+        for path in paths:
+            if not self.is_resource(path) and empty_folders==False:
+                logging.getLogger('cone').warning("The given path is not a Resource in this storage %s! Ignoring from export!" % path)
+                continue
+            if self.is_resource(path):
+                wres = storage.open_resource(path,'wb')
+                res  = self.open_resource(path,"rb")
+                wres.write(res.read())
+                wres.close()
+                res.close()
+                
+                
+            if  self.is_folder(path) and  empty_folders:
+                storage.create_folder(path)
+    
+                
+                
+
+    def create_folder(self,path):
+        """
+        Create a folder entry to a path
+        @param path : path to the folder
+        """
+        
+        path = utils.resourceref.join_refs([self.get_path(), self.get_current_path(), path])
+        if not os.path.exists(path):
+            os.makedirs(path)
+
+    def delete_folder(self,path):
+        """
+        Delete a folder entry from a path. The path must be empty.
+        @param path : path to the folder
+        """
+        path = utils.resourceref.join_refs([self.get_path(), self.get_current_path(), path])
+        if os.path.isdir(path):
+            os.rmdir(path)
+        else:
+            raise exceptions.StorageException("Not a folder %s" % path)
+
+    def is_folder(self,path):
+        """
+        Check if the given path is an existing folder in the storage
+        @param path : path to the folder
+        """
+        path = utils.resourceref.join_refs([self.get_path(), self.get_current_path(), path])
+        return os.path.isdir(path)
+
+    def unload(self, path, object):
+        """
+        Dump a given object to the storage (reference is fetched from the object)
+        @param object: The object to dump to the storage, which is expected to be an instance 
+        of Base class.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not isinstance(object, api.Configuration):
+            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
+        # Skip the unload storing to storage if the storage is opened in read mode
+        if self.get_mode(self.mode) != api.Storage.MODE_READ:
+            res = self.open_resource(path,"wb")
+            data = self.persistentmodule.dumps(object)
+            res.write(data)
+            res.close()
+        return
+
+
+    def load(self, path):
+        """
+        Load an from a reference.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not utils.resourceref.get_ext(path) == "confml":
+            raise exceptions.StorageException("Cannot load reference type %s" % utils.resourceref.get_ext(path))
+        if self.is_resource(path):
+            res = self.open_resource(path,"r")
+            # read the resource with persistentmodule
+            try:
+                obj = self.persistentmodule.loads(res.read())
+                #obj.set_path(path)
+                res.close()
+                return obj
+            except exceptions.ParseError,e:
+                logging.getLogger('cone').error("Resource %s parsing failed with exception: %s" % (path,e))
+                # returning an empty config in case of xml parsing failure.
+                return api.Configuration(path)
+        else:
+            raise exceptions.NotResource("No such %s resource!" % path)
+
+
+class FileResource(api.Resource):
+    def __init__(self,storage,path,mode,handle):
+        api.Resource.__init__(self,storage,path,mode)
+        self.handle = handle
+        
+    def read(self,bytes=0):
+        if bytes == 0:
+            return self.handle.read()
+        else:
+            return self.handle.read(bytes)
+    
+    def write(self,string):
+        if self.get_mode() == api.Storage.MODE_READ:
+            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
+        else:
+            self.handle.write(string)
+
+    def truncate(self, size=0):
+        self.handle.truncate(0)
+        self.handle.seek(size, 0)
+
+    def save(self):
+        if not self.handle.closed:
+            self.handle.save()
+
+    def close(self):
+        self.storage.close_resource(self)
+        self.handle.close()
+    
+    def get_size(self):
+        if self.get_mode() == api.Storage.MODE_WRITE:
+            raise exceptions.StorageException("Reading size attempted to %s in write-only mode." % self.path)
+        orig_pos = self.handle.tell()
+        self.handle.seek(0, os.SEEK_END)
+        try:        return self.handle.tell()
+        finally:    self.handle.seek(orig_pos, os.SEEK_SET)
+    
+    def get_content_info(self):
+        orig_pos = self.handle.tell()
+        self.handle.seek(0, os.SEEK_SET)
+        data = self.handle.read()
+        self.handle.seek(orig_pos, os.SEEK_SET)
+        if self.content_info == None:
+            self.content_info = utils.make_content_info(self, data)
+        
+        return self.content_info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/metadata.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,111 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+import StringIO
+import os
+
+from cone.public import exceptions, persistence
+
+class Metadata(object):
+    """
+    metadata container objectl, which is only a dictionary container
+    """
+    META_ROOT_FILE = 'cpf.rootFile'
+
+    def __init__(self, copyobj=None):
+        """
+        Constructor initializes the default values
+        """
+        self.data = {}
+        if copyobj != None:
+            self.data = copyobj.data.copy()
+        pass
+
+    def get_root_file(self):
+        return self.data.get(self.META_ROOT_FILE,"")
+
+    def set_root_file(self,filename):
+        self.data[self.META_ROOT_FILE] = filename
+
+class MetadataReader(persistence.ConeReader):
+    """
+    Parses a single metadata file
+    """ 
+    class_type = "Metadata"
+    NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
+    def __init__(self):
+        return
+    
+    def fromstring(self, xml_as_string):
+        meta = Metadata()
+        etree = ElementTree.fromstring(xml_as_string)
+        iter = etree.getiterator("{%s}property" % self.NAMESPACES[0])
+        for elem in iter:
+            (key,value) = self.get_property(elem)
+            meta.data[key] = value
+        return meta
+
+    def get_property(self, elem):
+        key = elem.get('name')
+        value = ''
+        if elem.get('value'): value = elem.get('value')
+        return (key,value)
+
+class MetadataWriter(persistence.ConeWriter):
+    """
+    Writes a single metadata file
+    """ 
+    class_type = "Metadata"
+    NAMESPACES = ['http://www.nokia.com/xml/ns/confml-core/metadata-2.0']
+    DEFAULT_ENCODING = "ASCII"
+    def __init__(self):
+        self.encoding = self.DEFAULT_ENCODING
+        return
+    
+    def tostring(self,obj,indent=True):
+        stringdata =  StringIO.StringIO()
+        self.toresource(obj, stringdata, indent)
+        return stringdata.getvalue()
+    
+    def toresource(self,obj,res,indent=True):
+        root = ElementTree.Element("metadata")
+        root.set('xmlns',self.NAMESPACES[0])
+        if not obj.__class__ == Metadata:
+            raise exceptions.IncorrectClassError('The given object is not a instance of %s' % Metadata)
+        for key in obj.data.keys():
+            prop = ElementTree.SubElement(root,'property')
+            self.set_property(prop, key, obj.data[key])
+        if indent:
+            persistence.indent(root)
+        # some smarter way to implement adding of the encoding to the beginning of file
+        res.write('<?xml version="1.0" encoding="%s"?>%s' % (self.encoding,os.linesep))
+        ElementTree.ElementTree(root).write(res)
+        
+    def set_property(self, elem, key, value):
+        elem.attrib['name'] = key
+        if value != '':
+            elem.attrib['value'] = value
+        return elem
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/persistentdictionary.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,222 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from cone.public import persistence, exceptions, api, utils
+
+def dumps(obj):
+    return DictWriter().dumps(obj)
+
+def loads(dictstr):
+    # convert the dict string with eval to actual dict
+    return DictReader().loads(eval(dictstr))
+
+class DictWriter(persistence.ConeWriter):
+    """
+    """ 
+
+    def dumps(self, obj):
+        """
+        @param obj: The object 
+        """
+        writer = get_writer_for_class(obj.__class__.__name__)
+        return {obj.__class__.__name__: writer.dumps(obj)}
+
+
+class DictReader(persistence.ConeReader):
+    """
+    """ 
+    class_type = "Dict"
+
+    def loads(self, dict):
+        """
+        @param dict: The dictianary which to read. reads only the first object. 
+        """
+        classname = dict.keys()[0]
+        reader = get_reader_for_elem(classname)
+        return reader.loads(dict)
+
+
+class GenericWriter(DictWriter):
+    """
+    """ 
+
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        dict = {'dict': todict(obj)}
+        for child in obj._objects():
+            writer = get_writer_for_class(child.__class__.__name__)
+            chd = writer.dumps(child)
+            if not dict.has_key('children'):
+                 dict['children'] = []
+            dict['children'].append({child.__class__.__name__: chd})
+        return dict
+
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this DictWriter supports writing
+        of the given class name
+        """
+        try:
+            cls = get_class(classname)
+            return True
+        except exceptions.IncorrectClassError:
+            return False
+
+
+class GenericReader(DictReader):
+    """
+    """ 
+    
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this DictWriter supports reading
+        of the given elem name
+        """
+        try:
+            cls = get_class(elemname)
+            return True
+        except exceptions.IncorrectClassError:
+            return False
+
+    def __init__(self):
+        pass
+
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        
+        (classname,objdata) = dict.popitem()
+        obj = get_class(classname)()
+        objdict = objdata.get('dict',{})
+        for membername in objdict.keys():
+            try:
+                setattr(obj, membername, objdict[membername])
+            except AttributeError:
+                # read only attributes cannot be set
+                pass
+        obj._name = utils.resourceref.to_objref(obj.ref)
+
+        #container.ObjectContainer.__init__(obj,utils.resourceref.to_dottedref(obj.ref))
+        for child in objdata.get('children',[]):
+            classname = child.keys()[0]
+            reader = get_reader_for_elem(classname)
+            childobj = reader.loads(child)
+            obj.add(childobj)
+        return obj
+
+
+class ConfigurationProxyWriter(DictWriter):
+    """
+    """ 
+    def dumps(self, obj):
+        """
+        @param obj: The Configuration object 
+        """
+        dict = {'dict': todict(obj)}
+        return dict
+
+    @classmethod
+    def supported_class(cls, classname):
+        """
+        Class method to determine if this DictWriter supports writing
+        of the given class name
+        """
+        if classname=="ConfigurationProxy":
+            return True
+        else:
+            return False
+
+
+class ConfigurationProxyReader(DictReader):
+    """
+    """ 
+    def loads(self, dict):
+        """
+        @param obj: The Configuration object 
+        """
+        (classname,objdata) = dict.popitem()
+        obj = api.ConfigurationProxy("")
+        obj.__dict__.update(objdata.get('dict',{}))
+        obj.set('_name',utils.resourceref.to_objref(obj.path))
+        return obj
+        
+    @classmethod
+    def supported_elem(cls, elemname, parent=None):
+        """
+        Class method to determine if this DictWriter supports reading
+        of the given elem name
+        """
+        if elemname=="ConfigurationProxy":
+            return True
+        else:
+            return False
+
+
+def get_class(elemname):
+    """
+    Get a correct class from a element name.
+    """
+    if elemname=="Configuration":
+        return api.Configuration
+    elif elemname=="CompositeConfiguration":
+        return api.CompositeConfiguration
+    elif elemname=="Feature":
+        return api.Feature
+    elif elemname=="Data":
+        return api.Data
+    elif elemname=="DataContainer":
+        return api.DataContainer
+    elif elemname=="Base":
+        return api.Base
+    else:
+        raise exceptions.IncorrectClassError("Could not find a class for name %s!" % elemname)
+
+def get_reader_for_elem(classname):
+    for reader in DictReader.__subclasses__():
+        if reader.supported_elem(classname):
+            return reader()
+    raise exceptions.ConePersistenceError("No reader for given class found!")
+
+def get_writer_for_class(classname):
+    for writer in DictWriter.__subclasses__():
+        if writer.supported_class(classname):
+            return writer ()
+    raise exceptions.ConePersistenceError("No writer for given class found! %s" % classname)
+
+def todict(obj):
+    """
+    Helper function to push all non internal data to a dictionary
+    """
+    dict = {}
+    fromdict = obj._dict()
+    for member in fromdict:
+        if member.startswith("_"):
+            # skip internals
+            continue
+        value = getattr(obj,member)
+        if isinstance(value,str):
+            dict[member] = value
+            continue
+        if isinstance(value,int):
+            dict[member] = value
+            continue
+    return dict
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/resources.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+import zipfile,os,re,zlib
+from cone.public.api import Resource
+
+class CpfRootResource(Resource):
+    """
+    Parses a single CPF configuration project root confml file. Parses the XInclude statements to 
+    find out the layers inside the project
+    """ 
+    def __init__(self):
+        self.configuration_namespace = "http://www.s60.com/xml/confml/1"
+        self.include_namespace       = "http://www.w3.org/2001/xinclude"
+        self.desc                    = ""
+        self.includes                = []
+        self.meta                    = {}
+        self.filename                = "defaultroot.confml"
+        return
+    
+    def parse_file(self, xmlfile):
+        self.filename = xmlfile
+        self.etree    = ElementTree.parse(xmlfile)
+        self.parse_includes()
+        self.parse_meta()
+        self.parse_desc()
+        return
+    
+    def parse_str(self, xml_as_string):
+        self.etree = ElementTree.fromstring(xml_as_string)
+        self.parse_includes()
+        self.parse_meta()
+        self.parse_desc()
+        return
+
+    def parse_includes(self):
+        includes = self.etree.getiterator("{%s}include" % self.include_namespace)
+        for inc in includes:
+            self.includes.append(inc.get('href'))
+
+    def parse_meta(self):
+        meta = self.etree.find("{%s}meta" % self.configuration_namespace)
+        if meta:
+            for elem in meta.getiterator():
+                m = re.match("{.*}(?P<tagname>.*)",elem.tag)
+                if m:
+                    self.meta[m.group('tagname')] = elem.text
+
+    def parse_desc(self):
+        desc_elem = self.etree.find("{%s}desc" % self.configuration_namespace)
+        if desc_elem != None:
+            self.desc = desc_elem.text
+      
+    def get_layers(self):
+        return self.includes
+    
+    def get_meta(self):
+        return self.meta
+    
+    def get_desc(self):
+        return self.desc
+
+    def get_configuration(self):
+        configuration = CpfConfiguration(self.filename)
+        for inc in self.includes:
+            configuration.add_layer(CpfLayer(inc))
+        return configuration
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/stringstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,353 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import StringIO
+import os
+import pickle
+import copy
+import logging
+
+from cone.public import *
+from cone.storage import persistentdictionary
+
+
+class _StringStorageObject(container.ObjectContainer):
+    def __init__(self, name):
+        container.ObjectContainer.__init__(self, utils.resourceref.to_dottedref(name))
+        self.path = name
+        self.data = ""
+
+    def get_path(self):
+        """
+        Return the path of the configuration resource
+        """
+        return self.path
+
+    def set_path(self,path):
+        """
+        Set the path of the configuration resource
+        """
+        self.path = path
+
+    def path_to_elem(self, toparent=None):
+        parent_path = ""
+        # check if the parent is found at all from this hierarchy
+        if toparent and not self._find_parent_or_default(match=toparent):
+            toparent = self._find_parent_or_default(container=True)
+        if self._find_parent():
+            parent_path = self._find_parent()._path(toparent).replace(".","/") 
+        return utils.resourceref.join_refs([parent_path,self.get_path()])
+    
+    def __getstate__(self):
+        return self.__dict__.copy()
+        
+    def __setstate__(self,dict):
+        self.__dict__ =  dict.copy()
+        
+class StringStorage(api.Storage, container.ObjectContainer):
+    """
+    A general base class for all storage type classes
+    @param path : the reference to the root of the storage.
+    """
+    def __init__(self, path):
+        container.ObjectContainer.__init__(self,"")
+        api.Storage.__init__(self,path)
+
+    def __getstate__(self):
+        dict = self.__dict__.copy()
+        del dict['__opened_res__']
+        return dict
+
+    def __setstate__(self,dict):
+        self.__dict__ =  dict.copy()
+        self.__dict__['__opened_res__'] = {}
+
+    def __dump__(self):
+        """
+        Dump the storage to the reference file
+        """
+        file = open(self.get_path(),"w")
+        pickle.dump(self,file)
+        file.close()
+
+    @classmethod
+    def __open__(cls,path, mode="r"):
+        if mode.find("a")!=-1 or mode.find("r")!=-1:
+            if os.path.exists(path) and os.path.isfile(path):
+                file = open(path,"r")
+                obj = pickle.load(file)
+                file.close()
+            else:
+                raise exceptions.StorageException("The given data file for storage does not exist! %s" % path)
+        elif mode.find("w")!=-1:
+            # check if the given storage path exists and delete it if it does
+            if os.path.dirname(path) != '' and not os.path.exists(os.path.dirname(path)):
+                 os.makedirs(os.path.dirname(path))
+            obj = StringStorage(path)
+            """ key value pairs of data. Key path = datastring """ 
+        else:
+            raise exceptions.StorageException("Unsupported creation mode given! %s" % mode)
+        return obj
+
+    @classmethod
+    def supported_storage(cls,path):
+        """
+        Class method for determing if the given clas supports a storage by given path. 
+        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
+        @param path:
+        @return: Boolean value. True if the storage of the path is supported. False if not.  
+        """
+        if utils.resourceref.get_ext(path) == "pk":
+            return True
+        else:
+            return False
+
+    def close(self):
+        """
+        Close the repository, which will save and close all open resources.  
+        """
+        super(StringStorage,self).close()
+        self.__dump__()
+
+    def save(self):
+        """
+        Save changes from all resources to the repository.  
+        """        
+        super(StringStorage,self).save()
+        self.__dump__()
+
+    def open_resource(self,path,mode="r"):
+        """
+        Open the given resource and return a File object.
+        @param path : reference to the resource 
+        @param mode : the mode in which to open. Can be one of r = read, w = write, a = append.
+        raises a NotResource exception if the path item is not a resource.
+        """
+        res = None
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        dottedref = utils.resourceref.to_dref(path)
+        (pathto,name)= utils.resourceref.psplit_ref(path)
+        (dpath, dref) = utils.dottedref.psplit_ref(dottedref)
+        
+        # check for existence
+        if self.get_mode(mode) == self.MODE_READ:
+            try:
+                # Try to create a new StringResource in any case
+                
+                res = StringResource(self, path, self._get(dottedref).data,mode) 
+            except exceptions.NotFound,e:
+                raise exceptions.NotResource("Not found %s" % path)
+        elif self.get_mode(mode) == self.MODE_WRITE:
+            # Create a new StringResource in any case
+            self._add_to_path(dpath,_StringStorageObject(name))
+            res = StringResource(self, path, self._get(dottedref).data,mode) 
+        elif self.get_mode(mode) == self.MODE_APPEND:
+            # Append case, create the data reference if it is not existing
+            if not self._has(dottedref):
+                self._add_to_path(dpath,_StringStorageObject(name))
+                        # Create a new StringResource in any case
+            res = StringResource(self, path, self._get(dottedref).data,mode)
+            res.seek(0, os.SEEK_END)
+        self.__opened__(res)
+        return res
+
+    def delete_resource(self,path):
+        """
+        Delete the given resource from storage
+        @param res : Resource objcet to the resource 
+        raises a NotSupportedException exception if delete operation is not supported by the storage
+        """
+        # First close all open resources
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.curpath, path])
+        for res in self.__get_open__(path):
+            self.__closed__(res)
+        self._remove(utils.resourceref.to_dref(path))
+
+    def close_resource(self, res):
+        """
+        Close the given resource instance. Normally this is called by the Resource object 
+        in its own close.
+        @param res: the resource object to close. 
+        """
+        try:
+            self.__closed__(res)
+            if not res.get_mode() == api.Storage.MODE_READ:
+                self._get(utils.resourceref.to_dref(res.path)).data = res.getvalue()
+        except KeyError,e:
+            raise StorageException("No such %s open resource! %s" % (res.path,e))
+            
+
+    def save_resource(self, res):
+        """
+        Flush the changes of a given resource instance. Normally this is called by the Resource object 
+        in its own save.
+        @param res: the resource to the resource to save. 
+        """
+        if not self.__has_resource__(res):
+            raise exceptions.NotResource("No such %s open resource!" % res.path)
+        else:
+            if not res.get_mode() == api.Storage.MODE_READ:
+                self._get(utils.resourceref.to_dref(res.path)).data = res.getvalue()
+
+    def is_resource(self,path):
+        """
+        Return true if the path is a resource
+        @param path : reference to path where resources are searched
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        return self._has(utils.resourceref.to_dref(path))
+
+    def list_resources(self,path,recurse=False,empty_folders=False):
+        """
+        find the resources under certain path/path 
+        @param path : reference to path where resources are searched
+        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
+        Default value is False. Set to True to enable recursion.
+        """
+        """ Get the given curpath element """
+        try:
+            curelem = self._get(utils.resourceref.to_dref(self.get_current_path()))
+            dref = utils.resourceref.to_dref(path)
+            if recurse:
+                return sorted([child.path_to_elem(curelem) for child in curelem._get(dref)._traverse(type=_StringStorageObject)])
+            else:
+                return sorted([child.path_to_elem(curelem) for child in curelem._get(dref)._objects(type=_StringStorageObject)])
+        except exceptions.NotFound:
+            return []
+        
+    def import_resources(self,paths,storage,empty_folders=False):
+        for path in paths:
+            if not storage.is_resource(path):
+                logging.getLogger('cone').warning("The given path is not a Resource in the storage %s! Ignoring from export!" % path)
+                continue
+            wres = self.open_resource(path,'wb')
+            res  = storage.open_resource(path,"rb")
+            wres.write(res.read())
+            wres.close()
+            res.close()
+            
+
+    def create_folder(self,path):
+        """
+        Create a folder entry to a path
+        @param path : path to the folder
+        """
+        if not self._has(utils.resourceref.to_dref(path)):
+            (dpath,name) = utils.dottedref.psplit_ref(utils.resourceref.to_dref(path))
+            self._add_to_path(dpath, self._default_object(name))
+
+    def delete_folder(self,path):
+        """
+        Delete a folder entry from a path. The path must be empty.
+        @param path : path to the folder
+        """
+        self._remove(utils.resourceref.to_dref(path))
+
+    def is_folder(self,path):
+        """
+        Check if the given path is an existing folder in the storage
+        @param path : path to the folder
+        """
+        return self._has(utils.resourceref.to_dref(path))
+
+    def export_resources(self,refs,storage,empty_folders=False):
+        """
+        export resources from this storage based on a list of reference to this storage
+        @param refs : a list of resource names in this storage (references).
+        @param storage : the external storage where to export.
+        """  
+        storage.import_resources(refs, self, empty_folders=empty_folders)
+
+    def unload(self, path, object):
+        """
+        Dump a given object to the storage (reference is fetched from the object)
+        @param object: The object to dump to the storage, which is expected to be an instance 
+        of Base class.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not isinstance(object, api.Configuration):
+            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
+        res = self.open_resource(path,"w")
+        data = persistentdictionary.dumps(object)
+        res.write(data)
+        res.close()
+        return
+
+    def load(self, path):
+        """
+        Load an from a reference.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not utils.resourceref.get_ext(path) == "confml":
+            raise exceptions.StorageException("Cannot load object from given path = %s!" % path)
+        if self.is_resource(path):
+            res = self.open_resource(path,"r")
+            # read the dictionary from the resource with eval
+            obj = persistentdictionary.loads(res.read())
+            res.close()
+            return obj
+        else:
+            raise exceptions.NotResource("No such %s resource!" % path)
+
+class StringResource(api.Resource):
+    """
+    A StringResource class that works on top of StringIO buffer. This class in 
+    intended mainly for testing purposes.
+    """    
+    def __init__(self,storage,path,stringdata, mode=api.Storage.MODE_READ):
+        strio = StringIO.StringIO(stringdata)    
+        api.Resource.__init__(self,storage,path, mode)
+        self.handle = strio
+        self.read = self.handle.read
+        self.tell = self.handle.tell
+        self.seek = self.handle.seek
+        self.readline = self.handle.readline
+        self.getvalue = self.handle.getvalue
+    
+    def write(self, string):
+        if self.get_mode() == api.Storage.MODE_READ:
+            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
+        else:
+            self.handle.write(string)
+
+    def read(self, bytes=0):
+        if self.get_mode() == api.Storage.MODE_WRITE:
+            raise exceptions.StorageException("Reading attempted to %s in write-only mode." % self.path)
+        else:
+            self.handle.read(string)
+
+    def save(self):
+        self.storage.save_resource(self)
+
+    def close(self):
+        self.storage.close_resource(self)
+        self.handle.close()
+    
+    def get_size(self):
+        if self.get_mode() == api.Storage.MODE_WRITE:
+            raise exceptions.StorageException("Reading resource size attempted to %s in write-only mode." % self.path)
+        return len(self.handle.getvalue())
+
+    def get_content_info(self):
+        if self.content_info == None:
+            self.content_info = utils.make_content_info(self, self.handle.getvalue())
+        
+        return self.content_info
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+TESTAUTO_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../testautomation'))
+if SOURCE_ROOT not in sys.path:
+    sys.path.insert(0,SOURCE_ROOT)
+if TESTAUTO_ROOT not in sys.path:
+    sys.path.insert(0,TESTAUTO_ROOT)
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    sys.path.insert(0, ROOT_PATH)
+    try:
+        suite = unittest.TestSuite()
+        for test_module in __all__:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
Binary file configurationengine/source/cone/storage/tests/data.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/familyX/content/test/override.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+NCP11 override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/familyX/content/test/shout.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Shout out!
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/familyX/prodX/content/prodX/jee/ProdX_specific.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+földska
\ No newline at end of file
Binary file configurationengine/source/cone/storage/tests/data/familyX/prodX/root.confml has changed
Binary file configurationengine/source/cone/storage/tests/data/familyX/root.confml has changed
Binary file configurationengine/source/cone/storage/tests/data/morestuff.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/platform/s60/content/test/override.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+S60 default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/platform/s60/content/test/s60.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+hey!!
Binary file configurationengine/source/cone/storage/tests/data/platform/s60/implml/accessoryserver_1020505A.crml has changed
Binary file configurationengine/source/cone/storage/tests/data/platform/s60/implml/accesspoints_10008D3A.crml has changed
Binary file configurationengine/source/cone/storage/tests/data/platform/s60/implml/accesspoints_10008D3B.crml has changed
Binary file configurationengine/source/cone/storage/tests/data/platform/s60/implml/actionpriorities_2000FDC2.crml has changed
Binary file configurationengine/source/cone/storage/tests/data/platform/s60/root.confml has changed
Binary file configurationengine/source/cone/storage/tests/data/prodX.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/data/regional/japan/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+<configuration name="regional_japan_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" />
\ No newline at end of file
Binary file configurationengine/source/cone/storage/tests/data/simple.confml has changed
Binary file configurationengine/source/cone/storage/tests/empty_zip_storage.zip has changed
Binary file configurationengine/source/cone/storage/tests/file_vs_zip_data.zip has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/image-bmp-1bit.bmp has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/image-bmp-24bit.bmp has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/image-bmp-4bit.bmp has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/image-bmp-8bit.bmp has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/image-jpeg-1bit.jpg has changed
Binary file configurationengine/source/cone/storage/tests/fileres_test/largefile.bin has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/fileres_test/testread.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+foo bar test.
Binary file configurationengine/source/cone/storage/tests/list_resources_data/7zip.zip has changed
Binary file configurationengine/source/cone/storage/tests/list_resources_data/carbide.ct.cpf has changed
Binary file configurationengine/source/cone/storage/tests/list_resources_data/winzip.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/simplewebserver.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,169 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import SimpleHTTPServer
+import SocketServer
+import threading
+import httplib
+import os
+import simplejson
+import urllib
+import urlparse
+import posixpath
+import cgi
+from StringIO import StringIO
+
+class SimpleWebHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
+    def __init__(self, request, client_address, server):
+        SimpleHTTPServer.SimpleHTTPRequestHandler.__init__(self, request, client_address, server)
+        self.action = ''
+
+    def send_head(self):
+        """Common code for GET and HEAD commands.
+
+        This sends the response code and MIME headers.
+
+        Return value is either a file object (which has to be copied
+        to the outputfile by the caller unless the command was HEAD,
+        and must be closed by the caller under all circumstances), or
+        None, in which case the caller has nothing further to do.
+
+        """
+        (action,path) = self.translate_path(self.path)
+        
+        if action == 'list_resources':
+            return self.list_directory(path)
+        elif action == 'get_resource':
+            return self.get_resource(path) 
+        else:
+            self.send_error(404, "File not found")
+            return None
+
+    def get_resource(self,path):
+        f = None
+        ctype = self.guess_type(path)
+        if ctype.startswith('text/'):
+            mode = 'r'
+        else:
+            mode = 'rb'
+        try:
+            f = open(path, mode)
+        except IOError:
+            self.send_error(404, "File not found")
+            return None
+        self.send_response(200)
+        self.send_header("Content-type", ctype)
+        fs = os.fstat(f.fileno())
+        self.send_header("Content-Length", str(fs[6]))
+        self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
+        self.end_headers()
+        return f
+
+    def list_directory(self, path):
+        """Helper to produce a directory listing (absent index.html).
+
+        Return value is either a file object, or None (indicating an
+        error).  In either case, the headers are sent, making the
+        interface the same as for send_head().
+
+        """
+        try:
+            list = os.listdir(path)
+        except os.error:
+            self.send_error(404, "No permission to list directory")
+            return None
+        list.sort(key=lambda a: a.lower())
+        f = StringIO()
+        displaypath = cgi.escape(urllib.unquote(self.path))
+        files = []
+        for name in list:
+            fullname = os.path.join(path, name)
+            displayname = linkname = name
+            # Append / for directories or @ for symbolic links
+            if os.path.isdir(fullname):
+                displayname = name + "/"
+                linkname = name + "/"
+            if os.path.islink(fullname):
+                displayname = name + "@"
+                # Note: a link to a directory displays with @ and links with /
+            files.append(displayname)
+        
+        f.write(simplejson.dumps(files))
+        length = f.tell()
+        f.seek(0)
+        self.send_response(200)
+        self.send_header("Content-type", "text/html")
+        self.send_header("Content-Length", str(length))
+        self.end_headers()
+        return f
+
+    def translate_path(self, path):
+        """Translate a /-separated PATH to the local filename syntax.
+
+        Components that mean special things to the local file system
+        (e.g. drive or directory names) are ignored.  (XXX They should
+        probably be diagnosed.)
+        @return: action,path
+        """
+        # abandon query parameters
+        action = ''
+        path = urlparse.urlparse(path)[2]
+        path = path.lstrip('/')
+        splittedpath = path.split('/')
+        if len(splittedpath) > 1:
+            action = splittedpath[1]
+            path   = "/".join(splittedpath[2:])
+            path = posixpath.normpath(urllib.unquote(path))
+            words = path.split('/')
+            words = filter(None, words)
+            path = os.getcwd()
+            for word in words:
+                drive, word = os.path.splitdrive(word)
+                head, word = os.path.split(word)
+                if word in (os.curdir, os.pardir): continue
+                path = os.path.join(path, word)
+        return (action,path)
+        
+
+class SimpleWebServer(threading.Thread):
+    def __init__(self, folder=".", port=8000):
+        super(SimpleWebServer,self).__init__()
+        self.PORT    = port
+        self.folder  = folder
+        self.handler = SimpleWebHandler
+        self.httpd   = SocketServer.TCPServer(("localhost", self.PORT), self.handler)
+        self.active  = False
+        print "serving at port", self.PORT
+ 
+    def run(self):
+        # minimal web server.  serves files relative to the
+        # current directory.
+        os.chdir(self.folder)
+        self.active = True
+        while self.active:
+            self.httpd.handle_request()
+        return 0
+
+    def stop(self):
+        self.active = False
+        conn = httplib.HTTPConnection('localhost', self.PORT)
+        conn.request("GET", "/")
+        r1 = conn.getresponse()
+        print r1.status, r1.reason
+
+if __name__ == '__main__':
+    server = SimpleWebServer()
+    server.start()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_fileresource.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,162 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import sys,os
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+import __init__
+from cone.public.exceptions import NotResource, StorageException
+from cone.public import api
+from cone.storage import filestorage
+
+
+class TestFileResource(unittest.TestCase):    
+    def setUp(self):
+        self.spath = os.path.join(ROOT_PATH,"fileres_test")
+        self.storage = filestorage.FileStorage(self.spath)
+
+    def tearDown(self):
+        self.storage.close()
+    
+    def test_open_and_write_resource(self):
+        res = self.storage.open_resource("testwrite.txt","w")
+        res.write("Testing writing func!")
+        res.close()
+        f = open(self.spath+"/testwrite.txt","r")
+        data = f.read()
+        self.assertEquals(data,"Testing writing func!")
+        f.close()
+        os.unlink(os.path.join(ROOT_PATH,"fileres_test/testwrite.txt"))
+
+    def test_open_and_read_resource(self):
+        res = self.storage.open_resource("testread.txt","r")
+        resdata = res.read()
+        res.close()
+        f = open(self.spath+"/testread.txt","r")
+        data = f.read()
+        f.close()
+        self.assertEquals(data,resdata)  
+
+    def test_open_and_write_resource_and_trunk_it(self):
+        res = self.storage.open_resource("testtrunk.txt","w")
+        res.write("Testing writing func!")
+        res.truncate()
+        res.close()
+        f = open(self.spath+"/testtrunk.txt","r")
+        data = f.read()
+        self.assertEquals(data,"")
+        f.close()
+        os.unlink(os.path.join(ROOT_PATH,"fileres_test/testtrunk.txt"))
+    
+    def test_get_size(self):
+        res = self.storage.open_resource("testread.txt", "r")
+        self.assertEquals(res.get_size(), 15)
+        # Try a second time just in case
+        self.assertEquals(res.get_size(), 15)
+        res.close()
+    
+    def test_get_size_largefile(self):
+        res = self.storage.open_resource("largefile.bin", "r")
+        self.assertEquals(res.get_size(), 25000)
+        # Try a second time just in case
+        self.assertEquals(res.get_size(), 25000)
+        res.close()
+    
+    def test_get_size_fails_in_write_mode(self):
+        res = self.storage.open_resource("test_getsize.txt","w")
+        res.write("Writing foobar")
+        self.assertRaises(StorageException, res.get_size)
+        res.close()
+
+    def test_bmp_content_info_24bit(self):
+        res = self.storage.open_resource("image-bmp-24bit.bmp", "r")
+        content_info = res.get_content_info()
+        self.assertEquals(api.BmpImageContentInfo, type(content_info))
+        self.assertEquals(24, res.get_content_info().color_depth)
+        self.assertEquals(24, content_info.color_depth)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('bmp', content_info.mimesubtype)
+        self.assertEquals('image/bmp', content_info.content_type)
+        res.close()
+
+    def test_bmp_content_info_8bit(self):
+        res = self.storage.open_resource("image-bmp-8bit.bmp", "r")
+        content_info = res.get_content_info()
+        self.assertEquals(api.BmpImageContentInfo, type(content_info))
+        self.assertEquals(8, res.get_content_info().color_depth)
+        self.assertEquals(8, content_info.color_depth)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('bmp', content_info.mimesubtype)
+        self.assertEquals('image/bmp', content_info.content_type)
+        res.close()
+
+    def test_bmp_content_info_4bit(self):
+        res = self.storage.open_resource("image-bmp-4bit.bmp", "r")
+        content_info = res.get_content_info()
+        self.assertEquals(api.BmpImageContentInfo, type(content_info))
+        self.assertEquals(4, res.get_content_info().color_depth)
+        self.assertEquals(4, content_info.color_depth)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('bmp', content_info.mimesubtype)
+        self.assertEquals('image/bmp', content_info.content_type)
+        res.close()
+
+    def test_bmp_content_info_1bit(self):
+        res = self.storage.open_resource("image-bmp-1bit.bmp", "r")
+        content_info = res.get_content_info()
+        self.assertEquals(api.BmpImageContentInfo, type(content_info))
+        self.assertEquals(1, res.get_content_info().color_depth)
+        self.assertEquals(1, content_info.color_depth)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('bmp', content_info.mimesubtype)
+        self.assertEquals('image/bmp', content_info.content_type)
+        res.close()
+
+    def test_content_info_with_jpg(self):
+        res = self.storage.open_resource("image-jpeg-1bit.jpg", "r")
+        content_info = res.get_content_info()
+        self.assertEquals('image/jpeg', content_info.content_type)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('jpeg', content_info.mimesubtype)
+        res.close()
+
+
+    def test_content_info_invalid_bmp(self):
+        res = self.storage.open_resource("invalid.bmp", "r")
+        content_info = res.get_content_info()
+        self.assertEquals('image/bmp', content_info.content_type)
+        self.assertEquals('image', content_info.mimetype)
+        self.assertEquals('bmp', content_info.mimesubtype)
+        res.close()
+        
+    def test_get_content_info_and_read_data(self):
+        res = self.storage.open_resource("testread.txt", "r")
+        ci = res.get_content_info()
+        self.assertEquals('text/plain', ci.content_type)
+        data = res.read()
+        self.assertEquals('foo bar test.\n', data)
+        res.close()
+        
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_filestorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,161 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import sys,os,shutil
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+import __init__
+from cone.public.exceptions import NotResource,StorageException
+from cone.public import api 
+from cone.storage import filestorage
+
+datafolder= ROOT_PATH
+datazip   = os.path.join(ROOT_PATH,"data.zip")
+datafolder= os.path.join(ROOT_PATH,"data")
+
+
+class TestFileStorageCreation(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    def test_create_storage_on_non_existing_path_fails(self):
+        try:
+            storage = filestorage.FileStorage("dummydatafolder")
+            self.fail("opening on dummydatafolder succeeds?")
+        except StorageException,e:
+            self.assertTrue(True)
+
+    def test_create_storage_on_file_fails(self):
+        try:
+            storage = filestorage.FileStorage(datazip)
+            self.fail("opening on data file succeeds?")
+        except StorageException,e:
+            self.assertTrue(True)
+
+    def test_create_storage_on_new_directory(self):
+        storage = filestorage.FileStorage("dummytest/storage","w")
+        self.assertTrue(os.path.exists("dummytest/storage"))
+        shutil.rmtree("dummytest")
+
+class TestFileStorage(unittest.TestCase):    
+    def setUp(self):
+        self.storage = filestorage.FileStorage(datafolder)
+
+    def test_supported_storage(self):        
+        self.assertTrue(filestorage.FileStorage.supported_storage("C:/GenerationRegressionTest/wc/genregtest_workdir/cone_vs_ct2/pf7132_020.006/config_project/"))
+        self.assertTrue(filestorage.FileStorage.supported_storage("C:/GenerationRegressionTest/wc/genregtest_workdir"))
+        self.assertFalse(filestorage.FileStorage.supported_storage("C:/GenerationRegressionTest/wc/genregtest_workdir.zip"))
+    
+    def test_open_resource_existing_file_for_reading(self):
+        res = self.storage.open_resource("simple.confml")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+
+    def test_open_resource_new_file(self):
+        res = self.storage.open_resource("newfile.txt","w")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+        res.close()
+        self.assertTrue(os.path.exists(datafolder+"/newfile.txt"))
+        os.remove(datafolder+"/newfile.txt")
+
+    def test_list_resources(self):
+        self.assertEquals(self.storage.list_resources("."),
+                          ['.metadata', 'morestuff.confml', 'prodX.confml', 'simple.confml'])
+        
+    def test_delete_resource(self):
+        tf = open(os.path.join(datafolder,"tempfile.txt"),"w")
+        tf.close()
+        res = self.storage.delete_resource("tempfile.txt")
+        self.assertFalse(os.path.exists(datafolder+"tempfile.txt"))
+        
+    def test_open_resource_nonexisting(self):
+        try:
+            res = self.storage.open_resource("iamnothere.txt")
+            self.fail("Opening of a non existing file succeeds!??")
+        except NotResource: 
+            self.assertTrue(True)
+
+    def test_list_resources_nonrecurse(self):
+        file_array = self.storage.list_resources("")
+        self.assertEquals(file_array[0],".metadata")
+
+    def test_list_resources_nonrecurse_from_root(self):
+        file_array = self.storage.list_resources("/")
+        self.assertTrue(file_array.index(".metadata")==0)
+
+    def test_list_resources_recurse_from_root(self):
+        file_array = self.storage.list_resources("",True)
+        self.assertEquals(file_array[0],".metadata")
+
+    def test_list_resources_from_subfolder(self):
+        file_array = self.storage.list_resources("familyX")
+        self.assertEquals(file_array[0],"familyX/root.confml")
+
+    def test_list_resources_recurse_from_subfolder(self):
+        file_array = self.storage.list_resources("familyX", True)
+        self.assertEquals(file_array[0],"familyX/root.confml")
+        # Count only non-SVN files
+        self.assertEquals(len(filter(lambda x: x.find('.svn') == -1, file_array)), 7)
+
+    def test_is_resource_true(self):
+        self.assertTrue(self.storage.is_resource("simple.confml"))
+
+    def test_is_resource_true_with_begin_slash(self):
+        self.assertTrue(self.storage.is_resource("/simple.confml"))
+
+    def test_is_resource_false(self):
+        self.assertFalse(self.storage.is_resource("data"))
+
+    def test_open_resource_existing_file_with_root(self):
+        res = self.storage.open_resource("/simple.confml")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+
+    def test_metadata_writing(self):
+        fs = filestorage.FileStorage("testtemp","w")
+        fs.set_active_configuration('testing.confml')
+        fs.close()
+        fs = filestorage.FileStorage("testtemp","r")
+        self.assertEquals(fs.get_active_configuration(),'testing.confml')
+        fs.close()
+        shutil.rmtree("testtemp")
+
+    def test_create_folder(self):
+        store = filestorage.FileStorage("newtestfolder","w")
+        store.create_folder("subdir")
+        self.assertTrue(store.is_folder("subdir"))
+        self.assertTrue(os.path.exists("newtestfolder/subdir"))
+        store.create_folder('foo')
+        layer = api.Folder(store, "foo")
+        self.assertTrue(store.is_folder("foo"))
+        self.assertTrue(layer)
+        self.assertTrue(os.path.exists("newtestfolder/subdir"))
+        layer.create_folder("foosubdir")
+        self.assertTrue(store.is_folder("foo/foosubdir"))
+        self.assertTrue(os.path.exists("newtestfolder/foo/foosubdir"))
+        shutil.rmtree('newtestfolder')
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_filestorage_layer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,154 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys,os, shutil
+import __init__
+
+from cone.public import api,exceptions,utils
+from cone.storage import filestorage
+
+class TestLayer(unittest.TestCase):    
+    storage_class = filestorage.FileStorage
+
+    def test_create_layer(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+        shutil.rmtree("temp/layertest")
+
+#    def test_create_layer_with_kwargs(self):
+#        store = self.storage_class("temp/layertest","w")
+#        layer = api.Layer(store, "foo",confml_path="foobar", implml_path="")
+#        self.assertTrue(layer)
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/foobar")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo")
+#        layer = api.Layer(store, "foo",confml_path="f", implml_path="test", content_path="data", doc_path="foo")
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/f")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo/test")
+#        self.assertEquals(layer.content_folder.get_current_path(),"foo/data")
+#        self.assertEquals(layer.doc_folder.get_current_path(),"foo/foo")
+#        layer = api.Layer(store, "foo")
+#        self.assertEquals(layer.confml_folder.get_current_path(),"foo/confml")
+#        self.assertEquals(layer.implml_folder.get_current_path(),"foo/implml")
+#        self.assertEquals(layer.content_folder.get_current_path(),"foo/content")
+#        self.assertEquals(layer.doc_folder.get_current_path(),"foo/doc")
+#        shutil.rmtree("temp/layertest")
+
+    def test_get_path(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+        self.assertEquals(layer.get_current_path(),"foo")
+        shutil.rmtree("temp/layertest")
+
+    def test_open_resource(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        self.assertTrue(layer)
+        res = layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_resources("", True),["confml/test.confml"])
+        self.assertEquals(store.list_resources("", True),["foo/confml/test.confml"])
+        shutil.rmtree("temp/layertest")
+
+    def test_create_two_layers_and_open_resource(self):
+        store = self.storage_class("temp/layertest","w")
+        foo_layer = api.Layer(store, "foo")
+        bar_layer = api.Layer(store, "bar")
+        res = foo_layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = foo_layer.open_resource("root.confml","w")
+        res.close()
+        res = bar_layer.open_resource("confml/root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(foo_layer.list_resources("", True),['root.confml', 'confml/test.confml'])
+        self.assertEquals(store.list_resources("", True),['bar/confml/root.confml','foo/root.confml','foo/confml/test.confml'])
+        foo_layer.delete_resource("confml/test.confml")
+        self.assertEquals(foo_layer.list_resources("", True),["root.confml"])
+        self.assertEquals(store.list_resources("", True),["bar/confml/root.confml","foo/root.confml"])
+        shutil.rmtree("temp/layertest")
+
+    def test_list_confml(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("confml/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_confml(),['confml/foo.confml', 'confml/test.confml'])
+        shutil.rmtree("temp/layertest")
+
+    def test_list_implml(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("implml/stuff/test.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("confml/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_implml(),['implml/stuff/test.confml'])
+        shutil.rmtree("temp/layertest")
+
+    def test_list_content(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("content/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("content/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_content(),['content/foo.confml', 'content/bar/test.txt'])
+        shutil.rmtree("temp/layertest")
+
+    def test_list_doc(self):
+        store = self.storage_class("temp/layertest","w")
+        layer = api.Layer(store, "foo")
+        res = layer.open_resource("doc/bar/test.txt","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("doc/foo.confml","w")
+        res.write("foo.conf")
+        res.close()
+        res = layer.open_resource("root.confml","w")
+        res.write("foo.conf")
+        res.close()
+        self.assertEquals(layer.list_doc(),['doc/foo.confml', 'doc/bar/test.txt'])
+        shutil.rmtree("temp/layertest")
+
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_filestorage_vs_zipstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,186 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the import export functionality
+"""
+
+import unittest
+import sys, os, shutil
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from cone.public.api import Resource
+from cone.storage import filestorage, zipstorage
+
+from testautomation.base_testcase import BaseTestCase
+from testautomation.unzip_file import unzip_file
+
+def abspath(p):
+    return os.path.normpath(os.path.join(ROOT_PATH, p))
+    
+DATA_ZIP = abspath("file_vs_zip_data.zip")
+TEMP_DIR = abspath("temp/file_vs_zip")
+
+EXPECTED = [
+    # These two are not used every time
+    ('folder',      'dir'),
+    ('folder',      'empty2'),
+    
+    ('folder',      'dir/emptysub'),
+    ('folder',      'empty'),
+    ('folder',      'empty2/sub'),
+    ('resource',    'root.txt'),
+    ('resource',    'dir/test1.txt'),
+    ('resource',    'dir/test2.txt'),
+]
+
+class TestFileStorageVsZipStorage(BaseTestCase):
+    def setUp(self):
+        pass
+    
+    def get_temp_zip_storage(self, path, empty=False):
+        """
+        Get a new zip storage located in the temp/ directory.
+        
+        @param path: Path of the storage zip file relative to the temp/ directory.
+        @param empty: If False, the DATA_ZIP is copied to the location specified
+            by 'path' and returned as a read-only storage. If True, a new writable
+            empty storage is returned.
+        """
+        full_path = os.path.join(TEMP_DIR, path)
+        if not empty:
+            self.create_dir_for_file_path(full_path)
+            shutil.copy2(DATA_ZIP, full_path)
+            return zipstorage.ZipStorage(full_path, 'r')
+        else:
+            if os.path.exists(full_path):
+                os.remove(full_path)
+            return zipstorage.ZipStorage(full_path, 'w')
+    
+    def get_temp_file_storage(self, path, empty=False):
+        """
+        Get a new file storage located in the temp/ directory.
+        
+        @param path: Path of the storage directory relative to the temp/ directory.
+        @param empty: If False, the DATA_ZIP is extracted to the location specified
+            by 'path' and returned as a read-only storage. If True, a new writable
+            empty storage is returned.
+        """
+        full_path = os.path.join(TEMP_DIR, path)
+        if not empty:
+            unzip_file(DATA_ZIP, full_path, delete_if_exists=True)
+            return filestorage.FileStorage(full_path, 'r')
+        else:
+            self.recreate_dir(full_path)
+            return filestorage.FileStorage(full_path, 'w')
+    
+    def assert_storage_contains_expected(self, storage, empty_folders):
+        # Always list also empty folders, because empty_folders is False,
+        # they should not have been exported in the first place
+        resource_list = storage.list_resources('', recurse=True, empty_folders=True)
+        
+        expected = list(EXPECTED)
+        
+        # Remove empty folders from expected if necessary
+        if not empty_folders:
+            for i in reversed(xrange(len(expected))):
+                if expected[i][0] == 'folder':
+                    del expected[i]
+        
+        # If the actual list contains exactly 2 less entries, they are
+        # probably the root folders that are not present in every case
+        # (e.g. there is a resource 'my_dir/file.txt', so sometimes there
+        # is a folder 'my_dir' in the resource list, but not always)
+        if len(resource_list) == len(expected) - 2:
+            del expected[0:2]
+        
+        # Check that there is the same amount of resources/folders
+        self.assertEquals(len(expected), len(resource_list), "Expected %r, actual %r" % (expected, resource_list))
+        
+        # Check that all expected resources/folders are present in the storage
+        for type, ref in expected:
+            if type == 'resource':
+                self.assertTrue(storage.is_resource(ref), "(%r, %r) expected, but not a resource" % (type, ref))
+            elif type == 'folder':
+                self.assertTrue(storage.is_folder(ref), "(%r, %r) expected, but not a folder" % (type, ref))
+            else:
+                raise RuntimeError("Invalid type field in expected data")
+    
+    def _run_test_storage_to_storage(self, source_storage, target_storage, empty_folders):
+        try:
+            # Check that the source storage contains all expected in the first place
+            self.assert_storage_contains_expected(source_storage, True)
+            
+            # Export resources
+            resources = source_storage.list_resources('', recurse=True, empty_folders=empty_folders)
+            source_storage.export_resources(resources, target_storage, empty_folders=empty_folders)
+            
+            # Check that resources have been exported properly
+            self.assert_storage_contains_expected(target_storage, empty_folders)
+        finally:
+            source_storage.close()
+            target_storage.close()
+    
+    def test_export_file_to_file(self):
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_file_storage('f2f/source'),
+            target_storage  = self.get_temp_file_storage('f2f/target', empty=True),
+            empty_folders   = False)
+        
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_file_storage('f2f/ef_source'),
+            target_storage  = self.get_temp_file_storage('f2f/ef_target', empty=True),
+            empty_folders   = True)
+    
+    def test_export_zip_to_zip(self):
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_zip_storage('z2z/source.zip'),
+            target_storage  = self.get_temp_zip_storage('z2z/target.zip', empty=True),
+            empty_folders   = False)
+        
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_zip_storage('z2z/ef_source.zip'),
+            target_storage  = self.get_temp_zip_storage('z2z/ef_target.zip', empty=True),
+            empty_folders   = True)
+    
+    def test_export_zip_to_file(self):
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_zip_storage('z2f/source.zip'),
+            target_storage  = self.get_temp_file_storage('z2f/target', empty=True),
+            empty_folders   = False)
+        
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_zip_storage('z2f/ef_source.zip'),
+            target_storage  = self.get_temp_file_storage('z2f/ef_target', empty=True),
+            empty_folders   = True)
+    
+    def test_export_file_to_zip(self):
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_file_storage('f2z/source'),
+            target_storage  = self.get_temp_zip_storage('f2z/target.zip', empty=True),
+            empty_folders   = False)
+        
+        self._run_test_storage_to_storage(
+            source_storage  = self.get_temp_file_storage('f2z/ef_source'),
+            target_storage  = self.get_temp_zip_storage('f2z/ef_target.zip', empty=True),
+            empty_folders   = True)
+    
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_metadata.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,153 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF metadata file parsing routines
+"""
+import os, sys, unittest
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import utils, exceptions, api
+from cone.storage import metadata, stringstorage
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+emptytestdata  = '<?xml version="1.0" encoding="ASCII"?>'\
+'<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0"/>'
+
+
+testdata  = \
+'<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">'\
+'  <property name="cpf.name" value="test"/>'\
+'  <property name="cpf.description" value="just testing"/>'\
+'  <property name="cpf.viewId" value="Sample View"/>'\
+'  <property name="cpf.rootFile" value="root.confml"/>'\
+'  <property name="cpf.dataFile"/>'\
+'  <property name="cpf.author"/>'\
+'  <property name="cpf.version"/>'\
+'  <property name="cpf.product"/>'\
+'  <property name="cpf.customer"/>'\
+'  <property name="cpf.platform"/>'\
+'  <property name="cpf.release"/>'\
+'  <property name="cpf.date"/>'\
+'  <property name="cpf.owner"/>'\
+'</metadata>'\
+
+class TestMetadataReader(unittest.TestCase):
+    def setUp(self):
+        pass
+    
+    def test_create_meta_fromstring(self):
+        m = metadata.MetadataReader().fromstring(testdata)
+        self.assertTrue(m)
+        
+    def test_create_meta_fromstring(self):
+        m = metadata.MetadataReader().fromstring(testdata)
+        self.assertTrue(m.data.has_key('cpf.name'))
+        self.assertTrue(m.data.has_key('cpf.description'))
+        self.assertTrue(m.data.has_key('cpf.viewId'))
+        self.assertTrue(m.data.has_key('cpf.rootFile'))
+        self.assertEquals(m.data['cpf.name'], 'test')
+        self.assertEquals(m.data['cpf.description'], 'just testing')
+        self.assertEquals(m.data['cpf.viewId'], 'Sample View')
+        self.assertEquals(m.data['cpf.rootFile'], 'root.confml')
+
+    def test_str_to_meta_and_back(self):
+        meta = metadata.MetadataReader().fromstring(testdata)
+        str = metadata.MetadataWriter().tostring(meta,False)
+        self.assertTrue(str.find('cpf.name'))
+        
+    def test_get_property(self):
+        etree = ElementTree.fromstring('<property name="test" value="test"/>')
+        (key,value) = metadata.MetadataReader().get_property(etree)
+        self.assertEquals(key,'test')
+        self.assertEquals(value,'test')
+        
+    def test_get_property_with_only_key(self):
+        etree = ElementTree.fromstring('<property name="test"/>')
+        (key,value) = metadata.MetadataReader().get_property(etree)
+        self.assertEquals(key,'test')
+        self.assertEquals(value,'')
+
+class TestMetadataWriter(unittest.TestCase):
+    def setUp(self):
+        pass
+
+    def test_metadata_tostring(self):
+        meta = metadata.Metadata()
+        str = metadata.MetadataWriter().tostring(meta)
+        self.assertTrue(str,emptytestdata)
+
+    def test_metadata_with_values_tostring(self):
+        meta = metadata.Metadata()
+        meta.data['cpf.name'] = 'testing ss'
+        meta.data['cpf.description'] = 'foo faa'
+        str = metadata.MetadataWriter().tostring(meta)
+        self.assertTrue(str,'<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0"><property name="cpf.name" value="testing ss" /><property name="cpf.description" value="foo faa" /></metadata>')
+
+    def test_metadata_with_values_to_resource(self):
+        meta = metadata.Metadata()
+        meta.data['cpf.name'] = 'testing ss'
+        meta.data['cpf.description'] = 'foo faa'
+        storage = stringstorage.StringStorage("")
+        res = storage.open_resource(".metadata","w")
+        metadata.MetadataWriter().toresource(meta,res)
+        self.assertTrue(res.getvalue(),'<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0"><property name="cpf.name" value="testing ss" /><property name="cpf.description" value="foo faa" /></metadata>')
+
+    def test_metadata_from_meta_to_str_and_back(self):
+        meta = metadata.Metadata()
+        meta.data['cpf.name'] = 'testing ss'
+        meta.data['cpf.description'] = 'foo faa'
+        str = metadata.MetadataWriter().tostring(meta)
+        meta2 = metadata.MetadataReader().fromstring(str)
+        self.assertEqual(meta.data,meta2.data)
+
+    def test_incorrect_class_fails(self):
+        try:
+            class dummy:
+                pass 
+            str = metadata.MetadataWriter().tostring(dummy())
+            self.fail("Writing dummy class succeeds!")
+        except exceptions.IncorrectClassError,e:
+            pass
+        
+        
+    def test_set_property(self):
+        elem = ElementTree.Element('property')
+        prop = metadata.MetadataWriter().set_property(elem,'test','foof')
+        self.assertTrue(prop.get('name'),'test')
+        self.assertTrue(prop.get('value'),'foof')
+
+    def test_set_property_with_only_key(self):
+        elem = ElementTree.Element('property')
+        prop = metadata.MetadataWriter().set_property(elem,'test','')
+        self.assertEquals(prop.get('name'),'test')
+        self.assertEquals(prop.get('value'),None)
+
+
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_resource.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,48 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test Respource
+"""
+import unittest
+import string
+import sys,os
+import __init__
+
+from cone.public.api import Resource
+from cone.storage.stringstorage import StringResource
+
+class TestResource(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    def test_create_resource(self):
+        res = Resource("","",None)
+        self.assertTrue(res)
+
+class TestStringResource(unittest.TestCase):    
+    def setUp(self):
+        pass
+
+    def test_create_stringresource_with_data(self):
+        res = StringResource("","","Test data")
+        self.assertTrue(res)
+        self.assertEqual(res.read(),"Test data")
+
+    
+if __name__ == '__main__':
+    unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_stringstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import string
+import sys,os
+import pickle
+import __init__
+
+from cone.public import api
+from cone.storage import stringstorage
+
+class TestStringStorage(unittest.TestCase):
+    def test_internal_add_and_list(self):
+        store = api.Storage.open("test.pk","w")
+        store._add_to_path("test.foo.bar",stringstorage._StringStorageObject("test1.txt"))
+        store._add_to_path("test.foo.bar",stringstorage._StringStorageObject("test2.txt"))
+        self.assertEquals(store._get("test.foo.bar")._list(), 
+                          ['test1',
+                          'test2'])
+        store.close()
+        os.unlink("test.pk")
+
+    def test_internal_add_get_and_list(self):
+        store = api.Storage.open("test.pk","w")
+        obj = stringstorage._StringStorageObject("test1.txt")
+        store._add_to_path("test.foo.bar",obj)
+        store._add_to_path("test.foo.bar",stringstorage._StringStorageObject("test2.txt"))
+        obj.data = "Fooo"
+        self.assertEquals(store._get("test.foo.bar")._list(), 
+                          ['test1',
+                          'test2'])
+        self.assertEquals(store.test.foo.bar.test1.data,'Fooo')
+        store.close()
+        os.unlink("test.pk")
+
+    def test_internal_add_get_and_list_all(self):
+        store = api.Storage.open("test.pk","w")
+        store._add_to_path("test.foo.bar",stringstorage._StringStorageObject("test1.txt"))
+        store._add_to_path("test.foo.bar",stringstorage._StringStorageObject("test2.txt"))
+        store._add(stringstorage._StringStorageObject("root.txt"))
+        self.assertEquals(store._list_traverse(type=stringstorage._StringStorageObject), ['test.foo.bar.test1',
+                                                      'test.foo.bar.test2',
+                                                      'root'])
+        store.close()
+        os.unlink("test.pk")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_webstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,110 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import string
+import sys,os
+import pickle
+import time
+import __init__
+
+from cone.public import api, exceptions
+from cone.storage import webstorage
+from cone.carbon import model
+import simplewebserver
+
+ROOT_PATH   = os.path.dirname(os.path.abspath(__file__))
+TEST_SERVER = simplewebserver.SimpleWebServer(os.path.join(ROOT_PATH,'carbondata'), 8001)
+#
+#def runserver():
+#    if not TEST_SERVER.active:
+#        TEST_SERVER.start()
+#        time.sleep(1)
+#
+#def stopserver():
+#    if TEST_SERVER.active:
+#        TEST_SERVER.stop()
+#
+#class TestWebStorage(unittest.TestCase):
+#    def setUp(self):
+#        runserver()
+#
+#    def __del__(self):
+#        stopserver()
+#
+#    def test_create_web_storage(self):
+#        store = webstorage.WebStorage('localhost:8001/extapp')
+#
+#
+#    def test__get_stringio_from_path(self):
+#        store = webstorage.WebStorage('localhost:8001/extapp')
+#        strio = store._get_stringio_from_path('alvin.confml')
+#        self.assertTrue(len(strio.getvalue()) > 0)
+#
+#    def test__get_stringio_from_path_fails(self):
+#        
+#        store = webstorage.WebStorage('localhost:8001/extapp')
+#        try:
+#            strio = store._get_stringio_from_path('foobar.confml')
+#            self.fail('Getting nonexistent file succeeds?')
+#        except exceptions.NotResource:
+#            pass
+#
+#
+#    def test_get_resource_from_path(self):
+#        store = webstorage.WebStorage('localhost:8001/extapp')
+#        wres = store.open_resource('test/empty.confml')
+#        self.assertTrue(len(wres.read()) == 0)
+#
+#    def test_get_resource_fails(self):
+#        store = webstorage.WebStorage('localhost:8001/extapp')
+#        try:
+#            wres = store.open_resource('foobar.confml')
+#            self.fail('test')
+#        except exceptions.NotResource:
+#            pass
+
+class TestResourceCache(unittest.TestCase):
+#    def test_create_resource_cache_add_configurations(self):
+#        rc = webstorage.ResourceCache()
+#        conf = model.ConfigurationResource(**{'parent_config': 'hessu', 'path': 'NCP/Testing', 'version_identifier': '0.1', 'configuration_name': 'Testing'})
+#        rc.add_configuration(conf)
+#        self.assertEquals(rc.list_resources('/'), ['Testing.confml'])
+#        self.assertEquals(rc.list_resources('/', True), ['Testing.confml', 'NCP/Testing/root.confml'])
+#        self.assertEquals(rc.get_resource('Testing.confml').name, 'Testing_confml')
+#        self.assertEquals(isinstance(rc.get_resource('Testing.confml'),model.CarbonConfiguration),True)
+#        self.assertEquals(rc.get_resource('Testing.confml').list_configurations(),['NCP/Testing/root.confml'])
+
+    def test_create_resource_cache_from_resource_list(self):
+        reslist = ['test.configurationroot',
+                   'test.configurationlayer',
+                   'test.featurelist']
+        rc = webstorage.ResourceCache()
+        for res in reslist:
+            rc.add_resource(res)
+        self.assertEquals(rc.list_resources('/'), ['test.confml'])
+        self.assertEquals(rc.list_resources('/', True), ['test/root.confml',
+                                                   'featurelists/test.confml',
+                                                   'test.confml'])
+        self.assertEquals(rc.get_resource_link('test.confml'), 'test.configurationroot')
+        self.assertEquals(rc.get_resource_link('featurelists/test.confml'), 'test.featurelist')
+        self.assertEquals(rc.get_resource_link('test/root.confml'), 'test.configurationlayer')
+    
+
+
+if __name__ == '__main__':
+    unittest.main()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_webstorage_carbon.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,246 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import string
+import sys,os
+import pickle
+import time
+import __init__
+
+from cone.public import api, exceptions
+from cone.storage import webstorage
+from cone.carbon import model, persistentjson
+import simplewebserver
+
+featurelist = {
+    "featurelist": {
+        "features": [
+            {
+                "status": "APPROVED", 
+                "value_type": "", 
+                "description": "None", 
+                "title": "TestGroup", 
+                "ref": "testgroup", 
+                "type": "featuregroup", 
+                "id": 11749, 
+                "children": [
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "None", 
+                        "title": "Child1", 
+                        "ref": "child1", 
+                        "type": "feature", 
+                        "id": 11750, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "None", 
+                        "title": "Child1", 
+                        "ref": "child1_1", 
+                        "type": "feature", 
+                        "id": 11751, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "None", 
+                        "title": "Child1", 
+                        "ref": "child1_2", 
+                        "type": "feature", 
+                        "id": 11753, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "Needs description", 
+                        "title": "Child1", 
+                        "ref": "child1_3", 
+                        "type": "feature", 
+                        "id": 11756, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "Needs description", 
+                        "title": "Child1", 
+                        "ref": "child1_4", 
+                        "type": "feature", 
+                        "id": 11759, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "None", 
+                        "title": "Child2", 
+                        "ref": "child2", 
+                        "type": "feature", 
+                        "id": 11754, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "Needs description", 
+                        "title": "Child2", 
+                        "ref": "child2_1", 
+                        "type": "feature", 
+                        "id": 11757, 
+                        "children": []
+                    }, 
+                    {
+                        "status": "APPROVED", 
+                        "value_type": "boolean", 
+                        "description": "Needs description", 
+                        "title": "Child2", 
+                        "ref": "child2_2", 
+                        "type": "feature", 
+                        "id": 11760, 
+                        "children": []
+                    }
+                ]
+            }, 
+            {
+                "status": "APPROVED", 
+                "value_type": "", 
+                "description": "Needs description", 
+                "title": "TestGroup", 
+                "ref": "testgroup_3", 
+                "type": "featuregroup", 
+                "id": 11758, 
+                "children": []
+            }, 
+            {
+                "status": "APPROVED", 
+                "value_type": "", 
+                "description": "None", 
+                "title": "TestGroup", 
+                "ref": "testgroup_1", 
+                "type": "featuregroup", 
+                "id": 11752, 
+                "children": []
+            }, 
+            {
+                "status": "APPROVED", 
+                "value_type": "", 
+                "description": "Needs description", 
+                "title": "TestGroup", 
+                "ref": "testgroup_2", 
+                "type": "featuregroup", 
+                "id": 11755, 
+                "children": []
+            }
+        ], 
+        "list_version_id": 34, 
+        "expanded": True, 
+        "version_identifier": "WORKING", 
+        "is_latest_version": True, 
+        "list_id": 37, 
+        "path": "TEST4", 
+        "version_title": "TEST4 (WORKING)", 
+        "can_be_released": True, 
+        "type": "featurelist", 
+        "has_external_relations": False
+    }
+}
+ROOT_PATH   = os.path.dirname(os.path.abspath(__file__))
+#class TestWebStorage(unittest.TestCase):
+#    def setUp(self):
+#        self.store = webstorage.WebStorage('http://localhost:8000/extapi')
+#        
+#    def test_create_and_list_resources(self):
+#        files = self.store.list_resources('/')
+#        print files
+#        self.assertTrue(len(files)>0)
+##
+#    def test_create_and_list_resources_with_non_existing_folder(self):
+#        files = self.store.list_resources('foo')
+#        self.assertEquals(files,[])
+#        files = self.store.list_resources('foo/')
+#        self.assertEquals(files,[])
+#        files = self.store.list_resources('foo/bar')
+#        self.assertEquals(files,[])
+#
+#    def test_get_resource(self):
+#        res = self.store.open_resource('Zoom.confml')
+##        resdata = res.read()
+##        self.assertTrue(len(resdata) > 0)
+#
+#    def test_get_resource_fails(self):
+#        try:
+#            res = self.store.open_resource('Zoomi.confml')
+#            self.fail('Opening non existing resource succeeds')
+#            
+#        except exceptions.NotResource, e:
+#            pass
+#
+#    def test_is_resource(self):
+#        ret = self.store.is_resource('Zoom.confml')
+#        self.assertTrue(ret)
+#
+#    def test_is_resource_false(self):
+#        ret = self.store.is_resource('Foobar.confml')
+#        self.assertFalse(ret)
+
+class TestCarbonExtapi(unittest.TestCase):
+    def setUp(self):
+        pass
+
+#    def test_create_feature(self):
+#        extapi = webstorage.CarbonExtapi('http://localhost:8000/extapi')
+#        self.assertTrue(extapi.create_feature('TEST4.featurelist',model.CarbonSetting('TestGroup')))
+#        self.assertTrue(extapi.create_feature('TEST4.featurelist',model.CarbonBooleanSetting('Child1'), 'TestGroup'))
+#        self.assertTrue(extapi.create_feature('TEST4.featurelist',model.CarbonBooleanSetting('Child2'), 'TestGroup'))
+#
+#    def test_create_feature_fails(self):
+#        extapi = webstorage.CarbonExtapi('http://localhost:8000/extapi')
+#        self.assertFalse(extapi.create_feature('TEST4.featurelist',model.CarbonSetting('Foobar2'), 'TestGroup'))
+#
+#    def test_create_featurelist(self):
+#        extapi = webstorage.CarbonExtapi('http://localhost:8000/extapi')
+#        self.assertTrue(extapi.create_featurelist('TEST.featurelist',model.FeatureList(name='TEST9')))
+
+#    def test_update_featurelist(self):
+#        extapi = webstorage.CarbonExtapi('http://localhost:8000/extapi', password='terytkone09')
+#        fl = model.FeatureList(name='TEST9')
+#        fl.add_feature(model.CarbonFeature('Test1'))
+#        data = persistentjson.dumps(fl)
+#        data = {"features" :[],
+#                "version_identifier": "WORKING", 
+#                "flv_description": "Needs description", 
+#                "path": "TEST9.confml", 
+#                "type": "featurelist", 
+#                "name": "TEST9"}
+#        print "data %s" % data
+#        self.assertTrue(extapi.update_resource('TEST9.featurelist',data))
+
+#    def test_create_configuration(self):
+#        extapi = webstorage.CarbonExtapi('http://localhost:8000/extapi', password='terytkone09')
+#        conf = model.CarbonConfiguration(path='Testing3.confml')
+#        (success,conf)= extapi.create_configuration('Testing3.configuration',conf)
+#        self.assertTrue(success)
+
+
+if __name__ == '__main__':
+    unittest.main()
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_zipresource.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import sys,os,shutil
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+import __init__
+from cone.public.exceptions import *
+from cone.public.api import Resource
+from cone.storage import zipstorage
+
+TEMP_DIR = os.path.join(ROOT_PATH, 'temp')
+tempzip   = os.path.join(ROOT_PATH,"zipres_test.zip")
+
+
+class TestFileResource(unittest.TestCase):
+    
+    def _prepare_tempzip(self, filename):
+        """
+        Prepare a temporary ZIP file with the given name.
+        @return: Absolute path to the newly copied ZIP file.
+        """
+        new_zip = os.path.join(TEMP_DIR, '%s' % filename)
+        
+        if os.path.exists(new_zip):
+            os.unlink(new_zip)
+        
+        if not os.path.exists(TEMP_DIR):
+            os.makedirs(TEMP_DIR)
+        
+        shutil.copyfile(tempzip, new_zip)
+        return new_zip
+    
+    def test_open_and_write_resource(self):
+        ZIPFILE = self._prepare_tempzip('test1.zip')
+        store = zipstorage.ZipStorage(ZIPFILE,"a")
+        res = store.open_resource("temp/testwrite.txt","w")
+        testdata = "Testing writing func!"
+        res.write(testdata)
+        res.close()
+        store.close()
+        zf = zipfile.ZipFile(ZIPFILE,"r")
+        data = zf.read("temp/testwrite.txt")
+        self.assertEquals(data,testdata)
+
+    def test_open_and_read_resource(self):
+        ZIPFILE = self._prepare_tempzip('test2.zip')
+        store = zipstorage.ZipStorage(ZIPFILE,"a")
+        res = store.open_resource("temp/testread.txt","r")
+        resdata = res.read()
+        res.close()
+        store.close()
+        self.assertTrue(resdata.startswith("Hello"))  
+    
+    def test_get_size(self):
+        ZIPFILE = self._prepare_tempzip('test_getsize.zip')
+        store = zipstorage.ZipStorage(ZIPFILE, "r")
+        res = store.open_resource("temp/testread.txt","r")
+        self.assertEquals(res.get_size(), 28)
+        # Try a second time just in case
+        self.assertEquals(res.get_size(), 28)
+        res.close()
+        store.close()
+    
+    def test_get_size_largefile(self):
+        ZIPFILE = self._prepare_tempzip('test_getsize_largefile.zip')
+        store = zipstorage.ZipStorage(ZIPFILE, "r")
+        res = store.open_resource("largefile.bin","r")
+        self.assertEquals(res.get_size(), 25000)
+        # Try a second time just in case
+        self.assertEquals(res.get_size(), 25000)
+        res.close()
+        store.close()
+    
+    def test_get_size_fails_in_write_mode(self):
+        ZIPFILE = os.path.join(TEMP_DIR, 'getsize_fails_in_write_mode.zip')
+        store = zipstorage.ZipStorage(ZIPFILE, "w")
+        res = store.open_resource("test_getsize.txt", "w")
+        res.write("Writing foobar")
+        self.assertRaises(StorageException, res.get_size)
+        res.close()
+        store.close()
+
+    def test_get_content_info_and_read_data(self):
+        ZIPFILE = self._prepare_tempzip('test2.zip')
+        store = zipstorage.ZipStorage(ZIPFILE,"a")
+        res = store.open_resource("temp/testread.txt","r")
+        ci = res.get_content_info()
+        self.assertEquals('text/plain', ci.content_type)
+        resdata = res.read()
+        self.assertEquals('Hello!\r\nHow is my reading?\r\n', resdata)
+        res.close()
+        store.close()
+
+        
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/tests/unittest_zipstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,255 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+"""
+Test the CPF root file parsing routines
+"""
+
+import zipfile
+import unittest
+import string
+import sys,os,shutil
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+import __init__
+from cone.public import exceptions, api
+from cone.storage import zipstorage
+
+datazip   = os.path.join(ROOT_PATH,"data.zip")
+
+#class TestZipStorageDummy(unittest.TestCase): 
+#    def test_open_storage(self):
+#        storage = zipstorage.ZipStorage("TestProlog.zip","r")
+#        res = storage.open_resource("TestProlog")
+#        storage.close()
+
+class TestZipStorage(unittest.TestCase): 
+    def test_create_new_storage(self):
+        storage = zipstorage.ZipStorage("new.zip","w")
+        storage.close()
+        self.assertTrue(os.path.exists("new.zip"))
+        os.unlink("new.zip")
+        
+    def test_open_existing_storage(self):
+        storage = zipstorage.ZipStorage(datazip,"r")
+        storage.close()
+
+    def test_open_existing_storage_and_close_twice(self):
+        storage = zipstorage.ZipStorage(datazip,"r")
+        storage.close()
+        try:
+            storage.close()
+            self.fail('closing twice succeeds!')
+        except exceptions.StorageException:
+            pass
+
+    def test_open_nonexisting_storage_fails(self):
+        try:
+            storage = zipstorage.ZipStorage("foo.zip","r")
+            storage.close()
+            self.fail("opening a non existing ZipStorage succeeded?")
+        except zipstorage.ZipException:
+            self.assertTrue(True)
+  
+    def test_open_a_non_zipfile_fails(self):
+        try:
+            storage = zipstorage.ZipStorage("data/onefile/test.txt","r")
+            storage.close()
+            self.fail("opening a non zipfile for ZipStorage succeeded?")
+        except zipstorage.ZipException,e:
+            self.assertTrue(True)
+
+class TestStorage(unittest.TestCase):
+    def setUp(self):
+        shutil.copyfile(datazip,"temptests.zip")
+        self.storage = zipstorage.ZipStorage("temptests.zip","a")
+
+    def tearDown(self):
+        self.storage.close()
+        os.unlink("temptests.zip")
+
+    def test_open_resource_existing_file_for_reading(self):
+        res = self.storage.open_resource("data/simple.confml","w")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+
+    def test_open_resource_new_file(self):
+        storage = zipstorage.ZipStorage("testnewfile.zip","w")
+        res = storage.open_resource("data/newfile.txt","w")
+        res.write("test write")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+        res.close()
+        self.assertEquals(storage.list_resources("",True), ['data/newfile.txt'])
+        storage.close()
+        os.unlink("testnewfile.zip")
+        
+
+    def test_open_resource_nonexisting(self):
+        try:
+            res = self.storage.open_resource("iamnothere.txt")
+            self.fail("Opening of a non existing file succeeds!??")
+        except exceptions.NotResource: 
+            self.assertTrue(True)
+
+    def test_list_resources_nonrecurse(self):
+        storage = zipstorage.ZipStorage("testnonrecurse.zip","w")
+        res = storage.open_resource("data/morestuff.confml","w")
+        res.close()
+        res = storage.open_resource("data/prodX.confml","w")
+        res.close()
+        file_array = storage.list_resources("data")
+        self.assertEquals(file_array[0],"data/morestuff.confml")
+        self.assertEquals(file_array[1],"data/prodX.confml")
+        storage.close()
+        os.unlink("testnonrecurse.zip")
+
+    def test_list_resources_recurse(self):
+        storage = zipstorage.ZipStorage("testrecurse.zip","w")
+        res = storage.open_resource("data/foo/morestuff.confml","w")
+        res.close()
+        res = storage.open_resource("data/prodX.confml","w")
+        res.close()
+        res = storage.open_resource("data/ncp11/confml/jallaa.confml","w")
+        res.close()
+        file_array = storage.list_resources("data",True)
+        self.assertEquals(file_array,['data/foo/morestuff.confml', 'data/prodX.confml', 'data/ncp11/confml/jallaa.confml'])
+        storage.close()
+        os.unlink("testrecurse.zip")
+
+    def test_is_resource_true(self):
+        res = self.storage.open_resource("data/simple.confml","w")
+        res.close()
+        self.assertTrue(self.storage.is_resource("data/simple.confml"))
+
+    def test_is_resource_true_for_dotted_file(self):
+        res = self.storage.open_resource(".metadata","w")
+        res.close()
+        self.assertTrue(self.storage.is_resource(".metadata"))
+
+    def test_is_resource_true_with_slash(self):
+        res = self.storage.open_resource("data/simple.confml","w")
+        res.close()
+        self.assertTrue(self.storage.is_resource("/data/simple.confml"))
+
+    def test_is_resource_false(self):
+        self.assertFalse(self.storage.is_resource("data"))
+
+    def test_metadata_writing(self):
+        fs = zipstorage.ZipStorage("testtemp.zip","w")
+        fs.set_active_configuration('testing.confml')
+        fs.close()
+        fs = zipstorage.ZipStorage("testtemp.zip","r")
+        self.assertEquals(fs.get_active_configuration(),'testing.confml')
+        fs.close()
+        os.unlink("testtemp.zip")
+
+    def test_open_resource_new_file_and_overwrite(self):
+        storage = api.Storage.open("testoverwrite.zip","w")
+        res = storage.open_resource("data/newfile.txt","w")
+        res.write("test write")
+        self.assertTrue(res)
+        self.assertTrue(isinstance(res,api.Resource))
+        res.close()
+        res = storage.open_resource("data/newfile.txt","w")
+        res.write("Hahaaa")
+        res.close()
+        storage.close()
+        storage = api.Storage.open("testoverwrite.zip","r")
+        self.assertEquals(storage.open_resource("data/newfile.txt").read(), "Hahaaa")
+        storage.close()
+        os.unlink("testoverwrite.zip")
+
+    def test_delete_resource(self):
+        storage = api.Storage.open("testdelete.zip","w")
+        res = storage.open_resource("data/newfile.txt","w")
+        res.write("test write")
+        res.close()
+        res = storage.open_resource("readme.txt","w")
+        res.write("test 2")
+        res.close()
+        storage.close()
+        storage2 = api.Storage.open("testdelete.zip","a")
+        #self.assertEquals(storage2.list_resources("",True), ['.metadata', 'data/newfile.txt', 'readme.txt'])
+        self.assertEquals(storage2.open_resource("data/newfile.txt").read(),"test write")
+        storage2.delete_resource("data/newfile.txt")
+        self.assertEquals(len(storage2.list_resources("",True)),2)
+        storage2.close()
+        storage3 = api.Storage.open("testdelete.zip","a")
+        self.assertEquals(storage3.list_resources("",True), ['readme.txt','.metadata'])
+        storage3.close()
+        os.unlink("testdelete.zip")
+        
+
+    def test_create_folder(self):        
+        storage = api.Storage.open("empty_folder.zip","w")
+        res = storage.open_resource("test.txt","w")
+        res.write('test')
+        res.close()
+        storage.create_folder("data")
+        storage.create_folder("data2/folder1")
+        storage.create_folder("data3\\")
+        storage.close()
+        
+        storage2 = api.Storage.open("empty_folder.zip","a")
+        self.assertEquals(storage2.is_folder("data"),True)
+        self.assertEquals(storage2.is_folder("data2/folder1"),True)
+        self.assertEquals(storage2.is_folder("data3"),True)
+        self.assertEquals(storage2.list_resources('.',True),['test.txt','.metadata'])
+        self.assertEquals(storage2.list_resources(''),['test.txt','.metadata'])
+        storage2.close()
+        os.unlink("empty_folder.zip")
+
+class TestZipStorageListResources(unittest.TestCase):
+    
+    def _run_test_list_resources(self, zip_file):
+        full_path = os.path.join(ROOT_PATH, 'list_resources_data', zip_file)
+        zs = zipstorage.ZipStorage(full_path, 'r')
+        res_list = zs.list_resources('/', recurse=True, empty_folders=True)
+        
+        expected = [
+            ('folder',      'test'),
+            ('folder',      'test/layer'),
+            ('folder',      'test/layer/confml'),
+            ('folder',      'test/layer/content'),
+            ('folder',      'test/layer/content/empty'),
+            ('folder',      'test/layer/content/something'),
+            ('resource',    'test/layer/content/something/x.txt'),
+            ('folder',      'test/layer/doc'),
+            ('folder',      'test/layer/implml'),
+            ('resource',    'test/layer/root.confml'),
+            ('resource',    'test/root.confml')]
+        for type, res in expected:
+            if type == 'resource':
+                self.assertTrue(zs.is_resource(res), "zs.is_resource('%s') returns False" % res)
+            elif type == 'folder':
+                self.assertTrue(zs.is_folder(res), "zs.is_folder('%s') returns False" % res)
+            else:
+                raise RuntimeError('Invalid type')
+    
+    def test_list_resources_7zip_zipped(self):
+        self._run_test_list_resources('7zip.zip')
+    
+    def test_list_resources_winzip_zipped(self):
+        self._run_test_list_resources('winzip.zip')
+    
+    def test_list_resources_carbide_ct_zipped(self):
+        self._run_test_list_resources('carbide.ct.cpf')
+    
+if __name__ == '__main__':
+      unittest.main()
Binary file configurationengine/source/cone/storage/tests/zipres_test.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/webstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,621 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import getpass
+import StringIO
+import os
+import re
+import copy
+import logging
+import httplib
+import urllib, urllib2
+import simplejson
+import posixpath
+
+from cone.public import *
+from cone.carbon import persistentjson, model
+from cone.storage import authenticate
+
+class WebStorage(api.Storage):
+    """
+    A general base class for all storage type classes
+    @param path : the reference to the root of the storage.
+    """
+    
+    def __init__(self, path, mode="a", **kwargs):
+        api.Storage.__init__(self,path)
+        self.mode = mode
+        self.extapi = CarbonExtapi(path, **kwargs)
+        self.persistentmodule = persistentjson
+        
+        # resource cache is a intermediate solution to create a mapping between carbon objects and Configuration project
+        self._resource_cache = None
+        
+
+    def _create_resource(self, path, object):
+        """
+        Create a new resource (configuration|featurelist) to carbon storage.
+        """
+        # Test the path, whether it is a featurelist or configuration
+        try:
+            object_type = object.meta.get('type')
+        except (TypeError,AttributeError):
+            logging.getLogger('cone').error('Cannot dump configuration %s to webstorage without a type.' % path)
+            return False
+        carbonpath = persistentjson.CarbonResourceMapper().map_confml_resource(object_type, path)
+        if object_type == 'featurelist':
+            # Create a featurelist 
+            success = self.extapi.create_featurelist(carbonpath, object)
+            if success:
+                self.resource_cache.add_resource_link(path, carbonpath)
+            return success
+        else:
+            # Create a configuration
+            success = self.extapi.create_configuration(carbonpath, object)
+            if success:
+                self.resource_cache.add_resource_link(path, carbonpath)
+            return success
+
+    @classmethod
+    def supported_storage(cls,path):
+        """
+        Class method for determing if the given clas supports a storage by given path. 
+        E.g. http://foo.com/
+        @param path:
+        @return: Boolean value. True if the storage of the path is supported. False if not.  
+        """
+        if path.startswith('http://'):
+            return True
+        else:
+            return False
+
+    @property
+    def resource_cache(self):
+        """
+        Returns a resource cache dictionary of all the resources inside the Carbon storage. Works as an intermediate 
+        solution to link Configuration project concepts to Carbon storage
+        
+        """
+        if not self._resource_cache: 
+            self._resource_cache = ResourceCache()
+            reslist = self.extapi.list_resources("/", True)
+            # Append all resources to resource cache
+            for res in reslist:
+                self._resource_cache.add_resource(res)
+#                    if isinstance(res, model.ConfigurationResource):
+#                        self._resource_cache.add_configuration(res)
+#                    elif isinstance(res, model.FeatureListResource):
+#                        self._resource_cache.add_featurelist(res)
+        return self._resource_cache
+
+    def list_resources(self,path, recurse=False, empty_folders=False):
+        """
+        find the resources under certain path/path 
+        @param path : reference to path where resources are searched
+        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
+        Default value is False. Set to True to enable recursion.
+        @param empty_folders: parameters that defined whether empty folders are included. This parameter is ignored 
+        in WebStorage. 
+        """
+        return self.resource_cache.list_resources(path,recurse)
+
+
+    def open_resource(self,path,mode="r"):
+        path = utils.resourceref.remove_begin_slash(path)
+        if self.resource_cache.get_resource_object(path):
+            return self.resource_cache.get_resource_object(path)
+        elif self.resource_cache.get_resource_link(path):
+            path = self.resource_cache.get_resource_link(path)
+        
+#        path = path.replace(".confml", ".configuration")
+#        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        try:
+            if self.get_mode(mode) == self.MODE_READ:
+                strio = self.extapi._get_stringio_from_path(path)
+            elif self.get_mode(mode) == self.MODE_APPEND:
+                strio = self.extapi._get_stringio_from_path(path)
+                strio.seek(0, os.SEEK_END)
+            elif self.get_mode(mode) == self.MODE_WRITE:
+                strio = StringIO.StringIO()
+            else:
+                raise StorageException("Unrecognized mode %s" % mode)
+            res = WebResource(self,path,mode,strio)
+            self.__opened__(res)
+            return res
+        except KeyError:
+            raise exceptions.NotResource("The given resource is not found %s" % path)
+
+    def is_resource(self,path):
+        return self.resource_cache.is_resource(path)
+#        path = path.replace(".confml", ".configuration")
+#        path = utils.resourceref.join_refs([self.get_current_path(), path])
+#        try:
+#            query = urllib.quote(self._get_action_url('is_resource', path))
+#            self.conn.request("GET", query)
+#            resp = self.conn.getresponse()
+#            reader = persistentjson.HasResourceReader()
+#            return reader.loads(resp.read())
+#        except exceptions.NotFound:
+#            return False
+
+    def save_resource(self, res):
+        """
+        Close resource is no-operation action with webstorage for now
+        """
+        return 
+
+    def close_resource(self, path):
+        """
+        Close resource is no-operation action with webstorage
+        """
+        return 
+
+    def export_resources(self, paths, storage, empty_folders=False):
+        for path in paths:
+            if not self.is_resource(path):
+                logging.getLogger('cone').warning("The given path is not a Resource in this storage %s! Ignoring from export!" % path)
+                continue
+            wres = storage.open_resource(path,'wb')
+            res  = self.open_resource(path,"rb")
+            wres.write(res.read())
+            wres.close()
+            res.close()
+
+    def unload(self, path, object):
+        """
+        Dump a given object to the storage (reference is fetched from the object)
+        @param object: The object to dump to the storage, which is expected to be an instance 
+        of Base class.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        print "unload %s" % path
+        if not isinstance(object, api.Configuration):
+            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
+        # Skip the unload storing to storage if the storage is opened in read mode
+        if self.get_mode(self.mode) != api.Storage.MODE_READ:
+            if self.resource_cache.get_resource_link(path):
+                path = self.resource_cache.get_resource_link(path)
+            else:
+                """ otherwise create the new resource first before update"""
+                if self._create_resource(path, object):
+                    path = self.resource_cache.get_resource_link(path)
+                else:
+                    # Creation failed
+                    logging.getLogger('cone').error('Creation of %s resource failed' % path)
+                    return 
+            data = persistentjson.dumps(object)
+            self.extapi.update_resource(path, data)
+        else:
+            raise exceptions.StorageException("Cannot dump object to readonly storage")
+        return
+
+    def load(self, path):
+        """
+        Load resource from a path.
+        """
+        # Check if the object is already cached or has a cached link to another resource to load
+        path = utils.resourceref.remove_begin_slash(path)
+        print "load %s" % path
+        if self.resource_cache.get_resource_link(path):
+            path = self.resource_cache.get_resource_link(path)
+        elif self.resource_cache.get_mapped_resource(path):
+            path = self.resource_cache.get_mapped_resource(path)
+        elif not utils.resourceref.get_ext(path) == "confml":
+            raise exceptions.StorageException("Cannot load reference type %s" % utils.resourceref.get_ext(path))
+        else:
+            # Add the current path in front of the given path
+            path = utils.resourceref.join_refs([self.get_current_path(), path])
+            if not self.is_resource(path):
+                raise exceptions.NotResource("No such %s resource!" % path)
+
+        res = self.open_resource(path,"r")
+        # read the resource with persistentmodule
+        try:
+            obj = self.persistentmodule.loads(res.read())
+            #obj.set_path(path)
+            res.close()
+            return obj
+        except exceptions.ParseError,e:
+            logging.getLogger('cone').error("Resource %s parsing failed with exception: %s" % (path,e))
+            # returning an empty config in case of xml parsing failure.
+            return api.Configuration(path)
+
+    def close(self):
+        """ No operation in web storage close """
+        pass
+
+
+class WebResource(api.Resource):
+    def __init__(self,storage,path,mode,handle):
+        api.Resource.__init__(self,storage,path,mode)
+        self.handle = handle
+
+    def read(self,bytes=0):
+        if bytes == 0:
+            return self.handle.read()
+        else:
+            return self.handle.read(bytes)
+    
+    def write(self,string):
+        if self.get_mode() == api.Storage.MODE_READ:
+            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
+        else:
+            self.handle.write(string)
+
+    def truncate(self,size=0):
+        raise exceptions.NotSupportedException()
+
+    def flush(self):
+        self.storage.flush_resource(self)
+
+    def close(self):
+        self.storage.close_resource(self)
+        self.handle.close()
+    
+    def get_size(self):
+        if self.get_mode() == api.Storage.MODE_WRITE:
+            raise exceptions.StorageException("Reading resource size attempted to %s in write-only mode." % self.path)
+        return len(self.handle.getvalue())
+    
+    def getvalue(self):
+        return self.handle.getvalue()
+
+
+class CarbonExtapi(object):
+    ACTIONS = { 'open_resource' : 'get_resource',
+                'list_resources' : 'list_resources',
+                'is_resource' : 'has_resource',
+                'put_resource' : 'put_resource',
+                'update_resource' : 'update_resource'   }
+    
+    """
+    A general container for Carbon extapi action
+    """
+    def __init__(self, path, **kwargs):
+        self.path = path
+        self.server_path = ''
+        self.service_path = ''
+        if path.startswith('http://'):
+            path = path.replace('http://','',1)
+        pathelems = path.split('/',1)
+        self.server_path = pathelems[0]
+        if len(pathelems) > 1: 
+            self.service_path = pathelems[1]
+        self._username = kwargs.get('username', None)
+        self._password = kwargs.get('password', None)
+        authhandler = authenticate.CarbonAuthHandler()
+        authhandler.add_password(self.username, self.password)
+        self.conn = urllib2.build_opener(urllib2.HTTPCookieProcessor, authhandler, urllib2.ProxyHandler({}))
+        
+    @property
+    def username(self):
+        if self._username == None:
+            self._username = getpass.getuser()
+        return self._username 
+
+    @property
+    def password(self):
+        if self._password == None:
+            self._password = getpass.getpass()
+        return self._password
+
+    def checklogin(self):
+        """
+        Checks that we are logged in by loading the main page.
+        If we are not logged in it will redirect us to login page.
+        """
+        loginurl = "http://%(host)s/" % dict(host=self.server_path)
+        loginreq = urllib2.Request(loginurl)
+        print 'Checking login by opening URL %s ...' % loginurl
+        try:
+            resp = self.conn.open(loginreq)
+        except urllib2.URLError, e:
+            print str(e)
+            return False
+        return True
+    
+    def _get_stringio_from_path(self,path):
+        """ 
+        return a StringIO object containing the data under a given path.
+        @return: StringIO buffer
+        @raise exception.NotResource: if the resource under path is not found 
+        """
+        path = utils.resourceref.remove_begin_slash(path)
+        action_url = self._get_action_url('open_resource', path)
+        req = urllib2.Request(action_url)
+        try:
+            resp = self.conn.open(req)
+            bytes = resp.read()
+            strio = StringIO.StringIO(bytes)
+            return strio
+        except urllib2.HTTPError,e:
+            raise exceptions.NotResource("The given path %s could not be retrived from this storage. Server returned status %s." % (path, e))
+
+    def _get_action_url(self, action, path, **kwargs):
+        path = utils.resourceref.remove_begin_slash(path)
+        return "%s/%s/%s" % (self.path,self.ACTIONS[action], urllib.quote(path))
+    
+    def list_resources_for_type(self,path,type, recurse=False):
+        """
+        find the resources under certain path/path 
+        @param path : reference to path where resources are searched
+        @param type : resources for particular carbon specific type. 
+        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
+        Default value is False. Set to True to enable recursion.
+        """
+        try:
+            path = utils.resourceref.join_refs([path,'.'+type])
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('list_resources', path)
+            req = urllib2.Request(query)
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                reader = persistentjson.ResourceListReader()
+                reslist = reader.loads(bytes)
+                return reslist
+            else:
+                return []
+        except exceptions.NotFound:
+            return []
+
+    def list_resources(self,path, recurse=False):
+        """
+        find the resources under certain path/path 
+        @param path : reference to path where resources are searched
+        @param recurse : defines whether to return resources directly under the path or does the listing recurse to subfolders. 
+        Default value is False. Set to True to enable recursion.
+        """
+        try:
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('list_resources', path)
+            req = urllib2.Request(query)
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                reslist = simplejson.loads(bytes)
+                return reslist.get('resources',[])
+            else:
+                return []
+        except exceptions.NotFound:
+            return []
+
+
+    def update_resource(self, path, data):
+        """
+        Update a resource to carbon. The resource can be a CarbonConfiguration or FeatureList object.
+        @param object: The object which is dumped to dict with persistentjson and then updated to server. 
+        """
+        try:
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('update_resource', path)
+            jsondata = simplejson.dumps(data)
+            encdata = urllib.urlencode({'data' : jsondata})
+            req = urllib2.Request(query, encdata)
+            
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                respdata = simplejson.loads(bytes)
+                success = respdata.get('success') == True
+                if success:
+                    logging.getLogger('cone').info('Carbon update succeeds to path %s.' % (respdata.get('path')))
+                else:
+                    logging.getLogger('cone').error('Carbon update %s failed %s' % (path,respdata.get('errors')))
+                return success
+            else:
+                logging.getLogger('cone').error('Carbon update %s failed %s: %s' % (path,resp.code, resp))
+                return False
+        except urllib2.HTTPError,e:
+            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
+            return False
+
+    def create_feature(self,path, feature, parent=None):
+        """
+        Create new Carbon feature based on Feature object.
+        @param path: The path to the featurelist where the feature is created. 
+        @param feature: The feature object 
+        @param parent: A possible parent feature ref
+        """
+        try:
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('put_resource', path)
+            data = persistentjson.dumps(feature)
+            if parent:
+                data['parent'] = parent
+            jsondata = simplejson.dumps(data)
+            encdata = urllib.urlencode({'data' : jsondata})
+            req = urllib2.Request(query, encdata)
+            
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                respdata = simplejson.loads(bytes)
+                success = respdata.get('success') == True
+                if success:
+                    logging.getLogger('cone').info('New Carbon feature created to path %s.' % (respdata.get('path')))
+                else:
+                    logging.getLogger('cone').error('Feature %s creation failed %s' % (feature.fqr,respdata.get('errors')))
+                return success
+            else:
+                logging.getLogger('cone').error('Feature %s creation failed %s: %s' % (feature.fqr,resp.code, resp))
+                return False
+        except urllib2.HTTPError,e:
+            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
+            return False
+
+    def create_featurelist(self, path, featurelist):
+        """
+        Create new Carbon featurelist to carbon.
+        @param featurelist: The FeatureList object which is created. 
+        @return: tuple (success, created_path) where success indicates the success of the operation
+        and created_path is the newly created featurelist path on success.
+        """
+        try:
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('put_resource', path)
+            data = persistentjson.FeatureListCreateWriter().dumps(featurelist)
+            jsondata = simplejson.dumps(data)
+            encdata = urllib.urlencode({'data' : jsondata})
+            req = urllib2.Request(query, encdata)
+            
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                respdata = simplejson.loads(bytes)
+                success = respdata.get('success') == True
+                newpath = respdata.get('path')
+                if success:
+                    logging.getLogger('cone').info('New Carbon featurelist created to path %s.' % (newpath))
+                else:
+                    logging.getLogger('cone').error('FeatureList %s creation failed %s' % (featurelist.path,respdata.get('errors')))
+                return (success, newpath)
+            else:
+                logging.getLogger('cone').error('FeatureList %s creation failed %s: %s' % (featurelist.path,resp.code, resp))
+                return (False,'')
+        except urllib2.HTTPError,e:
+            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
+            return (False,'')
+
+    def create_configuration(self, path, configuration):
+        """
+        Create new Carbon configuration to carbon.
+        @param path: The path to the configuration 
+        @param configuration: The CarbonConfiguration object
+        @return: tuple (success, created_path) where success indicates the success of the operation
+        and created_path is the newly created configuration path on success.
+        """
+        try:
+            path = utils.resourceref.remove_begin_slash(path)
+            query = self._get_action_url('put_resource', path)
+            data = persistentjson.ConfigurationCreateWriter().dumps(configuration)
+            jsondata = simplejson.dumps(data)
+            encdata = urllib.urlencode({'data' : jsondata})
+            req = urllib2.Request(query, encdata)
+            
+            resp = self.conn.open(req)
+            if resp.code == httplib.OK:
+                bytes = resp.read()
+                respdata = simplejson.loads(bytes)
+                success = respdata.get('success') == True
+                newpath = respdata.get('path')
+                if success:
+                    logging.getLogger('cone').info('New Carbon configuration created to path %s.' % (newpath))
+                else:
+                    logging.getLogger('cone').error('CarbonConfiguration %s creation failed %s' % (configuration.path,respdata.get('errors')))
+                return (success, newpath)
+            else:
+                logging.getLogger('cone').error('CarbonConfiguration %s creation failed %s: %s' % (configuration.path,resp.code, resp))
+                return (False,'')
+        except urllib2.HTTPError,e:
+            utils.log_exception(logging.getLogger('cone'), "HTTPError in %s, %s" % (query,e))
+            return (False,'')
+
+class ResourceCache(object):
+    """
+    Resource cache maintains a list of ConE resource names and their actual links to Carbon resources.
+    """
+    def __init__(self):
+        self._cache = {}
+
+    def add_configuration(self, configuration):
+        """
+        Add a list of Carbon configurations. 
+        """
+        
+        # Create the configuration as a layer and configuration root
+        self._cache[configuration.get_path()] = configuration.path
+        rootconf_path = configuration.name+'.confml'
+        rootconf = model.CarbonConfiguration(rootconf_path)
+        rootconf.include_configuration(configuration.get_path())
+        self._cache[rootconf_path] = rootconf
+
+    def add_featurelist(self, featurelist):
+        """
+        Add a list of Carbon configurations. 
+        """
+        # Add the feature list under feature list folder 
+        self._cache["featurelists/"+featurelist.get_path()] = featurelist.get_carbon_path()
+        pass
+
+    def add_resource(self, resourcepath):
+        """
+        Add a resource 
+        """
+        confmlpath = persistentjson.CarbonResourceMapper().map_carbon_resource(resourcepath)
+        self._cache[confmlpath] = resourcepath 
+
+    def list_resources(self, path, recurse=False):
+        """
+        List ConE resources under certain path 
+        """
+        resources = []
+        path = utils.resourceref.insert_begin_slash(path)
+        for res in self._cache.keys():
+            (respath,resname) = posixpath.split(res)
+            respath = utils.resourceref.insert_begin_slash(respath)
+            if recurse:
+                if posixpath.normpath(respath).startswith(posixpath.normpath(path)):
+                     resources.append(res)
+            else:
+                if posixpath.normpath(respath) == posixpath.normpath(path):
+                     resources.append(res)
+        return resources
+
+    def is_resource(self,path):
+        return self._cache.has_key(path)
+
+    def get_resource_link(self,path):
+        """
+        Get a the actual Carbon resource link if it is found from cached storage. 
+        """
+        linkpath = self._cache.get(path, None)
+        if isinstance(linkpath, str):
+             return linkpath
+        else:
+            return None
+
+    def get_mapped_resource(self, path):
+        # Try to make a carbon like resource path for a confml resource
+        if path.startswith('featurelists'):
+            object_type = 'featurelist'
+        elif path.endswith('/root.confml'):
+            object_type = 'configurationlayer'
+        else:
+            object_type = 'configurationroot'
+        carbonpath = persistentjson.CarbonResourceMapper().map_confml_resource(object_type, path)
+        return carbonpath
+
+    def add_resource_link(self,link, path):
+        """
+        Add a actual Carbon resource link. The link is the key which returns path when asked from get_resource_link.
+        @param link: is linking path to the actual carbon resource path
+        @param path: is the actual carbon path  
+        """
+        self._cache[link] = path
+
+    def get_resource_object(self,path):
+        """
+        Get a the actual cached Carbon object if it is found. 
+        """
+        cachebj = self._cache.get(path, None)
+        if isinstance(cachebj, model.CarbonConfiguration):
+             return cachebj
+        return None
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/storage/zipstorage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,377 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import zipfile,zlib, StringIO, os, logging
+import datetime
+import tempfile
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+from cone.public import api, utils, persistence, exceptions
+from cone.public.api import Resource, Storage, Configuration, Folder
+from cone.storage import metadata, common
+from cone.confml import persistentconfml
+
+
+class ZipException(exceptions.StorageException):
+    def __init__(self,value):
+        self.value = value
+    def __str__(self):
+        return repr(self.value)  
+
+
+class ZipStorage(common.StorageBase):
+    """
+    A storage for zip file 
+    """
+    TEMP_FILE = '_temp_%i.zip' % os.getpid()
+    def __init__(self, path ,mode, **kwargs):
+        """
+        Open the given filename object as a cpf zipfile
+        """
+        self.mode        = mode
+        self.persistentmodule = persistentconfml
+        self.compression = zipfile.ZIP_DEFLATED
+        self.modified = False
+        self.logger = logging.getLogger('cone')
+        self.logger.debug("ZipStorage path %s open in mode %s" % (path,self.mode))
+        try:
+            # If opening the file in read/append mode check that the given file is a zipfile
+            if self.get_mode(mode) != self.MODE_WRITE:
+                if os.path.exists(path) and not zipfile.is_zipfile(path):
+                    raise ZipException("The file %s is not a zip file!" % path) 
+            self.zipfile = zipfile.ZipFile(path,self.mode,self.compression)
+        except IOError,e:
+            raise ZipException("ZipFile open error: %s" % e)
+        super(ZipStorage, self).__init__(path)
+
+    def _zippath(self, path):
+        """
+        Convert a norm path to zipfile path  
+        """
+        normpath = utils.resourceref.norm(path)
+        return normpath.lstrip('.')
+
+    @classmethod
+    def supported_storage(cls,path):
+        """
+        Class method for determing if the given clas supports a storage by given path. 
+        E.g. foo.zip, foo.cpd, foo/bar, http://foo.com/
+        @param path:
+        @return: Boolean value. True if the storage of the path is supported. False if not.  
+        """
+        if utils.resourceref.get_ext(path) == "zip" or \
+           utils.resourceref.get_ext(path) == "cpf":
+            return True
+        else:
+            return False
+
+    def open_resource(self,path,mode="r"):
+        strio = None
+        path = utils.resourceref.remove_begin_slash(path)
+        fullpath = utils.resourceref.join_refs([self.get_current_path(),path])
+        try:
+            if self.get_mode(mode) == self.MODE_READ:
+                if not self.is_resource(fullpath):
+                    raise exceptions.NotResource("Resource is not found %s" % fullpath)
+                bytes = self.zipfile.read(fullpath)
+                strio = StringIO.StringIO(bytes)    
+            elif self.get_mode(mode) == self.MODE_APPEND:
+                if not self.is_resource(fullpath):
+                    raise exceptions.NotResource("Resource is not found %s" % fullpath)
+                bytes = self.zipfile.read(fullpath)
+                # delete the "old" resource
+                self.delete_resource(fullpath)
+                strio = StringIO.StringIO(bytes)
+                strio.seek(0, os.SEEK_END)
+                
+            elif self.get_mode(mode) == self.MODE_WRITE:
+                if self.is_resource(fullpath):
+                    # delete the "old" resource
+                    self.delete_resource(fullpath)
+                # Create a new string buffer because the resource is overwritten
+                strio = StringIO.StringIO()
+            else:
+                raise ZipException("Unrecognized mode %s" % mode)
+            res = ZipFileResource(self,fullpath,mode,strio)
+            self.__opened__(res)
+            return res
+        except KeyError:
+            raise exceptions.NotResource(path)
+
+    def is_resource(self,path):
+        path = utils.resourceref.remove_begin_slash(path)
+        files = self.zipfile.namelist()
+        try:
+            i = files.index(path)
+            return True
+        except ValueError:
+            return False
+
+    def is_dir(self,path):
+        """
+        Get an array of files in a folder
+        """
+        try:
+            zinfo = self.zipfile.getinfo(utils.resourceref.add_end_slash(path))
+            return True
+        except KeyError:
+            return False 
+
+    def list_resources(self,path,recurse=False, empty_folders=False): 
+        """
+        Get an array of files in a folder  
+        """
+        path = utils.resourceref.remove_begin_slash(path)
+        fullpath = utils.resourceref.join_refs([self.get_current_path(),path])
+        fullpath = self._zippath(fullpath)
+        retarray = []
+        filelist = self.zipfile.namelist()
+        for name in filelist:
+            (filepath,filename) = os.path.split(name)
+            curname = utils.resourceref.replace_dir(name, self.get_current_path(),'')
+            # return directories only if specified
+            if empty_folders == True or not self.is_dir(name):
+                # Skip the filename if it is marked as deleted
+                if self.__has_open__(name) and self.__get_open__(name)[-1].get_mode() == api.Storage.MODE_DELETE:
+                    continue
+                if filepath == fullpath:
+                    retarray.append(curname)
+                elif recurse and filepath.startswith(fullpath):
+                    retarray.append(curname)
+        #retarray = sorted(utils.distinct_array(retarray))
+        return retarray
+
+    def import_resources(self,paths,storage,empty_folders=False):
+        for path in paths:
+            if not storage.is_resource(path) and empty_folders==False:
+                logging.getLogger('cone').warning("The given path is not a Resource in the storage %s! Ignoring from export!" % path)
+                continue
+            if storage.is_resource(path):
+                wres = self.open_resource(path,'wb')
+                res  = storage.open_resource(path,"rb")
+                wres.write(res.read())
+                wres.close()
+                res.close()
+                
+            elif storage.is_folder(path) and empty_folders:
+                self.create_folder(path)
+
+    def export_resources(self,paths,storage,empty_folders=False):
+        
+        for path in paths:
+            if not self.is_resource(path) and empty_folders==False:
+                logging.getLogger('cone').warning("The given path is not a Resource in this storage %s! Ignoring from export!" % path)
+                continue
+            if  self.is_resource(path):
+                wres = storage.open_resource(path,'wb')
+                res  = self.open_resource(path,"rb")
+                wres.write(res.read())
+                wres.close()
+                res.close()
+            
+            if  self.is_folder(path) and  empty_folders:
+                storage.create_folder(path)
+                
+
+    def close_resource(self, res):
+        """
+        Close the given resource instance. Normally this is called by the Resource object 
+        in its own close.
+        @param res: the resource object to close. 
+        """
+        try:
+            self.__closed__(res)
+            if self.get_mode(self.mode) != api.Storage.MODE_READ and \
+               (res.get_mode() == api.Storage.MODE_WRITE or res.get_mode() == api.Storage.MODE_APPEND):
+                self.zipfile.writestr(res.path,res.getvalue())
+        except KeyError,e:
+            raise exceptions.StorageException("No such %s open resource! %s" % (res.path,e))
+            
+
+    def save_resource(self, res):
+        """
+        Flush the changes of a given resource instance. Normally this is called by the Resource object 
+        in its own save.
+        @param res: the resource to the resource to save. 
+        """
+        if not self.__has_resource__(res):
+            raise exceptions.NotResource("No such %s open resource!" % res.path)
+        else:
+            self.zipfile.writestr(res.path,res.getvalue())
+
+    def delete_resource(self,path):
+        """
+        Delete the given resource from storage
+        @param res : Resource object to the resource 
+        raises a NotSupportedException exception if delete operation is not supported by the storage
+        """
+        # First close all open resources
+        for res in self.__get_open__(path):
+            self.__closed__(res)
+        self.modified = True 
+        self.zipfile.filelist.remove(self.zipfile.NameToInfo[path])
+        del self.zipfile.NameToInfo[path]
+            
+
+    def create_folder(self,path):
+        """
+        Create a folder entry to a path
+        @param path : path to the folder
+        """
+        fullpath = utils.resourceref.join_refs([self.get_current_path(),path])
+        fullpath = utils.resourceref.add_end_slash(self._zippath(fullpath))
+        if self.is_folder(fullpath):
+            # delete the "old" resource
+            self.delete_resource(fullpath)
+        now = datetime.datetime.now()
+        zinfo = zipfile.ZipInfo(fullpath,
+                                (now.year,now.month, now.day, 
+                                 now.hour, now.minute, now.second)
+                                )
+        # set an external attribute for directory entry
+        zinfo.external_attr = 0x10
+        zinfo.extract_version = 10
+        self.zipfile.writestr(zinfo,'') 
+
+    def delete_folder(self,path):
+        """
+        Delete a folder entry from a path. The path must be empty.
+        @param path : path to the folder
+        """
+        pass
+
+    def is_folder(self,path):
+        """
+        Check if the given path is an existing folder in the storage
+        @param path : path to the folder
+        """
+        fullpath = utils.resourceref.join_refs([self.get_current_path(),path])
+        folderpath = self._zippath(fullpath)
+        return self.is_dir(folderpath)
+
+    def close(self):
+        if self.zipfile:
+            super(ZipStorage,self).close()
+            self.zipfile.close()
+            # Recreate the zip file if the zip has been modified to make a zip without 
+            # duplicate local file entries
+            if self.modified:
+                oldfile = None
+                newzipfile = None
+                tmp_path = os.path.join(tempfile.gettempdir(), self.TEMP_FILE)
+                os.rename(self.path, tmp_path)
+                oldfile = zipfile.ZipFile(tmp_path,"r")
+                newzipfile = zipfile.ZipFile(self.path,"w",self.compression)
+                for fileinfo in oldfile.infolist():
+                    newzipfile.writestr(fileinfo, oldfile.read(fileinfo.filename))
+                if oldfile: oldfile.close()
+                if newzipfile: newzipfile.close()
+                os.unlink(tmp_path)
+            self.zipfile = None
+        else:
+            raise exceptions.StorageException('Storage %s has been already closed!' % self.path)
+
+    def unload(self, path, object):
+        """
+        Dump a given object to the storage (reference is fetched from the object)
+        @param object: The object to dump to the storage, which is expected to be an instance 
+        of Base class.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not isinstance(object, api.Configuration):
+            raise exceptions.StorageException("Cannot dump object type %s" % object.__class__)
+        if self.get_mode(self.mode) != api.Storage.MODE_READ:
+            res = self.open_resource(path,"wb")
+            data = "%s" % self.persistentmodule.dumps(object)
+            res.write(data)
+            res.close()
+        return
+
+    def load(self, path):
+        """
+        Load an from a reference.
+        """
+        # Add the current path in front of the given path
+        path = utils.resourceref.join_refs([self.get_current_path(), path])
+        if not utils.resourceref.get_ext(path) == "confml":
+            raise exceptions.StorageException("Cannot load reference type %s" % utils.resourceref.get_ext(path))
+        if self.is_resource(path):
+            res = self.open_resource(path,"r")
+            # read the resource with persistentmodule
+            try:
+                obj = self.persistentmodule.loads(res.read())
+                obj.set_path(path)
+                res.close()
+                return obj
+            except exceptions.ParseError,e:
+                logging.getLogger('cone').error("Resource %s parsing failed with exception: %s" % (path,e))
+                # returning an empty config in case of xml parsing failure.
+                return api.Configuration(path)
+        else:
+            raise exceptions.NotResource("No such %s resource!" % path)
+
+
+class ZipFileResource(Resource):
+    def __init__(self,storage,path,mode,handle):
+        Resource.__init__(self,storage,path,mode)
+        self.handle = handle
+    
+    def read(self,bytes=0):
+        if bytes == 0:
+            return self.handle.read()
+        else:
+            return self.handle.read(bytes)
+    
+    def write(self,string):
+        if self.get_mode() == api.Storage.MODE_READ:
+            raise exceptions.StorageException("Writing attempted to %s in read-only mode." % self.path)
+        else:
+            self.handle.write(string)
+
+    def truncate(self,size=0):
+        raise exceptions.NotSupportedException()
+
+    def save(self):
+        self.storage.save_resource(self)
+
+    def close(self):
+        self.storage.close_resource(self)
+        self.handle.close()
+    
+    def get_size(self):
+        if self.get_mode() == api.Storage.MODE_WRITE:
+            raise exceptions.StorageException("Reading resource size attempted to %s in write-only mode." % self.path)
+        return len(self.handle.getvalue())
+    
+    def getvalue(self):
+        return self.handle.getvalue()
+
+    def get_content_info(self):
+        if self.content_info == None:
+            self.content_info = utils.make_content_info(self, self.handle.getvalue())
+        
+        return self.content_info
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/test.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+<!--****************************************************************************
+ * Configuration Engine (ConE) test build file
+ * This ant test.xml will test ConE 
+ ****************************************************************************-->
+
+<project name="cone-test" default="test">
+    
+    <target name="test">
+        <echo message="Running tests..."/>
+        <delete file="nose_unittests.xml"/>
+        <exec executable="nosetests">
+            <arg line=" -c nose_unittests.cfg"/>
+        </exec>
+    </target>
+
+</project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
Binary file configurationengine/source/cone/tests/cone_input.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/cone/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,44 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+import os,sys,unittest
+from optparse import OptionParser, OptionGroup
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+sys.path.insert(0, os.path.join(ROOT_PATH,'..'))
+sys.path.insert(0, os.path.join(ROOT_PATH,'../..'))
+sys.path.insert(0, os.path.join(ROOT_PATH,'../../testautomation'))
+
+import cone.storage.tests
+import cone.core.tests
+import cone.confml.tests
+import cone.carbon.tests
+import cone.public.tests
+from testautomation import testcli
+
+def collect_suite():
+    suite = unittest.TestSuite()
+    suite.addTests(cone.storage.tests.collect_suite())
+    suite.addTests(cone.core.tests.collect_suite())
+    suite.addTests(cone.confml.tests.collect_suite())
+    suite.addTests(cone.carbon.tests.collect_suite())
+    suite.addTests(cone.public.tests.collect_suite())
+    return suite
+
+if __name__ == '__main__':
+    testcli.run(collect_suite())
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/dev-tools/find_tabs.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, os.path
+
+def main(start):
+    for root, dirs, files in os.walk(start):
+        for fn in files:
+            if not fn.endswith('.py'):
+                continue
+            full_name = os.path.join(root, fn)
+            f = open(full_name)
+            for index, line in enumerate(f.readlines()):
+                if '\t' in line:
+                    print '%s:%s: %s' % (full_name, index, line.rstrip())
+            f.close()
+
+if __name__ == '__main__':
+    import sys
+    if len(sys.argv):
+        main(sys.argv[1])
+    else:
+        main('.')
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/ez_setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,291 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+#!python
+"""Bootstrap setuptools installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from ez_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import sys
+DEFAULT_VERSION = "0.6c9"
+DEFAULT_URL     = "http://pypi.python.org/packages/%s/s/setuptools/" % sys.version[:3]
+
+md5_data = {
+    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
+    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
+    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
+    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
+    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
+    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
+    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
+    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
+    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
+    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
+    'setuptools-0.6c2-py2.3.egg': 'f0064bf6aa2b7d0f3ba0b43f20817c27',
+    'setuptools-0.6c2-py2.4.egg': '616192eec35f47e8ea16cd6a122b7277',
+    'setuptools-0.6c3-py2.3.egg': 'f181fa125dfe85a259c9cd6f1d7b78fa',
+    'setuptools-0.6c3-py2.4.egg': 'e0ed74682c998bfb73bf803a50e7b71e',
+    'setuptools-0.6c3-py2.5.egg': 'abef16fdd61955514841c7c6bd98965e',
+    'setuptools-0.6c4-py2.3.egg': 'b0b9131acab32022bfac7f44c5d7971f',
+    'setuptools-0.6c4-py2.4.egg': '2a1f9656d4fbf3c97bf946c0a124e6e2',
+    'setuptools-0.6c4-py2.5.egg': '8f5a052e32cdb9c72bcf4b5526f28afc',
+    'setuptools-0.6c5-py2.3.egg': 'ee9fd80965da04f2f3e6b3576e9d8167',
+    'setuptools-0.6c5-py2.4.egg': 'afe2adf1c01701ee841761f5bcd8aa64',
+    'setuptools-0.6c5-py2.5.egg': 'a8d3f61494ccaa8714dfed37bccd3d5d',
+    'setuptools-0.6c6-py2.3.egg': '35686b78116a668847237b69d549ec20',
+    'setuptools-0.6c6-py2.4.egg': '3c56af57be3225019260a644430065ab',
+    'setuptools-0.6c6-py2.5.egg': 'b2f8a7520709a5b34f80946de5f02f53',
+    'setuptools-0.6c7-py2.3.egg': '209fdf9adc3a615e5115b725658e13e2',
+    'setuptools-0.6c7-py2.4.egg': '5a8f954807d46a0fb67cf1f26c55a82e',
+    'setuptools-0.6c7-py2.5.egg': '45d2ad28f9750e7434111fde831e8372',
+    'setuptools-0.6c8-py2.3.egg': '50759d29b349db8cfd807ba8303f1902',
+    'setuptools-0.6c8-py2.4.egg': 'cba38d74f7d483c06e9daa6070cce6de',
+    'setuptools-0.6c8-py2.5.egg': '1721747ee329dc150590a58b3e1ac95b',
+    'setuptools-0.6c9-py2.3.egg': 'a83c4020414807b496e4cfbe08507c03',
+    'setuptools-0.6c9-py2.4.egg': '260a2be2e5388d66bdaee06abec6342a',
+    'setuptools-0.6c9-py2.5.egg': 'fe67c3e5a17b12c0e7c541b7ea43a8e6',
+    'setuptools-0.6c9-py2.6.egg': 'ca37b1ff16fa2ede6e19383e7b59245a',
+}
+
+import sys, os
+try: from hashlib import md5
+except ImportError: from md5 import md5
+
+def _validate_md5(egg_name, data):
+    if egg_name in md5_data:
+        digest = md5(data).hexdigest()
+        if digest != md5_data[egg_name]:
+            print >>sys.stderr, (
+                "md5 validation of %s failed!  (Possible download problem?)"
+                % egg_name
+            )
+            sys.exit(2)
+    return data
+
+def use_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    download_delay=15
+):
+    """Automatically find/download setuptools and make it available on sys.path
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end with
+    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
+    it is not already available.  If `download_delay` is specified, it should
+    be the number of seconds that will be paused before initiating a download,
+    should one be required.  If an older version of setuptools is installed,
+    this routine will print a message to ``sys.stderr`` and raise SystemExit in
+    an attempt to abort the calling script.
+    """
+    was_imported = 'pkg_resources' in sys.modules or 'setuptools' in sys.modules
+    def do_download():
+        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        sys.path.insert(0, egg)
+        import setuptools; setuptools.bootstrap_install_from = egg
+    try:
+        import pkg_resources
+    except ImportError:
+        return do_download()       
+    try:
+        pkg_resources.require("setuptools>="+version); return
+    except pkg_resources.VersionConflict, e:
+        if was_imported:
+            print >>sys.stderr, (
+            "The required version of setuptools (>=%s) is not available, and\n"
+            "can't be installed while this script is running. Please install\n"
+            " a more recent version first, using 'easy_install -U setuptools'."
+            "\n\n(Currently using %r)"
+            ) % (version, e.args[0])
+            sys.exit(2)
+        else:
+            del pkg_resources, sys.modules['pkg_resources']    # reload ok
+            return do_download()
+    except pkg_resources.DistributionNotFound:
+        return do_download()
+
+def download_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    delay = 15
+):
+    """Download setuptools from a specified location and return its filename
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download attempt.
+    """
+    import urllib2, shutil
+    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
+    url = download_base + egg_name
+    saveto = os.path.join(to_dir, egg_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            from distutils import log
+            if delay:
+                log.warn("""
+---------------------------------------------------------------------------
+This script requires setuptools version %s to run (even to display
+help).  I will attempt to download it for you (from
+%s), but
+you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
+
+(Note: if this machine does not have network access, please obtain the file
+
+   %s
+
+and place it in this directory before rerunning this script.)
+---------------------------------------------------------------------------""",
+                    version, download_base, delay, url
+                ); from time import sleep; sleep(delay)
+            log.warn("Downloading %s", url)
+            src = urllib2.urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = _validate_md5(egg_name, src.read())
+            dst = open(saveto,"wb"); dst.write(data)
+        finally:
+            if src: src.close()
+            if dst: dst.close()
+    return os.path.realpath(saveto)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+    try:
+        import setuptools
+    except ImportError:
+        egg = None
+        try:
+            egg = download_setuptools(version, delay=0)
+            sys.path.insert(0,egg)
+            from setuptools.command.easy_install import main
+            return main(list(argv)+[egg])   # we're done here
+        finally:
+            if egg and os.path.exists(egg):
+                os.unlink(egg)
+    else:
+        if setuptools.__version__ == '0.0.1':
+            print >>sys.stderr, (
+            "You have an obsolete version of setuptools installed.  Please\n"
+            "remove it from your system entirely before rerunning this script."
+            )
+            sys.exit(2)
+
+    req = "setuptools>="+version
+    import pkg_resources
+    try:
+        pkg_resources.require(req)
+    except pkg_resources.VersionConflict:
+        try:
+            from setuptools.command.easy_install import main
+        except ImportError:
+            from easy_install import main
+        main(list(argv)+[download_setuptools(delay=0)])
+        sys.exit(0) # try to force an exit
+    else:
+        if argv:
+            from setuptools.command.easy_install import main
+            main(argv)
+        else:
+            print "Setuptools version",version,"or greater has been installed."
+            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
+
+def update_md5(filenames):
+    """Update our built-in md5 registry"""
+
+    import re
+
+    for name in filenames:
+        base = os.path.basename(name)
+        f = open(name,'rb')
+        md5_data[base] = md5(f.read()).hexdigest()
+        f.close()
+
+    data = ["    %r: %r,\n" % it for it in md5_data.items()]
+    data.sort()
+    repl = "".join(data)
+
+    import inspect
+    srcfile = inspect.getsourcefile(sys.modules[__name__])
+    f = open(srcfile, 'rb'); src = f.read(); f.close()
+
+    match = re.search("\nmd5_data = {\n([^}]+)}", src)
+    if not match:
+        print >>sys.stderr, "Internal error!"
+        sys.exit(2)
+
+    src = src[:match.start(1)] + repl + src[match.end(1):]
+    f = open(srcfile,'w')
+    f.write(src)
+    f.close()
+
+
+if __name__=='__main__':
+    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
+        update_md5(sys.argv[2:])
+    else:
+        main(sys.argv[1:])
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/build_egg_info.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,65 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+# Script for generating the egg-info directories for all needed plug-ins.
+#
+# This is needed, because running some of the tests from Eclipse or
+# command line requires the egg-info dirs to be present for the plug-ins
+# to be found.
+
+import sys, os, subprocess, shutil
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+DEBUG = False
+
+def generate_egg_info(path):
+    """Generate egg-info for the given plug-in path if possible and necessary."""
+    if not os.path.isdir(path) or "setup.py" not in os.listdir(path):
+        return
+    
+    # Check if egg-info has already been generated
+    for name in os.listdir(path):
+        egg_info_path = os.path.join(path, name)
+        if os.path.isdir(egg_info_path) and name.endswith('.egg-info'):
+            # xxx.egg-info is present in the directory, check if it is old
+            setup_py_path = os.path.join(path, 'setup.py')
+            if os.stat(setup_py_path).st_mtime < os.stat(egg_info_path).st_mtime:
+                if DEBUG: print "No need to generate egg-info for '%s'" % path
+                return
+            else:
+                if DEBUG: print "egg-info for '%s' is out of date, removing old and generating new" % path
+                shutil.rmtree(egg_info_path)
+    
+    # Run the egg-info generation command
+    orig_workdir = os.getcwd()
+    try:
+        if DEBUG: print "Generating egg-info for '%s'..." % path
+        os.chdir(path)
+        p = subprocess.Popen("python setup.py egg_info", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+        out, err = p.communicate()
+        if p.returncode != 0:
+            print >>sys.stderr, "Could not generate egg-info for '%s'!" % path
+            print >>sys.stderr, "Command stdout output:"
+            print >>sys.stderr, out
+            print >>sys.stderr, "Command stderr output:"
+            print >>sys.stderr, err
+        else:
+            if DEBUG:
+                print "Done"
+                print "Command output:"
+                print out
+    finally:
+        os.chdir(orig_workdir)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
+import pkg_resources 
+import sys,os
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/commandml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,539 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author <author>
+'''
+ConE plugin to run external applications/tools with given parameters in .commandml file. Notice that values can be also
+fecthed from ConfML to maximize portability and minimize maintenance.
+'''
+
+import re
+import os
+import sys
+import logging
+import types
+
+import subprocess
+import __init__
+
+from cone.public import exceptions,plugin,utils,api, settings
+
+class CommandImpl(plugin.ImplBase):
+    """
+    Plugin implementation class. 
+    """
+    
+    IMPL_TYPE_ID = "commandml"
+    
+    
+    def __init__(self,ref,configuration, reader):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)###3
+        self.desc = ""
+        self.logger = logging.getLogger('cone.commandml(%s)' % self.ref)
+        self.reader = reader
+        
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        self.create_output()        
+        return 
+    
+    def generate_layers(self,layers):
+        """
+        Generate the given Configuration layers.
+        """
+        self.logger.info('Generating layers %s' % layers)
+        self.create_output(layers)
+        return 
+    
+    def create_output(self, layers=None):
+        """
+        Function to generate output files.
+        """
+        
+        tmpDict = self.__create_helper_variables()
+        
+        for element in self.reader.elements:
+            #Element can be either command or condition.
+            element.set_logger(self.logger)
+            element.execute(tmpDict)        
+        return
+
+    def __create_helper_variables(self):
+        """
+        Internal function to create dictionary containing most often used ConE "environment" variables.
+        """        
+        tmp = {}
+        tmp["%CONE_OUT%"] = self.output
+        tmp["%CONE_OUT_ABSOLUTE%"] = os.path.abspath(self.output)
+        return tmp    
+    
+    def has_ref(self, refs):
+        """
+        @returns True if the implementation uses the given ref as input value.
+        Otherwise return False.
+        """
+                
+        # return true for now so that content copying is not filtered 
+        return None
+    
+class CommandImplReader(plugin.ReaderBase):
+    """
+    Parses a single commandml file
+    """ 
+    NAMESPACE = 'http://www.s60.com/xml/commandml/1'
+    FILE_EXTENSIONS = ['commandml']
+    
+    def __init__(self):
+        """
+        Constructor
+        """
+        self.output_dir = None
+        self.input_dir = None
+        self.namespaces = [self.NAMESPACE]
+        self.dview = None
+        self.elements = []
+        self.tags = None
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = CommandImplReader()
+        reader.set_default_view(configuration.get_default_view())
+        reader.from_etree(etree)
+        impl = CommandImpl(resource_ref, configuration, reader)
+        if reader.tags:
+            impl.set_tags(reader.tags)
+        return impl
+            
+    def set_default_view(self, dview):
+        """
+        Function to set default view that is needed when solving out ConfML reference information
+        """        
+        self.dview = dview
+            
+    def from_etree(self, etree):
+        """
+        Parser function for commandml element.
+        """
+        self.parse_tree(etree)
+
+    def parse_tree(self, etree):
+        """
+        General parse function for condition and command elements.
+        """        
+        elements = list(etree)
+        for element in elements:
+            if element.tag == "{%s}condition" % self.namespaces[0]:
+                self.elements.append(self.parse_condition(element))
+            elif element.tag == "{%s}command" % self.namespaces[0]:
+                self.elements.append(self.parse_command(element))
+            else:
+                pass
+        self.tags = self.parse_tags(etree)
+
+    def parse_condition(self, etree):
+        """
+        Parse function for condition element.
+        """        
+        condition = Condition()
+        condition.set_condition(etree.get("value"))
+        condition.set_commands(self.parse_commands(etree))
+        condition.set_default_view(self.dview)
+        return condition                                   
+        
+    def parse_commands(self,etree):
+        """
+        Parser function for commands.
+        """
+        commands = []
+        for com_elem in etree.findall("{%s}command" % self.namespaces[0]):
+            commands.append(self.parse_command(com_elem))
+        return commands
+         
+    def parse_command(self,etree):
+        """
+        Parser function for single command.
+        """
+        cmd = Command()
+        cmd.set_executable(etree.get("executable"))
+        cmd.set_shell(etree.get("shell"))
+        cmd.set_bufsize(etree.get("bufsize"))
+        cmd.set_cwd(etree.get("cwd")) 
+        cmd.set_all_envs(etree.get("env"))
+        cmd.set_all_arguments(self.parse_arguments(etree))
+        cmd.set_all_pipes(self.parse_pipes(etree))
+        cmd.set_filters(self.parse_filters(etree))
+        cmd.set_default_view(self.dview)
+        return cmd
+    
+    def parse_arguments(self,etree):
+        """
+        Parser function for command's arguments.
+        """
+        arguments = []
+        for argument in etree.findall("{%s}argument" % self.namespaces[0]):
+            value = argument.get("value")
+            if value:
+                arguments.append(value)
+        return arguments
+    
+    def parse_pipes(self,etree):
+        """
+        Parser function for command's pipes.
+        """
+        pipes = {}
+        for argument in etree.findall("{%s}pipe" % self.namespaces[0]):
+            name = argument.get("name")
+            value = argument.get("value")
+            if name:
+                pipes[name] = value        
+        return pipes
+
+    def parse_filters(self,etree):
+        """
+        Parser function for command's filters.
+        """
+        filters = []
+        for argument in etree.findall("{%s}filter" % self.namespaces[0]):
+            f = Filter()
+            f.set_severity(argument.get("severity"))
+            f.set_condition(argument.get("condition"))
+            f.set_input(argument.get("input"))
+            f.set_formatter(argument.get("formatter"))
+            filters.append(f)
+        return filters
+    
+    def parse_tags(self,etree):
+        tags = {}
+        for tag in etree.getiterator("{%s}tag" % self.namespaces[0]):
+            tagname = tag.get('name','')
+            tagvalue = tag.get('value')
+            values = tags.get(tagname,[])
+            values.append(tagvalue)
+            tags[tagname] = values
+        return tags
+
+
+class Condition(object):
+    """
+    Condition class is a simple wrapper class for commands so that commands are executed
+    only if condition is True. Otherwise class does nothing. Class has similar interface 
+    than Command class so that they can be used similar way from plugin perspective. 
+    """
+    
+    def __init__(self):
+        self.condition = None
+        self.commands = []
+        self.logger = None
+        self.dview = None
+
+    def set_condition(self, condition):
+        self.condition = condition
+
+    def set_default_view(self, dview):
+        self.dview = dview
+
+    def set_commands(self, commands):
+        self.commands = commands
+
+    def set_logger(self, logger):
+        self.logger = logger
+        for cmd in self.commands:
+            cmd.set_logger(logger)        
+
+    def add_command(self, command):
+        self.command.append(command)
+
+    def execute(self, replaceDict=None):
+        if self.__solve_condition(self.condition):
+            #Condition is true -> running command
+            for command in self.commands:                
+                command.execute(replaceDict)
+        else:
+            self.logger.info("Ignoring %s because it is evaluated as False." % self.condition)
+
+    def __solve_condition(self, condition_str):
+        """
+        Internal function to handle condition
+        """
+        if condition_str != "":
+            #Expanding ConfML information
+            modstr = utils.expand_delimited_tokens(
+                condition_str,
+                lambda ref, index: repr(self.dview.get_feature(ref).get_value()))
+            return eval(modstr)
+        else:
+            #Empty condition is true always.
+            return True
+
+class Command(object):
+    """
+    Command is a class that executes actual commands. It provides ways to handle input, output and error 
+    streams and to control execution parameters.
+    """
+        
+    def __init__(self):
+        """
+        Constructor
+        """        
+        self.executable = None
+        self.shell = False
+        self.bufsize = 0
+        self.cwd = None
+        self.envs = None
+        self.arguments = []
+        self.pipes = {}
+        self.streams = {}
+        self.filters = []
+        self.logger = None
+        self.dview = None
+    
+    def set_executable(self, executable):
+        self.executable = executable
+    
+    def set_shell(self, shell):
+        if shell and shell.lower() in ('true', 'yes', '1', 1, True):
+            self.shell = True
+        else:
+            self.shell = False
+        
+    def set_bufsize(self, bufsize):
+        if bufsize:
+            self.bufsize = int(bufsize)
+    
+    def set_cwd(self, cwd):
+        self.cwd = cwd
+    
+    def set_all_envs(self, envs):
+        if envs:
+            self.envs = eval(envs)
+    def set_default_view(self, dview):
+        self.dview = dview
+        
+    def set_env(self, name, value):
+        self.envs[name] = value
+    
+    def set_all_arguments(self, args):
+        self.arguments = args
+    
+    def get_arguments_string(self):
+        """
+        Function to return arguments as a string
+        """
+        arg_string = ""        
+        for value in self.arguments:            
+            arg_string += value
+            arg_string += " "                
+        return arg_string
+    
+    def get_pipe(self, name, mode='w'):
+        """
+        Function to return pipe based on the pipe name in requested mode.
+        """
+        if self.pipes.has_key(name) and isinstance(self.pipes[name], types.IntType):
+        #Subprocess pipe
+            return self.pipes[name]
+        elif self.pipes.has_key(name) and isinstance(self.pipes[name], types.StringType):            
+            return file(self.pipes[name], mode)
+        else:
+            return None
+    
+    def set_streams(self, stdin, stdout, stderr):
+        self.streams["stdin"] = stdin
+        self.streams["stdout"] = stdout
+        self.streams["stderr"] = stderr
+                        
+    def get_streams(self, name, mode="r"):
+        if self.streams.has_key(name) and self.streams[name]:
+        #OK for streams set with subprocess.PIPE
+            return self.streams[name]
+        else:
+        #For file objects
+            return self.get_pipe(name, mode)
+    
+    def set_filters(self, filters):
+        self.filters = filters
+        for f in self.filters:
+            f.set_command(self)
+    
+    def get_filters(self):
+        return self.filters
+        
+    def set_argument(self, value):
+        self.arguments.append(value)
+    
+    def set_all_pipes(self, pipes):
+        for pipe in pipes.keys():
+            self.set_pipe(pipe, pipes[pipe])
+        
+    def set_pipe(self, name, value):
+        if value == "PIPE":
+            #Creating new stream for this.
+            self.pipes[name] = subprocess.PIPE
+        elif value == "STDOUT":
+            self.pipes[name] = subprocess.STDOUT
+        else:
+            #Setting filename
+            self.pipes[name] = value
+            #self.pipes[name] = file(value, 'w')
+            
+    def handle_filters(self):
+        """
+        """
+        for filter in self.filters:
+            filter.report(self.logger)
+
+    def execute(self, replaceDict=None):
+        self.solve_refs()
+        
+        exit_code = 0
+        try:
+            try:
+                if self.cwd is not None:
+                    cwd = self.__replace_helper_variables(self.cwd, replaceDict)
+                else:
+                    cwd = self.cwd
+                command_str = self.executable + " " + self.__replace_helper_variables(self.get_arguments_string(), replaceDict)
+                self.logger.info("Running command: \"%s\"" % command_str)
+                self.logger.info("with args: shell=%s envs=%s cwd=%s bufsize=%s stdin=%s stdout=%s stderr=%s" \
+                                 % (self.shell, self.envs, cwd, self.bufsize, \
+                                    self.get_pipe("stdin", 'r'),self.get_pipe("stdout"), self.get_pipe("stderr")))                    
+                pid = subprocess.Popen(command_str, shell=self.shell, env=self.envs, cwd=cwd,\
+                                          bufsize=self.bufsize, stdin = self.get_pipe("stdin", 'r'),\
+                                          stdout = self.get_pipe("stdout"), stderr = self.get_pipe("stderr"))
+                #Waiting for process to complete
+                retcode = pid.wait()
+                #Storing stream information for possible further processing.
+                self.set_streams(pid.stdin, pid.stdout, pid.stderr)
+                
+                if retcode < 0:
+                    self.logger.error("Child was terminated by signal %s" % (-retcode))
+                else:
+                    self.logger.info("Child returned: %s" % retcode)
+            except OSError, e:
+                self.logger.error("Execution failed: %s", repr(e))            
+            self.handle_filters()
+        except Exception,e:
+            utils.log_exception(self.logger, "Failed to execute command: %s" % e)
+
+    def set_logger(self, logger):
+        self.logger = logger        
+
+    def __replace_helper_variables(self, inputstr, dictionary):
+        retstr = inputstr
+        for key in dictionary.keys():
+            retstr = retstr.replace(key, dictionary[key])            
+        return retstr
+
+    def solve_refs(self):
+        """
+        Function to solve references just before generation.
+        """
+        
+        self.executable = self.__solve_ref(self.executable)
+        self.shell = self.__solve_ref(self.shell)
+        self.bufsize = self.__solve_ref(self.bufsize)
+        self.cwd = self.__solve_ref(self.cwd)
+        for argument in self.arguments:
+            self.arguments[self.arguments.index(argument)] = self.__solve_ref(argument) 
+        for pipe in self.pipes.keys():
+            self.pipes[pipe] = self.__solve_ref(self.pipes[pipe])
+
+    def __solve_ref(self, inputstr):
+        """
+        Internal function to solve whether input is ref or just normal input string. 
+        For refs actual ConfML value is resolved and returned. Non-refs are returned 
+        as such.
+        """        
+        if inputstr and isinstance(inputstr, types.StringType):
+            return utils.expand_refs_by_default_view(inputstr, self.dview)
+        else:
+            return inputstr
+
+
+        
+class Filter(object):
+    """
+    Filter class handles printing information to ConE log using filtering information.
+    Filtering severity, condition and the format of output can be configured in command ml. 
+    """
+
+    def __init__(self):
+        self.severity = None
+        self.condition = None
+        self.input = None
+        self.command = None
+        self.formatter = None
+        
+    def set_severity(self, severity):
+        self.severity = severity
+
+    def set_condition(self, condition):
+        self.condition = condition
+
+    def set_input(self, input):
+        self.input = input
+
+    def set_command(self, command):
+        self.command = command
+
+    def set_formatter(self, formatter):
+        self.formatter = formatter
+        
+    def report(self, logger):
+        input_pipe = self.command.get_streams(self.input)
+        if isinstance(input_pipe, types.FileType):
+            #Subprocess.PIPE and file descriptors supported only.
+            data = input_pipe.read()
+            pattern = re.compile(self.condition)
+            for line in data.splitlines():
+                mo = pattern.match(line)
+                if mo:
+                    lf = self.__get_logger_function(logger)
+                    if self.formatter:                        
+                        lf(self.formatter % mo.groupdict())
+                    else:
+                        lf(line)
+
+    def __get_logger_function(self, logger):
+        if self.severity == "info":
+            return logger.info
+        elif self.severity == "warning":
+            return logger.warning
+        elif self.severity == "debug":
+            return logger.debug
+        elif self.severity == "exception":
+            return logger.exception
+        elif self.severity == "error":
+            return logger.error
+        elif self.severity == "critical":
+            return logger.critical
+        else:
+            #Default
+            return logger.info
+
+        
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/confml/basic_setting_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/implml/file1.commandml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<commandml xmlns="http://www.s60.com/xml/commandml/1">
+
+	<command executable="c:\program1\run.exe" shell="false" bufsize="0" cwd="c:\program1" env="{'MYVAR':'123'}">
+		<argument value="-c some_config.txt" />
+		<argument value="-d some_dir" />
+		<argument value="-x" />
+		<pipe name="stdin" value="PIPE"/>
+		<pipe name="stdout" value="program1.log"/>
+	</command>
+
+	<condition value="False">
+		<command executable="c:\program2\abc.exe" shell="true">
+			<argument value="-c some_config.txt" />
+		</command>
+	</condition>
+
+</commandml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/implml/file2.commandml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<commandml xmlns="http://www.s60.com/xml/commandml/1">
+    
+    <tag name="target" value="footarget"/>
+    
+    <!-- This should be executed, since the value of RealSetting is 3.14 -->
+    <condition value="${BasicSettingTypesTest.RealSetting} &gt; 4e-3">
+        <command executable="python" bufsize="0" cwd="." env="{'MYVAR':'123'}">
+            <argument value="project/tools/print_hello.py"/>
+            <argument value="-c some_config.txt" />
+            <argument value="-d some_dir" />
+            <argument value="-x" />
+            <pipe name="stdin" value="PIPE"/>
+            <pipe name="stdout" value="hello.log"/>
+        </command>
+    </condition>
+    
+    <!-- This, on the other hand, should not -->
+    <condition value="${BasicSettingTypesTest.RealSetting} &lt; 4e-3">
+        <command executable="python" cwd="." shell="true">
+            <argument value="project/tools/print_hello.py"/>
+            <argument value="-c some_config.txt" />
+            <pipe name="stdout" value="should_not_be_created.log"/>
+        </command>
+    </condition>
+    
+    
+    
+    <!-- ====================================== -->
+    <!-- Test executing in the output directory -->
+    <!-- ====================================== -->
+    
+    <!-- Create output directory, or the next command will fail if it doesn't exist -->
+    <command executable="python" shell="true">
+        <argument value='project/tools/makedir.py "%CONE_OUT_ABSOLUTE%"'/>
+    </command>
+    
+    <!-- Execute Python in the output directory and print the working directory there -->
+    <command executable="python" cwd="%CONE_OUT_ABSOLUTE%" shell="true">
+        <argument value='-c "import os; print os.getcwd()"'/>
+        <pipe name="stdout" value="exec_in_output_test.log"/>
+    </command>
+</commandml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/assets/s60/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="s60" version="1">
+  <xi:include href="confml/basic_setting_types_test.confml#/"/>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+</configuration>
Binary file configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/product/root.confml has changed
Binary file configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/family/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/product.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="product" version="1">
+  <xi:include href="assets/s60/root.confml#/"/>
+  <xi:include href="family/root.confml#/"/>
+  <xi:include href="family/product/root.confml#/"/>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/tools/makedir.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os
+dir = sys.argv[1]
+if not os.path.exists(dir):
+    os.makedirs(dir)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/project/tools/print_hello.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+import os, sys
+
+print "Hello"
+print "Cmd line args: %r" % sys.argv[1:]
+print "Env: %r" % os.environ
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_commandml_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,67 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__	
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from testautomation.base_testcase import BaseTestCase
+from commandplugin import commandml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+temp_dir  = os.path.join(ROOT_PATH, "temp")
+testdata  = os.path.join(ROOT_PATH,'project')
+
+class TestCommandPlugin(BaseTestCase):    
+    def test_example_parse_prj(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config,'\.commandml$')
+        
+    def test_generate(self):
+        orig_workdir = os.getcwd()
+        os.chdir(ROOT_PATH)
+        try:
+            OUTPUT_DIR = os.path.join(ROOT_PATH, 'output')
+            self.remove_if_exists(OUTPUT_DIR)
+            
+            fs = filestorage.FileStorage(testdata)
+            p = api.Project(fs)
+            config = p.get_configuration('product.confml')
+            impls = plugin.get_impl_set(config,'file2\.commandml$')
+            impls.output = OUTPUT_DIR
+            impls.generate()
+            
+            self.assert_file_content_equals('hello.log',
+                "Hello\r\n" +
+                "Cmd line args: ['-c', 'some_config.txt', '-d', 'some_dir', '-x']\r\n" +
+                "Env: {'MYVAR': '123'}\r\n")
+            
+            self.assert_file_content_equals('exec_in_output_test.log',
+                os.path.normpath(OUTPUT_DIR) + '\r\n')
+            
+            # Check that the log file of the command that should not be
+            # executed does not exist
+            self.assertFalse(os.path.exists("should_not_be_created.log"))
+        finally:
+            os.chdir(orig_workdir)
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/commandplugin/tests/unittest_parse_commandml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, re, subprocess
+
+import __init__
+from cone.public import api, plugin
+from cone.storage import filestorage
+from testautomation.base_testcase import BaseTestCase
+from commandplugin.commandml import Command, Condition
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'project')
+
+class TestParseCommandMl(BaseTestCase):
+    def _get_impl(self, ref):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impl_set = plugin.get_impl_set(config, re.escape(ref) + '$')
+        self.assertEquals(len(impl_set), 1)
+        return iter(impl_set).next()
+    
+    def test_parse_file1(self):
+        impl = self._get_impl('file1.commandml')
+        self.assertEquals(len(impl.reader.elements), 2)
+        
+        cmd = impl.reader.elements[0]
+        self.assertTrue(isinstance(cmd, Command))
+        self.assertEquals(cmd.executable, r'c:\program1\run.exe')
+        self.assertEquals(cmd.shell, False)
+        self.assertEquals(cmd.bufsize, 0)
+        self.assertEquals(cmd.cwd, r'c:\program1')
+        self.assertEquals(cmd.envs, {'MYVAR': '123'})
+        self.assertEquals(cmd.arguments, ['-c some_config.txt',
+                                          '-d some_dir',
+                                          '-x'])
+        self.assertEquals(cmd.pipes, {'stdin':  subprocess.PIPE,
+                                      'stdout': 'program1.log'})
+        
+        cond = impl.reader.elements[1]
+        self.assertTrue(isinstance(cond, Condition))
+        self.assertEquals(cond.condition, 'False')
+        self.assertEquals(len(cond.commands), 1)
+        cmd = cond.commands[0]
+        self.assertTrue(isinstance(cmd, Command))
+        self.assertEquals(cmd.executable, r'c:\program2\abc.exe')
+        self.assertEquals(cmd.shell, True)
+        self.assertEquals(cmd.bufsize, 0)
+        self.assertEquals(cmd.arguments, ['-c some_config.txt'])
+        self.assertEquals(cmd.pipes, {})
+        
+        self.assertEquals(impl.get_tags(), {})
+    
+    def test_parse_file2(self):
+        impl = self._get_impl('file2.commandml')
+        self.assertEquals(len(impl.reader.elements), 4)
+        
+        self.assertTrue(isinstance(impl.reader.elements[0], Condition))
+        self.assertTrue(isinstance(impl.reader.elements[1], Condition))
+        self.assertTrue(isinstance(impl.reader.elements[2], Command))
+        self.assertTrue(isinstance(impl.reader.elements[3], Command))
+        
+        self.assertEquals(impl.get_tags(), {'target': ['footarget']})
+        
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeCommandPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from commandplugin import __version__
+
+setup(
+    name = "conecommandplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "commandplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Configuration Tool Command plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware", 
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['commandml = commandplugin.commandml:CommandImplReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/contentml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,258 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+A plugin implementation for content selection from ConfigurationLayers.
+'''
+
+
+import re
+import os
+import sys
+import logging
+import shutil
+            
+import __init__
+
+from cone.public import exceptions,plugin,utils,api,container
+from contentplugin import contentmlparser
+
+class ContentImpl(plugin.ImplBase):
+    """
+    ContentImpl plugin finds all content resources from each layer and copies
+    them to the output correctly. It follows the Configuration project override
+    rules, so that the topmost layer files override files on the previous layers.
+    """
+    
+    IMPL_TYPE_ID = 'content'
+    
+    def __init__(self,ref,configuration):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.desc = ""
+        self.logger = logging.getLogger('cone.content(%s)' % self.ref)
+        self.errors = False
+
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        if not self.errors:
+            copylist = self.get_full_copy_list()
+            outputfiles = [entry[1] for entry in copylist]
+            return outputfiles
+        else:
+            return []
+    
+    def get_refs(self):
+        refs = []
+        for output in self.outputs:
+            refs.extend(output.get_refs())
+        if refs:
+            return refs
+        else:
+            return None
+    
+    def get_full_copy_list(self, print_info=False):
+        fullcopylist = []
+        for output in self.outputs:
+            for input in output.inputs:
+                copylist = []
+                if print_info:
+                    self.logger.info('Content copy items from %s to %s' % (input.dir,os.path.join(self.output,output.dir)))
+                
+                if input.__class__.__name__ == "ContentInput":
+                    copylist = self.create_copy_list(content=self.configuration.layered_content(),
+                                                     input=input.dir,
+                                                     output=os.path.join(self.output,output.dir),
+                                                     include_pattern=input.get_include_pattern(),
+                                                     exclude_pattern=input.get_exclude_pattern(),
+                                                     files=input.get_filelist(),
+                                                     flatten=output.flatten,
+                                                     output_file=output.file)
+                elif input.__class__.__name__ == "ExternalContentInput":
+                    #Handling external inputs separately
+                    if input.dir != None:
+                        fulldir = os.path.abspath(os.path.join(self.configuration.get_project().get_storage().get_path(),input.dir))
+                    else:
+                        fulldir = self.configuration.get_project().get_storage().get_path()
+                    
+                    data = container.DataContainer()                     
+                    for root, dirs, files in os.walk(fulldir):
+                        for f in files:                            
+                            filepath = utils.resourceref.norm(os.path.join(root, f))
+                            key = utils.resourceref.replace_dir(filepath,fulldir,"")
+                            data.add_value(key,filepath)
+                            #data.add_value(filepath,filepath)
+                    copylist = self.create_copy_list(content=data,
+                                                     input=input.dir,
+                                                     output=os.path.join(self.output,output.dir),
+                                                     include_pattern=input.get_include_pattern(),
+                                                     exclude_pattern=input.get_exclude_pattern(),
+                                                     files=input.get_filelist(),
+                                                     flatten=output.flatten,
+                                                     output_file=output.file,
+                                                     external=True)
+                else:
+                    logging.getLogger('cone.content').warning("Unknown input %s" % (input.__class__.__name__))
+                
+                fullcopylist += copylist
+                 
+        return fullcopylist
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        self.logger.info('Generating')
+        self.create_output()
+        return 
+
+    def create_output(self,layers=None):
+        """
+        Create the output directory from the content folder files
+        """
+        if not self.errors:
+            datacontainer = self.configuration.layered_content(layers)
+            #root = self.configuration.get_root()
+            copylist = self.get_full_copy_list(True)
+            for copy_item in copylist:
+                sourceref = copy_item[0]
+                targetfile = copy_item[1]
+                external = copy_item[2]                                
+                
+                self.logger.info('Copy from %s to %s' % (sourceref,targetfile))                   
+                if not os.path.exists(os.path.dirname(targetfile)):
+                    os.makedirs(os.path.dirname(targetfile))
+                if not external:
+                    outfile = open(targetfile,"wb")
+                    res = self.configuration.get_storage().open_resource(sourceref,"rb")
+                    outfile.write(res.read())
+                else:
+                    shutil.copyfile(sourceref,targetfile)
+            return 
+        else:
+            self.logger.error('Plugin had errors! Bailing out!')                   
+            
+
+    def create_copy_list(self, **kwargs):
+        """
+        Return a list copy list where each element is a (from,to) tuple 
+        """
+        datacontainer = kwargs.get('content',None)
+        input_dir     = kwargs.get('input','')
+        output_dir    = kwargs.get('output','')
+        output_file   = kwargs.get('output_file','')        
+        include_filter= kwargs.get('include_pattern','')
+        exclude_filter= kwargs.get('exclude_pattern','')
+        files         = kwargs.get('files',[])
+        flatten       = kwargs.get('flatten',False)
+        external      = kwargs.get('external',False)
+        copylist = []
+        contentfiles = datacontainer.list_keys()      
+        """ 
+        First get only the files list from content files.
+        Then apply the possible filters. 
+        """
+        if input_dir == None:
+           self.logger.warning("Input dir is none!")
+
+        
+        if files != []:
+            for f in files:
+                if f in contentfiles:
+                    pass
+                elif f not in  contentfiles:
+                    self.logger.info("File: %s not found in content" % f)   
+            
+
+        if files != []:
+            filesfunc = lambda x: x.lower() in [f.lower() for f in files]
+            contentfiles = filter(filesfunc, contentfiles)
+        if include_filter != "":
+            filter_regexp = include_filter
+            filter_regexp = filter_regexp.replace('.','\.')         
+            filter_regexp = filter_regexp.replace('*','.*')         
+            self.logger.info("filtering with include %s" % filter_regexp)   
+            contentfiles = utils.resourceref.filter_resources(contentfiles,filter_regexp)
+        if exclude_filter != "":
+            filter_regexp = exclude_filter
+            filter_regexp = filter_regexp.replace('.','\.')            
+            filter_regexp = filter_regexp.replace('*','.*')         
+            self.logger.info("filtering with exclude %s" % filter_regexp)   
+            contentfiles = utils.resourceref.neg_filter_resources(contentfiles,filter_regexp)
+        for outfile in contentfiles:
+            sourcefile = ""
+            targetfile = ""
+            
+            if input_dir != None and outfile.startswith(input_dir):
+                sourcefile = datacontainer.get_value(outfile)
+                if flatten:
+                    targetfile = utils.resourceref.join_refs([output_dir, os.path.basename(outfile)])
+                    targetfile = utils.resourceref.norm(targetfile)
+                else:
+                    targetfile = utils.resourceref.replace_dir(outfile,input_dir,output_dir)
+            elif external:
+                #External inputs
+                sourcefile = utils.resourceref.norm(datacontainer.get_value(outfile))
+                                
+                if flatten:
+                    targetfile = utils.resourceref.join_refs([output_dir, os.path.basename(sourcefile)])
+                    targetfile = utils.resourceref.norm(targetfile)
+                else:
+                    fulldir = os.path.abspath(os.path.join(self.configuration.get_project().get_storage().get_path(),input_dir))
+                    targetfile = utils.resourceref.replace_dir(sourcefile,fulldir,output_dir)
+                
+            if output_file:
+                #Renaming output if defined
+                targetfile = targetfile.replace(os.path.basename(targetfile), output_file)
+                    
+            if sourcefile and targetfile:                
+                copylist.append((sourcefile,targetfile, external))
+        return copylist
+
+class ContentImplReaderBase(object):
+    FILE_EXTENSIONS = ['content', 'contentml']
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        parser = cls.parser_class()
+        
+        desc = parser.parse_desc(etree)
+        outputs = parser.parse_outputs(etree)
+        phase = parser.parse_phase(etree)
+        tags = parser.parse_tags(etree)
+        
+        impl = ContentImpl(resource_ref, configuration)
+        impl.desc = desc
+        impl.outputs = outputs
+        if tags:
+            impl.set_tags(tags)
+        for output in impl.outputs:
+            output.set_configuration(configuration)
+        if phase != None:
+            impl.set_invocation_phase(phase)
+            
+        return impl
+
+class ContentImplReader1(ContentImplReaderBase, plugin.ReaderBase):
+    NAMESPACE = 'http://www.s60.com/xml/content/1'
+    parser_class = contentmlparser.Content1Parser
+
+class ContentImplReader2(ContentImplReaderBase, plugin.ReaderBase):
+    NAMESPACE = 'http://www.s60.com/xml/content/2'
+    parser_class = contentmlparser.Content2Parser
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/contentmlparser.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,452 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+'''
+A plugin implementation for content selection from ConfigurationLayers.
+'''
+
+
+import re
+import os
+import sys
+import logging
+import shutil
+import copy
+import xml.parsers.expat
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+            
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class ContentOutput(object):
+    def __init__(self, **kwargs):
+        self._dir = kwargs.get('dir',None)
+        self._file = kwargs.get('file',None)
+        self.flatten = kwargs.get('flatten',False)
+        self.inputs = kwargs.get('inputs', [])
+        self.configuration = None
+
+    def set_configuration(self, configuration):
+        self.configuration = configuration
+        for input in self.inputs:
+            input.configuration = self.configuration
+
+    def get_configuration(self, configuration):
+        self.configuration = configuration
+
+    def path_convert(self, path):
+        (drive, tail) = os.path.splitdrive(path)
+        return tail.lstrip('\\/')
+
+    def get_dir(self):
+        if self.configuration and ConfmlRefs.is_confml_ref(self._dir):
+            parts = self._dir.split(ConfmlRefs.ref_separator)
+            for (index, part) in enumerate(parts):
+                if ConfmlRefs.is_confml_ref(part):
+                    ref = ConfmlRefs.get_confml_ref(part)
+                    parts[index] = self.configuration.get_default_view().get_feature(ref).value
+                    parts[index] = self.path_convert(parts[index])
+                else:
+                    parts[index] = part
+            return (os.sep).join(parts)
+        else:
+            return self.path_convert(self._dir)
+
+    def set_dir(self, dir):
+        self._dir = dir
+
+    def get_file(self):
+        if self.configuration and self._file != None and ConfmlRefs.is_confml_ref(self._file):
+            parts = self._file.split(ConfmlRefs.ref_separator)
+            for (index, part) in enumerate(parts):
+                if ConfmlRefs.is_confml_ref(part):
+                    ref = ConfmlRefs.get_confml_ref(part)
+                    parts[index] = self.configuration.get_default_view().get_feature(ref).value
+                    parts[index] = self.path_convert(parts[index])
+                else:
+                    parts[index] = part
+            return (os.sep).join(parts)
+        else:
+            return self._file
+
+    def set_file(self, file):
+        self._file = file
+
+    dir = property(get_dir, set_dir)
+    file = property(get_file, set_file)
+    
+    def get_refs(self):
+        refs = []
+        for input in self.inputs:
+            refs.extend(input.get_refs())
+        return refs
+
+
+class ContentInput(object):
+    def __init__(self, **kwargs):
+        self._dir = kwargs.get('dir',None)
+        self._file = kwargs.get('file',None)
+        self._include = kwargs.get('include', {})
+        self._exclude = kwargs.get('exclude', {})
+        self.configuration = None
+
+    @property 
+    def dir(self):
+        
+        if self.configuration and ConfmlRefs.is_confml_ref(self._dir):
+            cref = ConfmlRefs.get_confml_ref(self._dir)
+            return self.configuration.get_default_view().get_feature(cref).value
+        else:
+            return self._dir
+
+    @property 
+    def file(self):
+        
+        if self._file and self.configuration and ConfmlRefs.is_confml_ref(self._file):
+            cref = ConfmlRefs.get_confml_ref(self._file)
+            return self.configuration.get_default_view().get_feature(cref).value
+        else:
+            return self._file
+
+
+    def _dereference_dict(self, data):
+        if self.configuration:
+            # Make a deep copy of the data, or otherwise get_refs() will
+            # return the correct refs only on the first call, as the
+            # references are replaced here
+            data = copy.deepcopy(data)
+            
+            dview = self.configuration.get_default_view()
+            for key in data:
+                key_list = data.get(key)
+                for (index,elem) in enumerate(key_list):
+                    if ConfmlRefs.is_confml_ref(elem):
+                        cref = ConfmlRefs.get_confml_ref(elem)
+                        try:
+                            # change None value to empty string
+                            cvalue = dview.get_feature(cref).value or ''
+                            if utils.is_list(cvalue):
+                                cvalue = ", ".join(cvalue)
+                            key_list[index] = cvalue
+                        except exceptions.NotFound:
+                            logging.getLogger('cone.content').error("Feature ref '%s' in include key '%s' not found." % (cref,key))
+        return data
+
+    @property
+    def include(self):
+        return self._dereference_dict(self._include)
+
+    @property
+    def exclude(self):
+        return self._dereference_dict(self._exclude)
+
+    def get_filelist(self):
+        filelist = []
+        if self.file:
+            filelist.append(self.file)
+        for elem in self.include.get('files',[]):
+            elem = elem.lower().split(',')
+            filelist += [selem.strip() for selem in elem]
+        return filelist
+
+    def get_include_pattern(self):
+        return self.include.get('pattern',[''])[0]
+
+    def get_exclude_pattern(self):
+        return self.exclude.get('pattern',[''])[0]
+    
+    def get_refs(self):
+        refs = []
+        if self._dir is not None:
+            refs.extend(utils.extract_delimited_tokens(self._dir))
+        if self._file is not None:
+            refs.extend(utils.extract_delimited_tokens(self._file))
+        for value_list in self._include.itervalues():
+            for value in value_list:
+                refs.extend(utils.extract_delimited_tokens(value))
+        for value_list in self._exclude.itervalues():
+            for value in value_list:
+                refs.extend(utils.extract_delimited_tokens(value))
+        return refs
+
+
+class ExternalContentInput(ContentInput):
+    def __init__(self, **kwargs):
+        super(ExternalContentInput,self).__init__(**kwargs)        
+
+class ContentParserBase(object):
+    """
+    Parses a single content implml file
+    """ 
+    NAMESPACES = ['http://www.s60.com/xml/content/1']
+    INCLUDE_ATTR = ['pattern']
+    EXCLUDE_ATTR = ['pattern']
+    def __init__(self):
+        self.namespaces = self.NAMESPACES
+
+    def parse_phase(self,etree):
+        phase = ""
+        phase = etree.get('phase')
+        return phase
+
+    def parse_desc(self,etree):
+        desc = ""
+        desc_elem = etree.find("{%s}desc" % self.namespaces[0])
+        if desc_elem != None:
+            desc = desc_elem.text
+        return desc
+
+    def parse_tags(self,etree):
+        tags = {}
+        for tag in etree.getiterator("{%s}tag" % self.namespaces[0]):
+            tagname = tag.get('name','')
+            tagvalue = tag.get('value')
+            values = tags.get(tagname,[])
+            values.append(tagvalue)
+            tags[tagname] = values
+        return tags
+
+    def parse_input_include(self,etree):
+        include_elem = etree.getiterator("{%s}include" % self.namespaces[0])
+        include = {}
+        for f in include_elem:
+            for key in f.keys():
+                # Add the attribute if it is found to include dict
+                include[key] = []
+                include[key].append(f.get(key))
+        return include
+
+    def parse_input_exclude(self,etree):
+        elem = etree.getiterator("{%s}exclude" % self.namespaces[0])
+        exclude = {}
+        for f in elem:
+            for key in f.keys():
+                # Add the attribute if it is found
+                exclude[key] = []
+                exclude[key].append(f.get(key))
+        return exclude
+
+class Content1Parser(ContentParserBase):
+    """
+    Parses a single content implml file
+    """ 
+    NAMESPACES = ['http://www.s60.com/xml/content/1']
+    def __init__(self):
+        super(ContentParserBase,self).__init__()
+        self.namespaces = self.NAMESPACES
+
+    def parse_input(self,etree):
+        input_elem = etree.find("{%s}input" % self.namespaces[0])
+        input_dir = ""
+        input_file = ""
+        if input_elem != None:
+            if input_elem.get('dir'):
+                input_dir = input_elem.get('dir')
+            if input_elem.get('file'):
+                input_dir = input_elem.get('file')
+            includes = self.parse_input_include(etree)
+            excludes = self.parse_input_exclude(etree)
+            return ContentInput(dir=input_dir, include=includes, exclude=excludes, file=input_file)
+        return None
+
+    def parse_outputs(self,etree):
+        output_elem = etree.find("{%s}output" % self.namespaces[0])
+        output_dir = ""        
+        output_flatten = False
+        inputs = []
+        if output_elem != None:
+            output_dir = output_elem.get('dir','')
+            output_flatten = output_elem.get('flatten','') == "true"
+        input = self.parse_input(etree)
+        if input:
+            inputs.append(input)
+        return [ContentOutput(dir=output_dir, flatten=output_flatten, inputs=inputs)]
+
+class Content2Parser(ContentParserBase):
+    """
+    Parses a single content implml file
+    """ 
+    NAMESPACES = ['http://www.s60.com/xml/content/2']
+    def __init__(self):
+        super(ContentParserBase,self).__init__()
+        self.namespaces = self.NAMESPACES
+            
+
+    def parse_input(self,input_elem):
+        input = None
+        input_dir = ''
+        input_file = ''
+        if input_elem != None:
+            if input_elem.get('dir'):
+                input_dir = input_elem.get('dir')
+            if input_elem.get('file'):
+                input_file= input_elem.get('file')
+            includes = self.parse_input_include(input_elem)
+            excludes = self.parse_input_exclude(input_elem)
+            input = ContentInput(dir=input_dir, include=includes, exclude=excludes, file=input_file)
+        return input
+    
+    def parse_external_input(self,input_elem):
+        input = None
+        input_dir = ''
+        if input_elem != None:
+            if input_elem.get('dir'):
+                input_dir = input_elem.get('dir')
+            includes = self.parse_input_include(input_elem)
+            excludes = self.parse_input_exclude(input_elem)
+            input = ExternalContentInput(dir=input_dir, include=includes, exclude=excludes)
+        return input
+
+    def parse_outputs(self,etree):
+        outputs = []
+        for output_elem in etree.getiterator("{%s}output" % self.namespaces[0]):
+            inputs = []
+            output_dir = output_elem.get('dir','')
+            output_file = output_elem.get('file','')
+            output_flatten = output_elem.get('flatten','') == "true"
+            for input_elem in output_elem.getiterator("{%s}input" % self.namespaces[0]):
+                inputs.append(self.parse_input(input_elem))
+            for input_elem in output_elem.getiterator("{%s}externalinput" % self.namespaces[0]):
+                inputs.append(self.parse_external_input(input_elem))
+            outputs.append(ContentOutput(dir=output_dir, flatten=output_flatten, inputs=inputs, file=output_file))
+        return outputs
+
+
+class ContentImplReader(object):
+    """
+    Parses a single content implml file
+    """ 
+    PARSERS = {'http://www.s60.com/xml/content/1' : Content1Parser,
+              'http://www.s60.com/xml/content/2' : Content2Parser}
+    def __init__(self):
+        self.desc = None
+        self.outputs = None
+        self.phase = None
+
+    def fromstring(self, xml_as_string):
+        etree = ElementTree.fromstring(xml_as_string)
+        # Loop through parsers and try to find a match
+        (namespace,elemname) = get_elemname(etree.tag)
+        pclass = self.PARSERS.get(namespace, None)
+        self.parser = pclass()
+        self.desc = self.parser.parse_desc(etree)
+        self.outputs = self.parser.parse_outputs(etree)
+        self.phase = self.parser.parse_phase(etree)
+        self.tags = self.parser.parse_tags(etree)
+        return
+
+namespace_pattern = re.compile("{(.*)}(.*)")
+nonamespace_pattern = re.compile("(.*)")
+
+def get_elemname(tag):
+    
+    ns = namespace_pattern.match(tag)
+    nn = nonamespace_pattern.match(tag)
+    if ns:
+        namespace = ns.group(1)
+        elemname = ns.group(2)
+        return (namespace,elemname)
+    elif nn:
+        namespace = ""
+        elemname = nn.group(1)
+        return (namespace,elemname)
+    else:
+        raise exceptions.ParseError("Could not parse tag %s" % tag)
+
+class ConfmlRefs(object):
+    
+    ref_pattern = re.compile('^\$\{(.*)\}$')
+    cref_pattern = re.compile('.+\..+')
+    ref_separator = '/'
+       
+    @classmethod
+    def is_ref_like(cls, variableref):
+        """
+        
+        Returns true if the given variable represents a ref
+        """
+        return cls.cref_pattern.match(variableref) != None
+    
+    @classmethod
+    def is_confml_ref(cls, variableref):
+        """
+        
+        Returns true if the given variable ref is a confml reference
+        """
+        
+        pos = variableref.find(cls.ref_separator)
+        if pos == -1:
+            return cls.ref_pattern.match(variableref) != None
+        else:
+            return cls.is_confml_refs(variableref)
+                
+    @classmethod
+    def is_confml_refs(cls, variableref):
+        """
+        
+        Returns true if the given variable ref is a confml reference
+        """
+        ret = False
+        parts = variableref.split(cls.ref_separator)
+        for p in parts:
+            if cls.is_confml_ref(p) == True:
+                ret = True
+        return ret
+                
+
+    @classmethod
+    def get_confml_ref(cls, variableref):
+        """
+        
+        Returns true if the given variable ref is a confml reference
+        """
+        pos = variableref.find(cls.ref_separator)
+        if pos == -1:
+            matchref = cls.ref_pattern.match(variableref)
+            if matchref:
+                return matchref.group(1)
+        else:
+            return cls.get_confml_refs(variableref)
+
+    @classmethod
+    def get_confml_refs(cls, variableref):
+        """
+        
+        Returns an array of confml refs based on variableref
+        """
+        parts = variableref.split(cls.ref_separator)
+        ret = []
+        for p in parts:
+            matchref = cls.ref_pattern.match(p)
+            if matchref:
+                ref = matchref.group(1)
+                if not ref in ret:
+                    ret.append(matchref.group(1))
+            else:
+				ret.append(p)
+        return ret
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/CTD_Special.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CTD_Special" version="">
+<feature ref="CTD_Special" name="CTD special purposes" relevant="">
+	<setting ref="InputPath" name="Input path" type="string"/>
+</feature>
+	<data>
+		<CTD_Special>
+			<InputPath></InputPath>
+		</CTD_Special>
+	</data>
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/CVC_Content.confml has changed
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/confml/content.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/override.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+S60 default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/s60.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+hey!!
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/content/test/test_CAP_letters.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+S60 default
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_multi_outputs.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <tag name='target' value='foo'/>
+  <output dir="content">
+    <input>
+      <include files="test/override.txt, test/s60.txt"/>
+    </input>
+  </output>
+  <output dir="include" flatten='true'>
+    <input>
+      <include files="test/s60.txt"/>
+    </input>
+  </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_tags.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <tag name='target' value='rofs3'/>
+  <tag name='target' value='uda'/>
+  <output dir="content">
+    <input>
+      <include files="test/override.txt, test/s60.txt"/>
+    </input>
+  </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/content2_with_tags_refs.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <tag name='target' value='${ContentFiles.target_tag}'/>
+  <output dir="content">
+    <input>
+      <include files="test/override.txt, test/s60.txt"/>
+    </input>
+  </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/copy.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <desc>Copy content.</desc>
+  <output dir="content"/>
+  <input dir="">
+    <exclude pattern='.svn'/>
+  </input>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/copy_files.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input>
+    <include files="test/override.txt, test/s60.txt"/>
+  </input>
+  <output dir="content"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/file_refs.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+    <input file="${content.outputfile_1}"/>
+    <output file="${content.inputfile_1}" someother="sss"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_capital_file_input.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <output dir="content" flatten="true">
+    <input file="test/test_CAP_letters.txt"/>
+  </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input dir="${content.inputdir}"/>
+  <output dir="${content.outputdir}"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs2.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input dir="${content.inputdir2}"/>
+  <output dir="${content.outputdir2_part1}/${content.outputdir2_part2}"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_refs3.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input dir="${content.inputdir2}"/>
+  <output dir="example/${content.outputdir2_part2}"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_content_with_sequence_refs.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input>
+   <include files="${ContentFiles.contentfile.fileelem.localPath}"/>
+  </input> 
+  <output dir="content" flatten="true"/>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_external_input.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+    <desc>Copy only prod</desc>
+    <output dir="content_external">
+    	<externalinput dir="external_content/folder1"/>
+    </output>    
+    <output dir="content_external">
+    	<externalinput dir="external_content">
+        	<include pattern=".txt"/>
+        	<exclude pattern=".svn"/>
+    	</externalinput>
+    </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_external_with_ref.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+	<desc>Copy test file</desc>
+    <output dir="content/private/12345678" file="abcdef00.cre">
+    	<externalinput dir="${CTD_Special.InputPath}">
+    		<include files="cccccc00_empty.cre"/>
+    	</externalinput>
+    </output>
+</content>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/implml/test_filter_both.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+    <desc>Copy only prod</desc>
+    <tag name='target' value='rofs3'/>
+    <tag name='target' value='uda'/>
+    <output dir="content"/>
+    <input>
+        <include pattern="prod"/>
+        <exclude pattern=".svn"/>
+    </input>
+</content>
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/assets/s60/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/content/test/override.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+NCP11 override
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/content/test/shout.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Shout out!
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/product/content/prodX/jee/ProdX_specific.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+földska
\ No newline at end of file
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/product/root.confml has changed
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/family/root.confml has changed
Binary file configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/contentproject/product.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_confmlrefs.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import pkg_resources 
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+try:
+	pkg_resources.require('ConeContentPlugin')
+except pkg_resources.DistributionNotFound:
+	import __init__
+		
+from contentplugin import contentmlparser
+
+class TestConfmlRefs(unittest.TestCase):    
+    
+    def test_is_confml_ref_of_plain_string(self):
+        self.assertFalse(contentmlparser.ConfmlRefs.is_confml_ref('foo.bar'))
+
+    def test_is_confml_ref_of_variable_string(self):
+        self.assertTrue(contentmlparser.ConfmlRefs.is_confml_ref('${foo.bar}'))
+
+    def test_is_confml_ref_of_variable_string_with_dollar(self):
+        self.assertTrue(contentmlparser.ConfmlRefs.is_confml_ref('${features.foo$bar}'))
+
+    def test_get_confml_ref_with_normal_ref(self):
+        self.assertEquals(contentmlparser.ConfmlRefs.get_confml_ref('${features.foo.bar}'), 'features.foo.bar')
+
+    def test_get_confml_ref_with_invalid_ref(self):
+        self.assertEquals(contentmlparser.ConfmlRefs.get_confml_ref('${features.foo.bar'), None)
+    
+    def test_get_two_confml_refs(self):
+        self.assertTrue(contentmlparser.ConfmlRefs.is_ref_like('ab.cd'))
+        self.assertTrue(contentmlparser.ConfmlRefs.is_confml_ref('${features.foo.bar}/${features.foo.bar2}'))
+        self.assertEquals(contentmlparser.ConfmlRefs.get_confml_refs('${features.foo.bar}/${features.foo.bar2}'), ['features.foo.bar', 'features.foo.bar2'])
+        self.assertEquals(contentmlparser.ConfmlRefs.get_confml_refs('${features.foo.bar}/${features.foo.bar}'), ['features.foo.bar'])
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_copy.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os
+import pkg_resources 
+try:
+    pkg_resources.require('ConeContentPlugin')
+except pkg_resources.DistributionNotFound:
+    import __init__
+    
+from cone.public.exceptions import NotSupportedException
+from contentplugin import contentml
+
+class TestCreateContentPlugin(unittest.TestCase):    
+    def test_create_content_impl(self):
+        imp = contentml.ContentImpl('test.content',None)
+        pass
+
+class TestContentImplementation(unittest.TestCase):    
+    def setUp(self):
+        self.imp = contentml.ContentImpl('test.content',None)
+        pass
+
+    def test_content_filter(self):
+        files = ['aaa.txt', 'bbb.txt']
+        filesfunc = lambda x: x.lower() in [file.lower() for file in files]
+        self.assertEquals(filesfunc('aaa'), False)
+        self.assertEquals(filesfunc('AAA'), False)
+        self.assertEquals(filesfunc('AAA.txt'), True)
+        self.assertEquals(filesfunc('aaa.txt'), True)
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_parseimpl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,345 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import pkg_resources 
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+try:
+	pkg_resources.require('ConeContentPlugin')
+except pkg_resources.DistributionNotFound:
+	import __init__
+		
+from contentplugin import contentmlparser
+
+
+invalidxml_string = '<?xml version="1.0" encoding="UTF-8"?><content xmlns="http://www.s60.com/xml/content/1">'
+
+contentml_string = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+    <tag name='target' value='core'/>
+    <tag name='target' value='rofs3'/>
+    <tag name='test' value='foo'/>
+	<desc>Description field text</desc>
+	<input dir="test">
+		<include pattern="prod"/>
+		<exclude pattern=".svn"/>
+	</input>
+	<output dir="content" someother="sss"/>
+</content>'''
+
+contentml_files_string = '''<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+    <desc>Description field text</desc>
+    <input dir="test">
+      <include files="test/foobar.txt, test/bar.txt"/>
+    </input>
+    <output dir="content" someother="sss" flatten="true"/>
+</content>
+'''
+
+contentml_string_with_phase = \
+'<?xml version="1.0" encoding="UTF-8"?>'\
+'<content xmlns="http://www.s60.com/xml/content/1" phase="pre">'\
+'  <desc>Description field text</desc>'\
+'  <input dir="test">'\
+'    <include pattern="prod"/>'\
+'    <exclude pattern=".svn"/>'\
+'  </input>'\
+'  <output dir="content" someother="sss"/>'\
+'</content>'
+
+
+contentml_brief = \
+'<?xml version="1.0" encoding="UTF-8"?>'\
+'<content xmlns="http://www.s60.com/xml/content/1">'\
+'	<input dir="test"/>'\
+'	<output dir="content" someother="sss"/>'\
+'</content>'
+
+contentml_brief2 = \
+'<?xml version="1.0" encoding="UTF-8"?>'\
+'<content xmlns="http://www.s60.com/xml/content/1">'\
+'</content>'
+
+
+contentml_with_refs = \
+'<?xml version="1.0" encoding="UTF-8"?>'\
+'<content xmlns="http://www.s60.com/xml/content/1">'\
+'    <desc>Description field text</desc>'\
+'    <input dir="${features.inputref}">'\
+'        <include pattern="${features.inputfilter}"/>'\
+'    </input>'\
+'    <output dir="${features.outputref}" someother="sss"/>'\
+'</content>'
+
+contentml2_string = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+    <tag name='target' value='core'/>
+    <tag name='target' value='rofs3'/>
+    <tag name='test' value='foo'/>
+    <desc>Description field text</desc>
+    <output dir="content">
+      <input dir="test">
+          <include pattern="prod"/>
+          <exclude pattern=".svn"/>
+      </input>
+    </output>
+    <output dir="${features.outputref}">
+      <input dir="${features.inputref}">
+        <include pattern="${features.inputfilter}"/>
+      </input>
+    </output>
+</content>'''
+
+content2_multi = '''<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+  <tag name='target' value='foo'/>
+  <output dir="content">
+    <input>
+      <include files="test/override.txt, test/s60.txt"/>
+    </input>
+  </output>
+  <output dir="include" flatten='true'>
+    <input file="test/s60.txt"/>
+  </output>
+</content>'''
+
+external_content_multi = '''<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+    <desc>Copy only prod</desc>
+    <output dir="content">
+        <externalinput dir="external_content/folder1"/>
+    </output>    
+    <output dir="content">
+        <externalinput dir="external_content">
+            <include pattern=".txt"/>
+            <exclude pattern=".svn"/>
+        </externalinput>
+    </output>
+</content>'''
+
+
+
+
+class TestContentParseimpl(unittest.TestCase):    
+    
+    def test_parse_desc(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        desc = reader.parse_desc(etree)
+        self.assertEquals(desc,'Description field text')
+
+    def test_parse_output(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        output = reader.parse_outputs(etree)
+        self.assertEquals(output[0].dir,'content')
+
+    def test_parse_input_dir(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        input = reader.parse_input(etree)
+        self.assertEquals(input.dir,'test')
+
+    def test_parse_input_include(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        include = reader.parse_input_include(etree)
+        self.assertEquals(include,{'pattern': ['prod']})
+
+    def test_parse_input_files(self):
+        etree = ElementTree.fromstring(contentml_files_string)
+        reader = contentmlparser.Content1Parser()
+        include = reader.parse_input_include(etree)
+        self.assertEquals(include,{'files': ['test/foobar.txt, test/bar.txt']})
+
+    def test_parse_input_include_not_found(self):
+        etree = ElementTree.fromstring(contentml_brief)
+        reader = contentmlparser.Content1Parser()
+        include = reader.parse_input_include(etree)
+        self.assertEquals(include,{})
+
+    def test_parse_input_exclude(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        include = reader.parse_input_exclude(etree)
+        self.assertEquals(include,{'pattern': ['.svn']})
+
+    def test_parse_input_exclude_not_found(self):
+        etree = ElementTree.fromstring(contentml_brief)
+        reader = contentmlparser.Content1Parser()
+        include = reader.parse_input_exclude(etree)
+        self.assertEquals(include,{})
+
+    def test_parse_tags(self):
+        etree = ElementTree.fromstring(contentml_string)
+        reader = contentmlparser.Content1Parser()
+        tags = reader.parse_tags(etree)
+        self.assertEquals(tags,{'target' : ['core','rofs3'],
+                                'test' : ['foo']})
+
+class TestContent2Parseimpl(unittest.TestCase):    
+    
+    def test_parse_desc(self):
+        etree = ElementTree.fromstring(contentml2_string)
+        reader = contentmlparser.Content2Parser()
+        desc = reader.parse_desc(etree)
+        self.assertEquals(desc,'Description field text')
+
+    def test_parse_outputs(self):
+        etree = ElementTree.fromstring(contentml2_string)
+        reader = contentmlparser.Content2Parser()
+        outputs = reader.parse_outputs(etree)
+        self.assertEquals(outputs[0].dir,'content')
+        self.assertEquals(len(outputs[0].inputs),1)
+        self.assertEquals(outputs[0].inputs[0].dir,'test')
+        self.assertEquals(outputs[0].inputs[0].include,{'pattern': ['prod']})
+        self.assertEquals(outputs[1].inputs[0].dir,'${features.inputref}')
+        self.assertEquals(outputs[1].dir,'${features.outputref}')
+
+
+class TestContentParser(unittest.TestCase):    
+    def test_parse_from_string(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml_string)
+        self.assertEquals(reader.desc,'Description field text')
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'test')
+        self.assertEquals(reader.outputs[0].inputs[0].include, {'pattern':['prod']})
+        self.assertEquals(reader.outputs[0].inputs[0].exclude, {'pattern':['.svn']})
+        self.assertEquals(reader.phase, None)
+        self.assertEquals(reader.tags, {'target' : ['core','rofs3'],
+                                        'test' : ['foo']})
+
+    def test_parse_from_string_with_phase(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml_string_with_phase)
+        self.assertEquals(reader.desc,'Description field text')
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'test')
+        self.assertEquals(reader.outputs[0].inputs[0].include, {'pattern':['prod']})
+        self.assertEquals(reader.outputs[0].inputs[0].exclude, {'pattern':['.svn']})
+        self.assertEquals(reader.phase, 'pre')
+
+    def test_parse_from_string_brief(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml_brief)
+        self.assertEquals(reader.desc,"")
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'test')
+        self.assertEquals(reader.outputs[0].inputs[0].include, {})
+        self.assertEquals(reader.outputs[0].inputs[0].exclude, {})
+
+    def test_parse_from_string_brief2(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml_brief2)
+        self.assertEquals(reader.desc,"")
+        self.assertEquals(reader.outputs[0].dir,"")
+        self.assertEquals(len(reader.outputs[0].inputs),0)
+
+    def test_parse_from_string_with_refs(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml_with_refs)
+        
+        self.assertEquals(reader.outputs[0].dir,"${features.outputref}")
+        self.assertEquals(reader.outputs[0].inputs[0].dir,"${features.inputref}")
+        self.assertEquals(reader.outputs[0].inputs[0].include, {'pattern': ['${features.inputfilter}']} )
+
+    def test_content2_parse_outputs(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(contentml2_string)
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(len(reader.outputs[0].inputs),1)
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'test')
+        self.assertEquals(reader.outputs[0].inputs[0].include,{'pattern': ['prod']})
+        self.assertEquals(reader.outputs[1].inputs[0].dir,'${features.inputref}')
+        self.assertEquals(reader.outputs[1].dir,'${features.outputref}')
+        self.assertEquals(reader.tags, {'target' : ['core','rofs3'],
+                                        'test' : ['foo']})
+
+    def test_content2_parse_multi(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(content2_multi)
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(len(reader.outputs[0].inputs),1)
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'')
+        self.assertEquals(reader.outputs[0].inputs[0].include,{'files': ['test/override.txt, test/s60.txt']})
+        self.assertEquals(reader.outputs[1].inputs[0].file,'test/s60.txt')
+        self.assertEquals(reader.outputs[1].inputs[0].get_filelist(),['test/s60.txt'])
+
+    def test_external_content_parse_multi(self):
+        reader = contentmlparser.ContentImplReader()
+        reader.fromstring(external_content_multi)
+        self.assertEquals(reader.outputs[0].dir,'content')
+        self.assertEquals(len(reader.outputs[0].inputs),1)
+        self.assertEquals(len(reader.outputs[1].inputs),1)
+        self.assertEquals(reader.outputs[0].inputs[0].dir,'external_content/folder1')
+        self.assertEquals(reader.outputs[0].inputs[0].include,{})
+        self.assertEquals(reader.outputs[1].inputs[0].dir,'external_content')
+        self.assertEquals(reader.outputs[1].inputs[0].include,{'pattern': ['.txt']})
+
+
+class TestContentOutput(unittest.TestCase):    
+    def test_content_output_dir(self):
+        conout = contentmlparser.ContentOutput(dir='foobar/test')
+        self.assertEquals(conout.dir, 'foobar/test')
+
+    def test_content_output_include(self):
+        conout = contentmlparser.ContentOutput(flatten=True)
+        self.assertEquals(conout.flatten, True)
+
+    def test_path_convert(self):
+        conout = contentmlparser.ContentOutput()
+        self.assertEquals(conout.path_convert('z:\\test\\foo\\bar.txt'), 'test\\foo\\bar.txt')
+        self.assertEquals(conout.path_convert('z:/test/foo/bar.txt'), 'test/foo/bar.txt')
+
+class TestContentInput(unittest.TestCase):    
+    def test_content_input_dir(self):
+        conin = contentmlparser.ContentInput(dir='foobar/test')
+        self.assertEquals(conin.dir, 'foobar/test')
+
+    def test_content_include_pattern(self):
+        conin = contentmlparser.ContentInput(include={'pattern':['foo','bar']})
+        self.assertEquals(conin.get_include_pattern(), 'foo')
+
+    def test_content_exclude_pattern(self):
+        conin = contentmlparser.ContentInput(exclude={'pattern':['foo','bar']})
+        self.assertEquals(conin.get_exclude_pattern(), 'foo')
+
+    def test_parse_invalid_xml(self):
+        try:
+            etree = ElementTree.fromstring(invalidxml_string)
+            self.fail('Parsing invalid xml succeeds?')
+        except:
+            pass
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/contentplugin/tests/unittest_content_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,261 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import logging
+import __init__
+		
+from cone.public import exceptions,plugin,api,container
+from cone.storage import filestorage
+from contentplugin import contentml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'contentproject')
+
+
+class TestContentPlugin(unittest.TestCase):
+	    
+    def test_create_copy_list_from_datacontainer_with_test(self):
+        '''
+        Test that the loading of the plugins works
+        '''
+        data = container.DataContainer()
+        data.add_value('test/test.txt','/foo/content/test/test.txt')
+        data.add_value('test/test.txt','/bar/content/test/test.txt')
+        data.add_value('product/aaa.txt','/foo/content/product/aaa.txt')
+        data.add_value('images/kuva.jpg','/foo/content/images/kuva.jpg')
+        data.add_value('include/hide.iby','/bar/content/include/hide.iby')
+        impl = contentml.ContentImpl("foo",None)
+        copylist = impl.create_copy_list(content=data, input='test',output='content')
+        self.assertEquals(copylist[0][1],'content/test.txt')
+
+    def test_create_copy_list_from_datacontainer_with_defauls(self):
+        '''
+        Test that the loading of the plugins works
+        '''
+        data = container.DataContainer()
+        data.add_value('test/test.txt','/foo/content/test/test.txt')
+        data.add_value('test/test.txt','/bar/content/test/test.txt')
+        data.add_value('product/aaa.txt','/foo/content/product/aaa.txt')
+        data.add_value('images/kuva.jpg','/foo/content/images/kuva.jpg')
+        data.add_value('include/hide.iby','/bar/content/include/hide.iby')
+        impl = contentml.ContentImpl("foo",None)
+        copylist = impl.create_copy_list(content=data)
+        self.assertEquals(copylist[0][0],'/bar/content/test/test.txt')
+        self.assertEquals(copylist[0][1],'test/test.txt')
+        self.assertEquals(copylist[1][0],'/bar/content/include/hide.iby')
+        self.assertEquals(copylist[1][1],'include/hide.iby')
+
+    def test_create_copy_list_from_datacontainer_with_filters(self):
+        '''
+        Test that the loading of the plugins works
+        '''
+        data = container.DataContainer()
+        data.add_value('test/test.txt','/foo/content/test/test.txt')
+        data.add_value('test/test.txt','/bar/content/test/test.txt')
+        data.add_value('product/aaa.txt','/foo/content/product/aaa.txt')
+        data.add_value('images/kuva.jpg','/foo/content/images/kuva.jpg')
+        data.add_value('include/hide.iby','/bar/content/include/hide.iby')
+        impl = contentml.ContentImpl("foo",None)
+        copylist = impl.create_copy_list(content=data,input='include',include_filter='*.iby')
+        self.assertEquals(copylist[0][0],'/bar/content/include/hide.iby')
+        self.assertEquals(copylist[0][1],'hide.iby')
+
+class TestContentPluginOnFileStorage(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        self.workdir = 'workdir'
+        if not os.path.exists(self.workdir):
+            os.mkdir(self.workdir)
+        os.chdir(self.workdir)
+        pass
+
+    def tearDown(self):
+    	os.chdir(self.curdir)
+        if os.path.exists(self.workdir):
+            shutil.rmtree(self.workdir)
+            pass
+
+    def load_config(self, config='product.confml'):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        return p.get_configuration(config)
+    
+    def load_impl(self, resource_ref, config='product.confml'):
+        configuration = self.load_config(config)
+        impls = plugin.ImplFactory.get_impls_from_file(resource_ref, configuration)
+        self.assertEquals(len(impls), 1)
+        impl = impls[0]
+        impl.set_output_root(self.output)
+        return impl
+
+    def test_configuration_parse_resource(self):
+        impl = self.load_impl('assets/s60/implml/test_filter_both.content')
+        self.assertEquals(impl.outputs[0].dir,'content')
+        self.assertEquals(impl.outputs[0].inputs[0].include,{'pattern': ['prod']})
+        self.assertEquals(impl.outputs[0].inputs[0].exclude,{'pattern': ['.svn']})
+        self.assertEquals(impl.get_tags(), {'target': ['rofs3', 'uda']})
+        self.assertEquals(impl.has_tag({'target':['rofs3']}), True)
+
+
+    def test_configuration_parse_content2(self):
+        impl = self.load_impl('assets/s60/implml/content2_with_tags.content')
+        self.assertEquals(impl.outputs[0].dir,'content')
+        self.assertEquals(impl.outputs[0].inputs[0].include,{'files': ['test/override.txt, test/s60.txt']})
+        self.assertEquals(impl.get_tags(), {'target': ['rofs3', 'uda']})
+        self.assertEquals(impl.has_tag({'target':['rofs3']}), True)
+
+    def test_configuration_parse_content2_with_tag_refs(self):
+        impl = self.load_impl('assets/s60/implml/content2_with_tags_refs.content')
+        self.assertEquals(impl.get_tags(), {'target': ['rofs3']})
+        self.assertEquals(impl.has_tag({'target':['rofs3']}), True)
+
+    def test_configuration_parse_and_filter_implementation_with_tags(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config,'\.content$')
+        impls_rofs3 = impls.filter_implementations(tags={'target':['rofs3']})
+        self.assertEquals(len(list(impls_rofs3)),3)
+        
+    def test_configuration_parse_content_with_include_files(self):
+        impl = self.load_impl('assets/s60/implml/copy_files.content')
+        self.assertEquals(impl.outputs[0].inputs[0].include['files'],['test/override.txt, test/s60.txt'])
+
+    def test_configuration_content_get_full_copy_list(self):
+        impl = self.load_impl('assets/s60/implml/copy_files.content')
+        files = impl.get_full_copy_list()
+        self.assertEquals(files[0],('family/content/test/override.txt', 'output/content/test/override.txt', False))
+
+    def test_configuration_content_list_output_files(self):
+        config = self.load_config()
+        impls = plugin.get_impl_set(config,'\.content$')
+        impls.output = self.output
+        files = impls.list_output_files()
+        self.assertTrue('output/content/test/override.txt' in files)
+
+    def test_configuration_content_list_output_files_with_refs_filter(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_sequence_refs.content')
+        files = impl.list_output_files()
+        self.assertEquals(files[0],'output/content/override.txt')
+
+    def test_configuration_content_list_output_files_with_exclude_filter(self):
+        impl = self.load_impl('assets/s60/implml/test_filter_both.content')
+        files = impl.list_output_files()
+        self.assertEquals(files[0],'output/content/prodX/jee/ProdX_specific.txt')
+#
+    def test_configuration_get_input_with_ref(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_refs.content')
+        self.assertEquals(impl.outputs[0].dir, 'content')
+        self.assertEquals(impl.outputs[0].inputs[0].dir, 'content')
+
+    def test_configuration_get_include_with_refs(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_sequence_refs.content')
+        self.assertEquals(impl.outputs[0].inputs[0].include['files'], ['test/override.txt'])
+        self.assertEquals(impl.list_output_files(), ['output/content/override.txt'])
+
+    def test_configuration_get_include_with_refs(self):
+        impl = self.load_impl('assets/s60/implml/copy.content')
+        expected = ['output/content/prodX/jee/ProdX_specific.txt', 
+                    'output/content/test/shout.txt', 
+                    'output/content/test/override.txt', 
+                    'output/content/test/s60.txt',
+                    'output/content/test/test_CAP_letters.txt']
+        actual = impl.list_output_files()
+        self.assertEquals(sorted(actual), sorted(expected))
+
+    def test_configuration_content_create_output(self):
+        impl = self.load_impl('assets/s60/implml/copy.content')
+        impl.set_output_root(self.output)
+        impl.logger.setLevel(logging.DEBUG)
+        impl.create_output()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'content/prodX/jee/ProdX_specific.txt')))
+
+    def test_configuration_content_generate(self):
+        config = self.load_config()
+        impls = plugin.get_impl_set(config,'\.content$')
+        impls.output = self.output
+        results = impls.generate()
+        self.assertTrue(os.path.exists(impls.output))
+        self.assertTrue(os.path.exists(os.path.join(impls.output,'content/prodX/jee/ProdX_specific.txt')))
+
+    def test_configuration_content_generate_with_include_refs(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_sequence_refs.content')
+        impl.set_output_root(self.output)
+        results = impl.generate()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'content/override.txt')))
+
+    def test_configuration_content_generate_with_multi_output(self):
+        impl = self.load_impl('assets/s60/implml/content2_with_multi_outputs.content')
+        impl.set_output_root(self.output)
+        results = impl.generate()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'content/test/override.txt')))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'include/s60.txt')))
+
+    def test_configuration_content_generate_with_refs(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_refs2.content')
+        impl.set_output_root(self.output)
+        results = impl.generate()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'content2p1/content2p2/override.txt')))
+        
+    def test_configuration_content_generate_with_refs2(self):
+        impl = self.load_impl('assets/s60/implml/test_content_with_refs3.content')
+        impl.set_output_root(self.output)
+        results = impl.generate()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'example/content2p2/override.txt')))
+       
+    def test_configuration_content_generate_capital_letters(self):
+        impl = self.load_impl('assets/s60/implml/test_content_capital_file_input.content')
+        impl.set_output_root(self.output)
+        results = impl.generate()
+        self.assertTrue(os.path.exists(impl.output))
+        self.assertTrue(os.path.exists(os.path.join(impl.output,'content/test_CAP_letters.txt')))
+
+    def test_get_refs(self):
+        def check(filename, expected_refs):
+            impl = self.load_impl('assets/s60/implml/' + filename)
+            actual_refs = impl.get_refs()
+            
+            if expected_refs is None:
+                self.assertEquals(actual_refs, None)
+            else:
+                self.assertTrue(actual_refs is not None)
+                self.assertEquals(sorted(actual_refs), sorted(expected_refs))
+       
+        check('content2_with_multi_outputs.content', None)
+        check('content2_with_tags_refs.content', None)
+        check('content2_with_tags.content', None)
+        check('copy_files.content', None)
+        check('copy.content', None)
+        check('test_content_with_refs.content', ['content.inputdir'])
+        check('test_content_with_refs2.content', ['content.inputdir2'])
+        check('test_content_with_refs3.content', ['content.inputdir2'])
+        check('test_content_with_sequence_refs.content', ['ContentFiles.contentfile.fileelem.localPath'])
+        check('test_external_input.content', None)
+        check('test_external_with_ref.content', ['CTD_Special.InputPath'])
+        check('test_filter_both.content', None)
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeContentPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from contentplugin import __version__
+
+setup(
+    name = "conecontentplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "contentplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Content copier plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",   # project home page, if any
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['contentml_1 = contentplugin.contentml:ContentImplReader1',
+                                                 'contentml_2 = contentplugin.contentml:ContentImplReader2']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
+import pkg_resources 
+import sys,os
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../../..'))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/accesspoint_id_counter.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,365 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Ruleml eval extension to count accesspoint id's
+'''
+
+import logging
+
+logger = logging.getLogger('cone.ruleplugin.evals.accesspoint_id_counter')
+
+def get_apindex_by_apname(aps, dns, apname):
+    """
+    Returns AccessPoint index by given AccessPoint name
+    """
+    cnt = _get_ApDnContainer_(aps, dns)
+    return cnt.get_apindex_by_apname(apname)
+
+def get_apid_by_apname(aps, dns, apname, wlan_support=True):
+    """
+    Returns AccessPoint id by given AccessPoint name
+    """
+    cnt = _get_ApDnContainer_(aps, dns, wlan_support)
+    return cnt.get_apid_by_apname(apname)
+
+def get_dnid_by_dnname(aps, dns, dnname, wlan_support=True):
+    """
+    Return DestinationNetwork id by given DestinationNetworks name
+    """
+    cnt = _get_ApDnContainer_(aps, dns, wlan_support)
+    return cnt.get_dnid_by_dnname(dnname)
+
+def get_apid_by_dnname_and_apname(aps, dns, dnname, apname, wlan_support=True):
+    """
+    Returns AccessPoint id by given DestinationNetwork name and AccessPoint name.
+    """
+    cnt = _get_ApDnContainer_(aps, dns, wlan_support)
+    return cnt.get_apid_by_dnname_and_apname(dnname, apname)
+
+def get_all_in_array(aps, dns, wlan_support=True):
+    """
+    Returns array containing all data:
+        [DN name],[DN id], [IAPS names], [IAPS ids], [IAPS indexes] 
+    """
+    cnt = _get_ApDnContainer_(aps, dns, wlan_support)
+    return cnt.get_all_in_array()
+
+def _get_ApDnContainer_(aps, dns, wlan_support=True):
+    """
+    Returns populated ApDnContainer
+    """
+    cnt = ApDnContainer()
+    
+    _read_dns_(dns, cnt)
+    _read_aps_(aps, cnt)
+    
+    cnt._calc_dn_ids_()
+    
+    if wlan_support:
+        cnt._calc_ap_ids_(2)
+    else:
+        cnt._calc_ap_ids_(1)
+    
+    cnt._calc_ap_indexes_(1)
+    
+    return cnt
+
+def _read_dns_(dns, cnt):
+    """
+    Reads DNs to internal objects to ApDnContainer.
+    """
+    
+    dn_names = None
+    dn_ids = None
+    dn_iaps = [None]*10
+    
+    for dn in dns.DN:
+        if dn.ref == 'Name':
+            dn_names = dn.value
+        if dn.ref == 'DNId':
+            dn_ids = dn.value
+        if dn.ref == 'IAP':
+            dn_iaps[0] = dn.value
+        if dn.ref == 'IAP2':
+            dn_iaps[1] = dn.value
+        if dn.ref == 'IAP3':
+            dn_iaps[2] = dn.value
+        if dn.ref == 'IAP4':
+            dn_iaps[3] = dn.value
+        if dn.ref == 'IAP5':
+            dn_iaps[4] = dn.value
+        if dn.ref == 'IAP6':
+            dn_iaps[5] = dn.value
+        if dn.ref == 'IAP7':
+            dn_iaps[6] = dn.value
+        if dn.ref == 'IAP8':
+            dn_iaps[7] = dn.value
+        if dn.ref == 'IAP9':
+            dn_iaps[8] = dn.value
+        if dn.ref == 'IAP10':
+            dn_iaps[9] = dn.value
+    
+    logger.info('Parsed DN names: %s' % dn_names)
+    logger.info('Parsed DN ids: %s' % dn_ids)
+    logger.info('Parsed DN iaps: %s' % dn_iaps)
+    
+    for i in range(len(dn_names)):
+        mydn = Dn()
+        mydn.set_id(dn_ids[i])
+        mydn.set_name(dn_names[i])
+        myiaps = [None]*10
+        for j in range(10):
+            myiaps[j] = dn_iaps[j][i]
+        mydn.set_iaps(myiaps)
+        cnt.add_dn(mydn)
+    return cnt
+
+def _read_aps_(aps, cnt):
+    """
+    Reads APs to internal objects to ApDnContainer.
+    """
+    ap_names = None
+    ap_ids1 = None
+    
+    for ap in aps.AP:
+        if ap.ref == 'ConnectionName':
+            ap_names = ap.value
+        if ap.ref == 'ConnectionId':
+            ap_ids1 = ap.value
+    
+    ap_ids2 = [None]*len(ap_names)
+    if ap_ids1 == None:
+        ap_ids1 = []
+    
+    
+    for i in range(len(ap_ids1)):
+        ap_ids2[i] = ap_ids1[i]
+        
+    
+    logger.info('Parsed AP names: %s' % ap_names)
+    logger.info('Parsed AP ids: %s' % ap_ids2)
+    
+    for i in range(len(ap_names)):
+        myap = Ap()
+        myap.set_id(ap_ids2[i])
+        myap.set_name(ap_names[i])
+        cnt.add_ap(myap)
+    return cnt
+
+def _get_next_free_id_(bases, start_index=1):
+    """
+    Returns next id as a string that is not in use.
+    """
+    
+    biggest_id = int(start_index)
+    
+    for base in bases:
+        current_id = base.get_id()
+        if current_id != None or current_id != '':
+            if current_id > biggest_id:
+                biggest_id = current_id
+    
+    return str(int(biggest_id) + 1)
+
+
+class ApDnContainer(object):
+    """
+    Container for AccessPoints and DestinationNetworks, that provides various access and search methods to them.
+    """
+    
+    def __init__(self):
+        self.dns = []
+        self.aps = []
+
+    def __str__(self):
+        return "ApDnContainer(dns: " + str(self.dns) + ", aps:" + str(self.aps) + ")"
+
+    def add_dn(self, dn):
+        self.dns.append(dn)
+    
+    def add_ap(self, ap):
+        self.aps.append(ap)
+
+    def get_all_dns(self):
+        return self.dns
+    
+    def get_all_aps(self):
+        return self.aps
+    
+    def _calc_dn_ids_(self):
+        for dn in self.dns:
+            if dn.get_id() == None or dn.get_id() == '':
+                dn.set_id(_get_next_free_id_(self.dns, 1))
+
+    def _calc_ap_indexes_(self, ind=1):
+        index = ind
+        
+        for dn in self.dns:
+            for iap in dn.get_iaps():
+                if iap != None:
+                    for ap in self.aps:
+                        if ap.get_name() == iap and ap.get_index() == '':
+                            ap.set_index(str(index))
+                            index += 1
+
+    def _calc_ap_ids_(self, start_index=1):
+        """
+        Calculates unique index for every AccessPoint, if Easy_WLAN is given it always have index 1.
+        """
+        
+        for ap in self.aps:
+            if ap.name == 'Easy WLAN':
+                ap.set_id('1')
+                logger.info('Easy_WLAN AP found. Setting 1 to AP id.')
+                
+        for ap in self.aps:
+            if ap.get_id() == None or ap.get_id() == '':
+                ap.set_id(_get_next_free_id_(self.aps, int(start_index)))
+    
+    def get_apid_by_apname(self, apname):
+        """
+        Returns Accesspoint id by given AccessPoint name
+        """
+    
+        for ap in self.aps:
+            if ap.name == apname:
+                return ap.get_id()
+        return None
+    
+    def get_apindex_by_apname(self, apname):
+        """
+        Returns Accesspoint index by given AccessPoint name
+        """
+        
+        for ap in self.aps:
+            if ap.get_name() == apname:
+                return ap.get_index()
+        return None
+    
+    
+    def get_dnid_by_dnname(self, dnname):
+        """
+        Return DestinationNetwork id by given DestinationNetworks name
+        """
+        for dn in self.dns:
+            if dn.name == dnname:
+                return dn.id
+        return None
+    
+    def get_apid_by_dnname_and_apname(self, dnname, apname):
+        """
+        Returns AccessPoint id by given DestinationNetwork name and AccessPoint name.
+        """
+        for dn in self.dns:
+            if dn.name == dnname:
+                iaps = dn.get_iaps()
+                for iap in range(len(iaps)):
+                    if iaps[iap] != None and iaps[iap] == apname:
+                        return self.get_apid_by_apname(apname)
+        return None
+    
+    def get_all_in_array(self):
+        """
+        Returns array containing all data:
+            [DN name],[DN id], [IAPS names], [IAPS ids] [IAPS index]
+        """
+        ret = [None]*len(self.dns)
+        
+        for i in range(len(self.dns)):
+            line = [None]*5
+            line[0] = self.dns[i].get_name()
+            line[1] = self.dns[i].get_id()
+            line[2] = self.dns[i].get_iaps()
+            
+            ap_ids = [None]*10
+            
+            for j in range(10):
+                ap_ids[j] = self.get_apid_by_apname(self.dns[i].get_iaps()[j])
+            
+            line[3] = ap_ids
+            
+            ap_indexes = [None]*10
+            
+            for j in range(10):
+                ap_indexes[j] = self.get_apindex_by_apname(self.dns[i].get_iaps()[j])
+            
+            line[4] = ap_indexes
+            
+            ret[i] = line
+            
+        return ret
+
+class Base(object):
+    """
+    Base data classes for AP and DN classes.
+    """
+    def __init__(self):
+        self.name = ''
+        self.id = ''
+
+    def set_name(self, name):
+        self.name = name
+    
+    def get_name(self):
+        return self.name
+    
+    def set_id(self, id):
+        self.id = id
+    
+    def get_id(self):
+        return self.id
+
+class Dn(Base):
+    """
+    Destination network
+    """
+    
+    def __init__(self):
+        self.name = None
+        self.id = None
+        self.iaps = [None]*10
+    
+    def __str__(self):
+        return "Dn(name: " + self.name + ", id:" + self.id + ", iaps:" + str(self.iaps) + ")"
+    
+    def set_iaps(self, iaps):
+        self.iaps = iaps
+
+    def set_iap(self, index, value):
+        self.iaps[index] = value
+    
+    def get_iap(self, index):
+        return self.iaps[index]
+    
+    def get_iaps(self):
+        return self.iaps
+    
+class Ap(Base):
+    
+    def __init__(self):
+        self.name = ''
+        self.id = ''
+        self.index = ''
+    
+    def __str__(self):
+        return "Ap(name: " + self.name + ", id:" + self.id + ")"
+    
+    def set_index(self, index):
+        self.index = index
+    
+    def get_index(self):
+        return self.index
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/layer_utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+'''
+Ruleml eval extension to check is passed ref changed on given layer(range).
+'''
+
+from cone.public import api
+
+import logging
+
+logger = logging.getLogger('cone.ruleplugin.evals.layer_utils')
+
+def give_changed_layers(feat):
+    """
+    Returns a list of booleans where True means that feature is changed in that layer. Index is
+    same than in configuration root's get_configuration_by_index(). 
+    """
+    
+    logger.debug('Checking feature: %s' % feat.fqr)
+    
+    root_conf = feat.get_root_configuration()
+    nro_of_layers = len(root_conf.list_configurations())
+    result = [False] * nro_of_layers
+    
+    for i in range(0, nro_of_layers):
+        conf = root_conf.get_configuration_by_index(i)
+        logger.debug("Traversing data from configuration: %s" % conf.get_path())
+        datas = conf._traverse(type=api.Data, filters=[lambda d: d.fqr==feat.fqr])
+        for data in datas:
+            try:
+                if data.get_value() != None:
+                    logger.debug("Feature '%s' is changed in layer %s with data '%s'" % (feat.fqr, i, data.get_value()))
+                    result[i] = True
+            except Exception, e:
+                logger.debug("Failed to check Feature '%s' data in layer %s:", (e,i))
+        if result[i] == False:
+            logger.debug("Feature '%s' is not changed in layer: %s" % (feat.fqr, i))
+    logger.debug("Feature '%s' is changed in layers: %s" % (feat.fqr, result))
+    return result
+
+def changed_on_last_layer(feat):
+    """
+    Returns True if feature is changed in the last layer.
+    """
+    
+    root_conf = feat.get_root_configuration()
+    conf = root_conf.get_configuration_by_index(-2)#autoconfig layer is ignored 
+    
+    def check(node):
+        if isinstance(node, api.Data) and node.fqr == feat.fqr:
+            return True
+        for obj in node._objects():
+            if check(obj):
+                return True
+    
+    if check(conf):
+        return True
+    else:
+        return False
+
+def changed_on_autoconfig_layer(feat):
+    """
+    Returns True if feature is changed in the autoconfig layer.
+    """
+    
+    root_conf = feat.get_root_configuration()
+    conf = root_conf.get_configuration_by_index(-1) 
+    
+    def check(node):
+        if isinstance(node, api.Data) and node.fqr == feat.fqr:
+            return True
+        for obj in node._objects():
+            if check(obj):
+                return True
+    
+    if check(conf):
+        return True
+    else:
+        return False
+
+def changed_on_layer(feat, layer):
+    """
+    Returns True if feature is changed in the given layer.
+    """
+    try:
+        return give_changed_layers(feat)[layer]
+    except IndexError, e:
+        logger.warning("Given layer is not found: %s" % (layer))
+        return False
+
+def changed_on_layers(feat, findex, tindex):
+    """
+    Returns True if feature is changed in layer of given range.
+    """
+    layers = give_changed_layers(feat)
+    
+    if findex == tindex:
+        return changed_on_layer(feat, findex)
+    
+    for i in range(findex, tindex):
+        if i > len(layers):
+            continue
+        if layers != None and layers[i] != None and layers[i]:
+            return True
+    return False
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/shortcuts_conversion.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,95 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os
+
+def get_fixed_target_path(feature, setting):
+	type_ref = setting + '_type'
+	type = feature.get_feature(type_ref)
+	type_value = type.get_value()
+	ret = ""
+	if type_value == '1':
+		None
+	elif type_value == '2':
+		icon = feature.get_feature(setting + '_icon')
+		if icon != None:
+			ret = get_fixed_icon_target(icon)
+	else:
+		None
+		
+	return ret
+
+def get_fixed_icon_target(icon):
+	targetPath = icon.get_feature('targetPath').get_value()
+	localPath = icon.get_feature('localPath').get_value()
+	target = get_target_without_extension(targetPath)
+	extension = get_correct_extension(localPath)
+	fixed = ""
+	if extension != None:
+		if len(target) > 0 and len(extension) > 0:
+			fixed = target + extension
+	return fixed
+
+def get_target_without_extension(targetPath):
+	(target,_) = os.path.splitext(targetPath)
+	return target
+
+def get_correct_extension(localPath):
+	
+	if localPath != None:
+		(_,extension) = os.path.splitext(localPath)
+		if extension == '.bmp':
+			return '.mbm'
+		elif extension == '.svg':
+			return '.mif'
+		else:
+			return extension
+	else:
+		return None
+
+def get_shortcut_string(feature, setting):
+	type_ref = setting + '_type'
+	type_value = feature.get_feature(type_ref).get_value()
+	ret = ""
+	if type_value == '1':
+		app_ref = setting + '_app'
+		application = feature.get_feature(app_ref).get_value()
+		ret = application
+	elif type_value == '2':
+		url = feature.get_feature(setting+'_URL').get_value()
+		title = feature.get_feature(setting+'_title').get_value()
+
+		if title == None:
+			title = ""
+		else:
+			title = 'customtitle=' + title
+		
+		icon = feature.get_feature(setting + '_icon')
+		image_path = icon.get_feature('targetPath').get_value()
+		
+		icon_str = ""
+		
+		if image_path != None and image_path != "":
+			icon_str = 'iconmifpath='
+			if image_path.endswith('.mif'): index = '16384'
+			else:                           index = '0'
+			icon_str = icon_str + image_path + ';' + index + '&'
+			
+		ret = url + '?custom?' + icon_str + title
+	return ret
+
+#print get_shortcut_string('1', '2', '3')
+#http://www.nokia2.com?custom?iconmifpath=Z:\\resource\\apps\\icon2.mbm;1&amp;customtitle=Nokia2
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH, '../../..')
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<feature name="String feature" ref="StringFeatureTest">
+		<setting name="Value 1" ref="Value1" type="string" />
+		<setting name="Value 2" ref="Value2" type="string" />
+	</feature>
+	<data>
+		<StringFeatureTest>
+			<Value1>String 1</Value1>
+		</StringFeatureTest>
+	</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/implml/test1.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+	<rule>{% changed_on_layer( @{StringFeatureTest.Value1}, -1) %} configures result1 = True</rule>
+	<eval_globals file="../../layer_utils.py"/>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/test.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer2/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<feature name="String feature" ref="StringFeatureTest">
+		<setting name="Value 1" ref="Value1" type="string" />
+	</feature>
+	<data>
+		<StringFeatureTest>
+			<Value1>String 2</Value1>
+			<Value2>String 2</Value2>
+		</StringFeatureTest>
+	</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/test.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer3/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<feature name="String feature" ref="StringFeatureTest">
+		<setting name="Value 1" ref="Value1" type="string" />
+	</feature>
+	<data>
+		<StringFeatureTest>
+			<Value1>String 3</Value1>
+			<Value2>String 3</Value2>
+		</StringFeatureTest>
+	</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer3/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/test.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer4/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<feature name="String feature" ref="StringFeatureTest">
+		<setting name="Value 1" ref="Value1" type="string" />
+	</feature>
+	<data>
+		<StringFeatureTest>
+			<Value1>String 4</Value1>
+		</StringFeatureTest>
+	</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer4/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/test.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer5/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+	<feature name="String feature" ref="StringFeatureTest">
+		<setting name="Value 1" ref="Value1" type="string" />
+	</feature>
+	<data>
+		<StringFeatureTest>
+			<Value1>String 5</Value1>
+		</StringFeatureTest>
+	</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/layer5/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="testdata" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/test.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/layerproject/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="layer_utils" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="layer1/root.confml" />
+  <xi:include href="layer2/root.confml" />
+  <xi:include href="layer3/root.confml" />
+  <xi:include href="layer4/root.confml" />
+  <xi:include href="layer5/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/ctd/confml/CTD_commsdat.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CTD_commsdat" version="">
+
+
+<feature ref="KCRUidSuplSettings" type="selection">
+    <setting ref="CTD_KSuplSettingsIAP" name="A-GPS access point" type="selection">
+        <desc>Selection for A-GPS access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+   </setting>     
+</feature>
+
+<feature ref="MMSEngineSettings" relevant="">
+    <setting ref="CTD_MMS_AP" name="MMS access point" type="selection">
+        <desc>Selection for MMS access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+   </setting>     
+</feature>
+<feature ref="KCRUidBrowser" name="Browser Settings">
+     <setting ref="CTD_Browser_AP" name="Access point" type="selection" relevant="KWmlBrowserAccessPointSelectionMode='0'">
+        <desc>Selection for Browser access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+        </setting>
+        
+      
+     <setting ref="CTD_Browser_SNAP" name="Destination Network" type="selection" relevant="KWmlBrowserAccessPointSelectionMode='2'">
+          <desc>Setting for the default Destination Network</desc>
+          <option name="Internet" value="1"/>
+          <option name="MMS" value="2"/>
+          <option name="Wap Services" value="3"/>
+     </setting>
+</feature>
+<feature ref="KCRUidBrowser1" name="Browser Settings1">
+     <setting ref="CTD_Browser_autoupdate_AP" name="Access point for web feeds autoupdate" type="selection">
+        <desc>Selection for web feeds autoupdate access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+        </setting>
+</feature>
+<feature ref="Mailbox1" name="Mailbox 1">
+    <setting ref="CTD_Email_AP1" name="Email access point for mailbox 1" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+    </setting>  
+</feature>     
+<feature ref="Mailbox2" name="Mailbox 2">
+    <setting ref="CTD_Email_AP2" name="Email access point for mailbox 2" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+    </setting>  
+</feature>
+     
+<feature ref="Mailbox3" name="Mailbox 3">
+   <setting ref="CTD_Email_AP3" name="Email access point for mailbox 3" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+   </setting>  
+</feature>
+    
+<feature ref="Mailbox4" name="Mailbox4">
+   <setting ref="CTD_Email_AP4" name="Email access point for mailbox 4" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+    </setting>  
+</feature>    
+<feature ref="Mailbox5" name="Mailbox 5">
+   <setting ref="CTD_Email_AP5" name="Email access point for mailbox 5" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+    </setting>  
+</feature>
+<feature ref="Mailbox6" name="Mailbox 6">
+    <setting ref="CTD_Email_AP6" name="Email access point for mailbox 6" type="selection">
+        <desc>Selection for Email access point</desc>
+        <option map="CTD_APs/AP"/>
+        <option map="CTD_WLAN_APs/WLAN_AP"/>
+    </setting>  
+</feature>
+
+  <feature ref="CTD_APs" name="GPRS Access Points" relevant="">
+    <desc>GPRS connection method (CM) definitions</desc>
+    <setting ref="AP" name="GPRS" type="sequence" constraint="" relevant="" minOccurs="0" maxOccurs="99" mapKey="ConnectionName" mapValue="ConnectionName">
+      <setting ref="ConnectionName" name="Connection Name" type="string">
+        <desc>The access point name that is visible to the user.</desc>
+      </setting>
+      <setting ref="GPRS_AP_Name" name="GPRS Access Point Name" type="string">
+        <desc>The access point name for this GPRS connection</desc>
+      </setting>
+                  <setting ref="CTD_GPRSAddtoDN" name="Add access point to destination" type="selection">
+        <desc>Define the destination network that the access point will be added to. Can be left empty.</desc>
+        <option name="Internet Destination" value="1"/>
+        <option name="MMS Destination" value="2"/>
+        <option name="WAP Services Destination" value="3"/>
+      </setting>
+      <setting ref="Seamlessness" name="Use access point" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="After confirmation"/>
+        <option name="Show Progress" value="Automatically"/>
+      </setting>
+      <setting ref="NetworkType" name="Network type" type="selection">
+        <desc>Addressing that the network uses.</desc>
+        <option name="IPv4" value="IPv4"/>
+        <option name="IPv6" value="IPv6"/>
+      </setting>
+      <setting ref="UserName" name="User Name" type="string">
+        <desc>User name</desc>
+      </setting>
+      <setting ref="PromptPassword" name="Prompt Password" type="selection">
+        <desc>Prompt password at connection time.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting ref="Password" name="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+      <setting ref="PasswordAuthenticationType" name="Password authentication type" type="selection">
+        <desc>Password authentication method.</desc>
+        <option name="Normal" value="Normal"/>
+        <option name="Secure" value="Secure"/>
+      </setting>
+      <setting ref="StartingPage" name="Homepage" type="string">
+        <desc>Access point homepage in URL format.</desc>
+      </setting>
+
+      <setting ref="ProxyServerAddress" name="Proxy Server Address" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting ref="ProxyPortNumber" name="Proxy Port Number" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+
+      <setting ref="PrimaryNameServer" name="IPv4 Primary Name Server" type="string" relevant="NetworkType = 'IPv4'">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting ref="SecondaryNameServer" name="IPv4 Secondary Name Server" type="string" relevant="NetworkType = 'IPv4'">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting ref="PrimaryIP6NameServer" name="IPv6 Primary Name Server" type="string" relevant="NetworkType = 'IPv6'">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+      <setting ref="SecondaryIP6NameServer" name="IPv6 Secondary Name Server" type="string" relevant="NetworkType = 'IPv6'">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+
+    </setting>
+  </feature>
+
+  <feature ref="CTD_WLAN_APs" name="WLAN Access Points" relevant="" >
+    <desc>WLAN connection method (CM) definitions</desc>
+    <setting ref="WLAN_AP" name="WLAN" type="sequence" constraint="" relevant="" minOccurs="0" maxOccurs="99" mapKey="ConnectionName" mapValue="ConnectionName">
+      <setting ref="ConnectionName" name="Connection Name" type="string" constraint="" required="">
+        <desc>The access point name that is visible to the user.</desc>
+      </setting>
+      <setting ref="Seamlessness" name="Use access point" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+        <option name="Confirm First" value="After confirmation"/>
+        <option name="Show Progress" value="Automatically"/>
+      </setting>
+      <setting ref="NetworkName" name="Network Name" type="string">
+        <desc>Service set identifier (SSID) of the primary WLAN network.</desc>
+      </setting>
+    <setting ref="CTD_WLANAddtoDN" name="Add access point to destination" type="selection">
+        <desc>Define the destination network that the access point will be added to. Can be left empty.</desc>
+        <option name="Internet Destination" value="1"/>
+        <option name="MMS Destination" value="2"/>
+        <option name="WAP Services Destination" value="3"/>
+      </setting>
+      <setting ref="StartingPage" name="Homepage" type="string">
+        <desc>Access point homepage in URL format.</desc>
+      </setting>
+      <setting ref="NetworkMode" name="Network Mode" type="selection">
+        <desc>Determines the network infrastructure. 
+        If there is a WLAN access point in the network then this should be Infrastructure.</desc>
+        <option name="Infrastructure" value="Infrastructure"/>
+        <option name="Ad-hoc" value="Ad-hoc"/>
+      </setting>
+      
+            <setting ref="WLANScanSSID" name="Network Status" type="selection">
+        <desc>Defines whether the SSID should be actively scanned. 
+        This is needed if the SSID is hidden (not broadcasted by the AP) </desc>
+        <option name="Public" value="No"/>
+        <option name="Hidden" value="Yes"/>
+      </setting>
+
+      <setting ref="PrimaryNameServer" name="IPv4 Primary Name Server" type="string" relevant="NetworkType = 'IPv4'">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting ref="SecondaryNameServer" name="IPv4 Secondary Name Server" type="string" relevant="NetworkType = 'IPv4'">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting ref="PrimaryIP6NameServer" name="IPv6 Primary Name Server" type="string" relevant="NetworkType = 'IPv6'">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting ref="SecondaryIP6NameServer" name="IPv6 Secondary Name Server" type="string" relevant="NetworkType = 'IPv6'">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+      <setting ref="ProxyServerAddress" name="Proxy Server Address" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting ref="ProxyPortNumber" name="Proxy Port Number" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+      <setting ref="ProxyProtocolName" name="Proxy protocol Name" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+      <setting ref="WlanChannelId" name="WLAN Channel ID" type="string" relevant="NetworkMode = 'Ad-hoc'">
+        <desc>
+      	802.11 Channel ID (1-14). Used only when connecting/setting up adhoc network.
+      	</desc>
+      </setting>
+            <setting ref="SecurityMode" name="Security Mode" type="selection">
+        <desc>Security mode of the WLAN network.</desc>
+        <option name="Open" value="Open"/>
+        <option name="WEP" value="WEP"/>
+        <option name="802.1x" value="802.1x"/>
+        <option name="WPA" value="WPA"/>
+        <option name="WPA2" value="WPA2"/>
+      </setting>
+      <setting ref="WEPKeyInUse" name="WEP Key In Use" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>Index of default WEP key. Used only when security mode is WEP.</desc>
+        <option name="key1" value="key1"/>
+        <option name="key2" value="key2"/>
+        <option name="key3" value="key3"/>
+        <option name="key4" value="key4"/>
+      </setting>
+      <setting ref="WEPAuthType" name="WEP Auth Type" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP authentication mode. Only used when security mode is WEP.</desc>
+        <option name="Shared" value="Shared"/>
+        <option name="Open" value="Open"/>
+      </setting>
+      <setting ref="WEPKey1Length" name="WEP Key1 Length" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting ref="WEPKey1Format" name="WEP Key1 Format" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting ref="WEPKey1Data" name="WEP Key1 Data" type="string" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting ref="WEPKey2Length" name="WEP Key2 Length" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting ref="WEPKey2Format" name="WEP Key2 Format" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting ref="WEPKey2Data" name="WEP Key2 Data" type="string" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting ref="WEPKey3Length" name="WEP Key3 Length" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting ref="WEPKey3Format" name="WEP Key3 Format" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting ref="WEPKey3Data" name="WEP Key3 Data" type="string" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+      <setting ref="WEPKey4Length" name="WEP Key4 Length" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key length in bits.</desc>
+        <option name="64" value="64"/>
+        <option name="128" value="128"/>
+        <option name="256" value="256"/>
+      </setting>
+      <setting ref="WEPKey4Format" name="WEP Key4 Format" type="selection" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key format.</desc>
+        <option name="ASCII" value="ASCII"/>
+        <option name="Hexadecimal" value="Hexadecimal"/>
+      </setting>
+      <setting ref="WEPKey4Data" name="WEP Key4 Data" type="string" relevant="SecurityMode = 'WEP'">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+
+      <setting ref="WPAUseOfPresharedKey" name="WPA Use of Pre-shared Key" type="selection" relevant="SecurityMode = 'WPA' or SecurityMode = 'WPA2'">
+        <desc>Specifies that when the security mode is WPA or WPA2 if the PSK mode is enabled. 
+        If this is off then EAP mode is used and the list of EAPs needs to be defined.</desc>
+        <option name="No" value="No"/>
+        <option name="Yes" value="Yes"/>
+      </setting>
+      <setting ref="WPAKeyLength" name="WPA Pre-shared key length" relevant="WPAUseOfPresharedKey ='Yes'">
+        <desc>The length of the specified pre-shared key (in WPA pre-shared key field)</desc>
+      </setting>
+        <setting ref="WPAPresharedKey" name="WPA Pre-shared Key" type="string" relevant="WPAUseOfPresharedKey ='Yes'">
+        <desc>WPA/WPA2 pre-shared key in plain text. ASCII character set values between 32-126 must be used. Minimum length is 8 characters and maximum 63.
+        You need to also define the WPA pre-shared key length field accordingly</desc>
+
+      </setting>
+          <setting ref="CTD_EAPkey1" name="EAP Key 1" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+          <setting ref="CTD_EAPkey2" name="EAP Key 2" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+                <setting ref="CTD_EAPkey3" name="EAP Key 3" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+                <setting ref="CTD_EAPkey4" name="EAP Key 4" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+                <setting ref="CTD_EAPkey5" name="EAP Key 5" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+                <setting ref="CTD_EAPkey6" name="EAP Key 6" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>
+                <setting ref="CTD_EAPkey7" name="EAP Key 7" type="selection" relevant="WPAUseOfPresharedKey ='No'">
+        <desc>Eap Key 1</desc>
+        <option name="EAP-SIM Active" value="EAP-SIM Active"/>
+        <option name="EAP-AKA Active" value="EAP-AKA Active"/>
+        <option name="EAP-TLS Active" value="EAP-TLS Active"/>
+        <option name="EAP-PEA ActiveP" value="EAP-PEAP Active"/>
+        <option name="EAP-TTLS Active" value="EAP-TTLS Active"/>
+        <option name="EAP-LEAP Active" value="EAP-LEAP Active"/>
+        <option name="EAP-FAST Active" value="EAP-FAST Active"/>
+                <option name="EAP-SIM Inactive" value="EAP-SIM Inactive"/>
+        <option name="EAP-AKA Inactive" value="EAP-AKA Inactive"/>
+        <option name="EAP-TLS Inactive" value="EAP-TLS Inactive"/>
+        <option name="EAP-PEAP Inactive" value="EAP-PEAP Inactive"/>
+        <option name="EAP-TTLS Inactive" value="EAP-TTLS Inactive"/>
+        <option name="EAP-LEAP Inactive" value="EAP-LEAP Inactive"/>
+        <option name="EAP-FAST Inactive" value="EAP-FAST Inactive"/>
+      </setting>      
+      </setting>
+  </feature>
+  <data>
+
+    <CTD_APs>
+      <AP template="true">
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <NetworkType>IPv4</NetworkType>
+        <PromptPassword>No</PromptPassword>
+        <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+      </AP>
+    </CTD_APs>
+
+
+    <CTD_WLAN_APs>
+      <WLAN_AP template="true">
+        <Seamlessness>ConfirmFirst</Seamlessness>
+        <NetworkMode>Infrastructure</NetworkMode>
+        <SecurityMode>Open</SecurityMode>
+        <WPAKeyLength>0</WPAKeyLength>
+      </WLAN_AP>
+    </CTD_WLAN_APs>
+ </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/ctd/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="imaker" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/CTD_commsdat.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.rootFile" value="root.confml" />
+</metadata>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/ap.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="APIDCTest" name="Test settings for accesspoint id count">
+    <setting ref="FullSequence" name="Full sequence" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <APIDCTest>
+      <FullSequence template="true">
+        <StringSubSetting>Default</StringSubSetting>
+      </FullSequence>
+      <FullSequence>
+        <StringSubSetting>Full 1</StringSubSetting>
+      </FullSequence>
+      <FullSequence>
+        <StringSubSetting>Full 2</StringSubSetting>
+      </FullSequence>
+    </APIDCTest>
+  </data>
+</configuration>
Binary file configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/commsdatcreator.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/confml/testdata.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="imaker interface" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="iMaker Image creation" ref="imaker">
+    <setting name="IMAGE_TARGET" ref="imagetarget" type="selection">
+      <option name="core" value="0" />
+    <option name="rofs2" value="1" />
+    <option name="rofs3" value="2" />
+    <option name="rofs4" value="3" />
+    <option name="uda" value="4" />
+    <option name="rofs3_uda" value="4" />
+    </setting>
+  <setting name="iMaker api makefile" ref="makefilename" type="string" />
+  </feature>
+<feature name="iMaker API" ref="imakerapi">
+    <setting name="IMAGE_TYPE" ref="imagetype" type="selection">
+      <option name="rnd" value="0" />
+    <option name="subcon" value="1" />
+    <option name="prd" value="2" />
+    </setting>
+  <setting name="ROFS3_VERSION" ref="rofs3version" type="string" />
+  <setting name="PRODUCT_NAME" ref="productname" type="string" />
+  <setting name="OUTPUT_LOCATION" ref="outputLocation" type="string" />
+  <setting name="OUTPUT_LOCATIONY" ref="outputLocationY" type="string" />
+  </feature>
+<feature name="ar operations" ref="operations">
+    <setting name="MINUS" ref="minus" type="int" />
+  <setting name="MINUS1" ref="minus1" type="int" />
+  <setting name="MINUS2" ref="minus2" type="int" />
+  <setting name="MINUS3" ref="minus3" type="int" />
+  <setting name="MINUS4" ref="minus4" type="int" />
+  <setting name="MINUS5" ref="minus5" type="int" />
+  <setting name="MINUS6" ref="minus6" type="int" />
+  <setting name="MINUS7" ref="minus7" type="int" />
+  <setting name="MINUS8" ref="minus8" type="int" />
+  </feature>
+<feature name="String concatenation test" ref="StringConcatenationTest">
+    <setting name="Value 1" ref="Value1" type="string" />
+  <setting name="Value 2" ref="Value2" type="string" />
+  <setting name="Result 1" ref="Result1" type="string" />
+  <setting name="Result 2" ref="Result2" type="string" />
+  <setting name="Result 3" ref="Result3" type="string" />
+  <setting name="Result 4" ref="Result4" type="string" />
+  <setting name="Result 5" ref="Result5" type="string" />
+  <setting name="Result 6" ref="Result6" type="string" />
+  </feature>
+<feature name="Unicode test feature" ref="ударениÑ">
+    <setting name="Unicode test setting" ref="ελληνικά" type="string" />
+  </feature>
+<data>
+    <imaker>
+      <imagetarget>2</imagetarget>
+    <makefilename>image_conf_imakerapi.mk</makefilename>
+    </imaker>
+  <imakerapi>
+      <imagetype>0</imagetype>
+    <rofs3version>V .50.2009.04.0113 RND</rofs3version>
+    <productname>myProduct</productname>
+    <outputLocation>myProduct</outputLocation>
+    <outputLocationY />
+    </imakerapi>
+  <operations>
+      <minus>5</minus>
+    <minus1>25</minus1>
+    <minus2>7</minus2>
+    <minus3>5</minus3>
+    <minus4>10</minus4>
+    <minus5>2</minus5>
+    <minus6>5</minus6>
+    <minus7>10</minus7>
+    <minus8>8</minus8>
+    </operations>
+  <StringConcatenationTest>
+      <Value1>String 1</Value1>
+    <Value2>String 2</Value2>
+    <Result1>x</Result1>
+    <Result2>x</Result2>
+    <Result3>x</Result3>
+    <Result4>x</Result4>
+    <Result5>x</Result5>
+    <Result6>x</Result6>
+    </StringConcatenationTest>
+    
+    <ударениÑ>
+      <ελληνικά>カタカナ</ελληνικά>
+    </ударениÑ>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/implml/accesspoint_id_counter.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+	<rule>True configures APIDCTest.FullSequence.StringSubSetting = {% apid( @{APs}, @{DNs} ) %}
+    </rule>
+	<eval_globals file="../../accesspoint_id_counter.py"/>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<configuration name="imaker" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/testdata.confml" />
+  <xi:include href="confml/ap.confml" />
+  <xi:include href="confml/commsdatcreator.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.rootFile" value="root.confml" />
+</metadata>
\ No newline at end of file
Binary file configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/confml/data.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/layer2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="imaker" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/data.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/ruleproject/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<configuration name="imaker" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="layer1/root.confml" />
+  <xi:include href="layer2/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/unittest_accesspoint_id_counter.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,125 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import pkg_resources
+import re
+
+import __init__
+
+from ruleplugin import ruleml, relations
+from cone.public import api, exceptions
+from ruleplugin.evals import accesspoint_id_counter
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestAPIDC(unittest.TestCase):
+    def test_get_ApDnContainer(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals('Internet', container.get_all_dns()[0].get_name())
+        self.assertEquals('1', container.get_all_dns()[0].get_id())
+        self.assertEquals(['IAP11', 'IAP12', 'IAP13', None, None, None, None, None, None, None], container.get_all_dns()[0].get_iaps())
+        
+        self.assertEquals('MMS', container.get_all_dns()[1].get_name())
+        self.assertEquals('2', container.get_all_dns()[1].get_id())
+        self.assertEquals(['IAP21', 'IAP22', 'IAP23', 'IAP13', None, None, None, None, None, None], container.get_all_dns()[1].get_iaps())
+        
+        self.assertEquals('Operator', container.get_all_dns()[2].get_name())
+        self.assertEquals('3', container.get_all_dns()[2].get_id())
+        self.assertEquals(['IAP31', 'IAP32', 'IAP33', None, None, None, None, None, None, None], container.get_all_dns()[2].get_iaps())
+
+        self.assertEquals('IAP11', container.get_all_aps()[0].get_name())
+        self.assertEquals('1', container.get_all_aps()[0].get_id())
+        
+    def test_get_apid_by_apname(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals('1', container.get_apid_by_apname('IAP11'))
+        self.assertEquals('2', container.get_apid_by_apname('IAP12'))
+        self.assertEquals('7', container.get_apid_by_apname('IAP13'))
+
+    def test_get_dnid_by_dnname(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals('1', container.get_dnid_by_dnname('Internet'))
+        self.assertEquals('2', container.get_dnid_by_dnname('MMS'))
+        self.assertEquals('3', container.get_dnid_by_dnname('Operator'))
+
+
+    def test_get_apid_by_dnname_and_apname(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals('2', container.get_apid_by_dnname_and_apname('Internet', 'IAP12'))
+
+    def test_calc_ap_ids(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+
+        self.assertEquals('9', container.get_all_aps()[6].get_id())
+
+    def test_all_in_array(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+
+        self.assertEquals(container.get_all_in_array(), [['Internet', '1', ['IAP11', 'IAP12', 'IAP13', None, None, None, None, None, None, None], ['1', '2', '7', None, None, None, None, None, None, None], ['1', '2', '3', None, None, None, None, None, None, None]], ['MMS', '2', ['IAP21', 'IAP22', 'IAP23', 'IAP13', None, None, None, None, None, None], ['4', '8', '6', '7', None, None, None, None, None, None], ['4', '5', '6', '3', None, None, None, None, None, None]], ['Operator', '3', ['IAP31', 'IAP32', 'IAP33', None, None, None, None, None, None, None], [None, None, '9', None, None, None, None, None, None, None], [None, None, '7', None, None, None, None, None, None, None]]])
+
+    def test_get_next_free_id(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals("4", accesspoint_id_counter._get_next_free_id_(container.get_all_dns()))
+        self.assertEquals("10", accesspoint_id_counter._get_next_free_id_(container.get_all_aps()))
+
+    def test_get_apindex_by_apname(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        container = accesspoint_id_counter._get_ApDnContainer_(dview.get_feature("APs"), dview.get_feature("DNs"), True)
+        
+        self.assertEquals("4", container.get_apindex_by_apname("IAP21"))
+        self.assertEquals("1", container.get_apindex_by_apname("IAP11"))
+
+        
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/evals/tests/unittest_layer_utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,92 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import pkg_resources
+import re
+import logging
+
+import __init__
+
+from ruleplugin import ruleml, relations
+from cone.public import api, exceptions
+from ruleplugin.evals import layer_utils
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+#logger = logging.getLogger("cone.ruleplugin.evals.layer_utils")
+#logger.setLevel(logging.DEBUG)
+#ch = logging.StreamHandler()
+#ch.setLevel(logging.DEBUG)
+#logger.addHandler(ch)
+
+class TestLayerUtils(unittest.TestCase):
+    def setUp(self):
+        pass
+    
+    def test_give_changed_layers(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'layerproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        self.assertEquals(layer_utils.give_changed_layers(dview.get_feature("StringFeatureTest.Value1")), [True, True, True, True, True])
+        self.assertEquals(layer_utils.give_changed_layers(dview.get_feature("StringFeatureTest.Value2")), [False, True, True, False, False])
+        
+    def test_changed_on_last_layer(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'layerproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        self.assertTrue(layer_utils.changed_on_last_layer(dview.get_feature("StringFeatureTest.Value1")))
+        self.assertFalse(layer_utils.changed_on_last_layer(dview.get_feature("StringFeatureTest.Value2")))
+
+    def test_changed_on_layer(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'layerproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),-1))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),0))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),1))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),2))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),3))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),4))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value1"),5))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),-1))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),0))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),1))
+        self.assertTrue(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),2))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),3))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),4))
+        self.assertFalse(layer_utils.changed_on_layer(dview.get_feature("StringFeatureTest.Value2"),5))
+
+    def test_changed_on_layers(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'layerproject')))
+        config = project.get_configuration('root.confml')
+        dview = config.get_default_view()
+        
+        self.assertTrue(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value1"),0,4))
+        self.assertTrue(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value1"),2,3))
+        self.assertTrue(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value1"),2,2))
+        self.assertTrue(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value1"),1,7))
+        self.assertFalse(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value1"),8,9))
+        self.assertFalse(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value2"),0,1))
+        self.assertTrue(layer_utils.changed_on_layers(dview.get_feature("StringFeatureTest.Value2"),1,5))
+
+        
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/relations.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,406 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+'''
+implementation for ruleml relations.
+'''
+import os
+import StringIO
+import logging
+import operator as ops
+import re
+import sys, traceback
+
+log = logging.getLogger('cone.ruleplugin.relations')
+
+from cone.public import api, rules, utils, exceptions, plugin
+
+class RelationFactory(api.FactoryBase):
+    @ classmethod
+    def get_relation_by_name(cls, relation_name):
+        """
+        Get the class name by file extension.
+        """
+        try:
+            return rules.RELATIONS.get(relation_name)
+        except KeyError:
+            raise exceptions.NotSupportedException("No Relation class found for name %s" % relation_name)
+
+    @ classmethod
+    def get_relations(cls, configuration, relation):
+        try:
+            relations = []
+            (left_expression,relation_name,right_expression) = parse_rule(relation)
+            relation = cls.get_relation_by_name(relation_name)(configuration, left_expression, right_expression)
+            relations.append(relation)
+            propagated_relations = cls.get_relations(configuration, right_expression)
+            if propagated_relations:
+                for relation in propagated_relations:
+                    relations.append(relation)
+            return relations
+        except exceptions.ParseError:
+            return None
+    
+
+class ConfigurationContext(rules.DefaultContext):
+    
+    def __init__(self, data):
+        rules.DefaultContext.__init__(self, data)
+        
+        # A note on the callback variables that follow:
+        # in order to collect rule execution results for the
+        # generation report, a callback system is implemented in
+        # ConfigurationContext.  It all boils down to ConfigureRelation
+        # using configure_expression_result_callback to catch the result
+        # in its execute() method. The ConfigurationContext just works as
+        # a "callback hub" because a reference to the context is available
+        # in all expression evaluations.
+        
+        # Callback called with a plugin.RelationExecutionResult object
+        # when a ConfigureExpression has been evaluated
+        self.configure_expression_result_callback = None
+        
+        # Callback called with the setting reference when a setting is dereferenced
+        # as a terminal expression
+        self.ref_terminal_callback = None
+        
+        # Callback called with the setting reference when a setting is dereferenced
+        # inside an EvalExpression
+        self.ref_eval_callback = None
+        
+        # Callback called with the setting reference when the value of a setting
+        # is set inside a SetExpression
+        self.ref_set_callback = None
+        
+    def handle_terminal(self, expression):
+        try:
+            value = self.data.get_default_view().get_feature(expression).get_value()
+            
+            # Got a valid ref, call the callback
+            if self.ref_terminal_callback:
+                self.ref_terminal_callback(expression)
+            
+            return value
+        except exceptions.NotFound,e:
+            """ return the expression itself if it is not a fearef """
+            #print "handle_terminal constant %s" % (expression)
+            try:
+                return eval(expression)
+            except (NameError,SyntaxError), e:
+                return expression
+
+    def eval(self, ast, expression, value):
+        #print "expression %s = %s" % (expression,value)
+        pass
+        
+class ConfigurationBaseRelation(rules.BaseRelation):
+    def __init__(self, data, left, right):
+        self.context = ConfigurationContext(data)
+        super(ConfigurationBaseRelation, self).__init__(data, left, right)
+
+class RequireRelation(ConfigurationBaseRelation):
+    KEY = 'requires'
+    def __init__(self, data, left, right):
+        super(RequireRelation, self).__init__(data, left, right)
+        self.context = ConfigurationContext(data)
+
+class ConfigureRelation(ConfigurationBaseRelation):
+    KEY = 'configures'
+    def __init__(self, data, left, right):
+        self.context = ConfigurationContext(data)
+        super(ConfigureRelation, self).__init__(data, left, right)
+        
+        # A plugin.RelationExecutionResult object is stored here
+        self._execution_result = None
+        
+    
+    def execute(self):
+        self._execution_result = None
+        exec_results = []
+        
+        # Call BaseRelation.execute() and catch any ConfigureExpression result objects
+        self.context.configure_expression_result_callback = lambda result: exec_results.append(result)
+        result = rules.BaseRelation.execute(self)
+        self.context.configure_expression_result_callback = None
+        
+        if len(exec_results) > 0:
+            # There should be only one ConfigureExpression inside a ConfigureRelation
+            if len(exec_results) > 1:
+                log.warning("Execution of ConfigureRelation returned more than one result, ignoring all except the first")
+            self._execution_result = exec_results[0]
+        
+        return result
+    
+    def get_execution_result(self):
+        """
+        Return the execution result from the most recent call to execute().
+        """
+        return self._execution_result
+
+def handle_configure(self, left, right):
+    if left and right:
+        return True
+    elif not left:
+        return True
+    return False
+
+def handle_set(self, left, right):
+    left.set_value(right)
+
+def handle_filenamejoin(self, left, right):
+    def extract_dirname(path):
+        """Extract directory name (will always contain a trailing slash or backslash)"""
+        pos = max(path.rfind('/'), path.rfind('\\'))
+        if pos == -1:   return path + '/'
+        else:           return path[:pos + 1]
+    
+    def extract_filename(path):
+        pos = max(path.rfind('/'), path.rfind('\\'))
+        if pos == -1:   return path
+        else:           return path[pos + 1:]
+    
+    return extract_dirname(left) + extract_filename(right)
+
+def handle_plus(self, left, right):
+    return left + right
+
+def handle_minus(self, left, right):
+    return left - right
+
+def handle_multiply(self, left, right):
+    return left * right
+
+def handle_divide(self, left, right):
+    return left / right
+
+class ConfigureExpression(rules.TwoOperatorExpression):
+    PRECEDENCE = rules.PRECEDENCES['RELATION_OPERATORS']
+    KEY = 'configures'
+    OP = handle_configure
+
+    def eval(self, context):
+        input_refs = []
+        affected_refs = []
+        
+        # Evaluate the left-hand side expression, catching refs for the result
+        try:
+            context.ref_terminal_callback = lambda ref: input_refs.append(ref)
+            context.ref_eval_callback = lambda ref: input_refs.append(ref)
+            evaluated_left = self.left.eval(context)
+        finally:
+            context.ref_terminal_callback = None
+            context.ref_eval_callback = None
+        
+        if evaluated_left:
+            # If left evaluated to True, evaluate the right-hand side and
+            # catch refs from SetExpression evaluations
+            try:
+                context.ref_set_callback = lambda ref: affected_refs.append(ref)
+                self.value = self.right.eval(context)
+            finally:
+                context.ref_set_callback = None
+        else:
+            self.value = True
+        
+        if not self.value:
+            left_keys = []
+            for ref in self.ast.extract_refs(str(self.left)):
+                for key in context.get_keys(ref):
+                    left_keys.append(key)
+
+            for key in left_keys:
+                self.ast.add_error(key, { 'error_string' : 'CONFIGURES right side value is "False"',
+                                          'left_key' : key,
+                                          'rule' : self.ast.expression
+                                          })
+        
+        # Return a RelationExecutionResult if necessary
+        if input_refs or affected_refs:
+            if context.configure_expression_result_callback:
+                result = plugin.RelationExecutionResult(utils.distinct_array(input_refs),
+                                                        utils.distinct_array(affected_refs))
+                context.configure_expression_result_callback(result)
+                
+        return self.value
+
+class MultiplyExpression(rules.TwoOperatorExpression):
+    expression = "multiply_operation"
+    PRECEDENCE = rules.PRECEDENCES['MULDIV_OPERATORS']
+    KEY= '*'
+    OP = handle_multiply
+
+class DivideExpression(rules.TwoOperatorExpression):
+    expression = "divide_operation"
+    PRECEDENCE = rules.PRECEDENCES['MULDIV_OPERATORS']
+    KEY= '/'
+    OP = handle_divide
+
+class PlusExpression(rules.TwoOperatorExpression):
+    expression = "plus_operation"
+    PRECEDENCE = rules.PRECEDENCES['ADDSUB_OPERATORS']
+    KEY= '+'
+    OP = handle_plus
+
+class MinusExpression(rules.TwoOperatorExpression):
+    expression = "minus_operation"
+    PRECEDENCE = rules.PRECEDENCES['ADDSUB_OPERATORS']
+    KEY= '-'
+    OP = handle_minus
+
+class EvalExpression(rules.OneParamExpression):
+    expression = "__eval__"
+    PRECEDENCE = rules.PRECEDENCES['PREFIX_OPERATORS']
+    KEY = '__eval__'
+    
+    def __init__(self, ast, expression):
+        super(rules.OneParamExpression, self).__init__(ast)
+        self.expression = expression
+        self._str_to_eval = eval(expression.expression)
+        #self.default_view = default_view
+    
+    def extract_refs(self):
+        result = []
+        result.extend(utils.extract_delimited_tokens(self._str_to_eval, delimiters=('${', '}')))
+        result.extend(utils.extract_delimited_tokens(self._str_to_eval, delimiters=('@{', '}')))
+        return result
+    
+    def eval(self, context):
+        # Using the configuration to pass the eval globals dictionary to here,
+        # since there isn't any easy way to do this more elegantly
+        globals_and_locals = {}
+        if hasattr(context.data, '_eval_expression_globals_dict'):
+            globals_and_locals = context.data._eval_expression_globals_dict
+        
+        str_to_eval = self._str_to_eval
+        
+        def expand_feature_ref(ref, index):
+            var_name = "__fea_%05d" % index
+            globals_and_locals[var_name] = context.data.get_default_view().get_feature(ref)
+            if context.ref_eval_callback:
+                context.ref_eval_callback(ref)
+            return var_name
+        def expand_value_ref(ref, index):
+            var_name = "__feaval_%05d" % index
+            globals_and_locals[var_name] = context.data.get_default_view().get_feature(ref).get_value()
+            if context.ref_eval_callback:
+                context.ref_eval_callback(ref)
+            return var_name
+        
+        str_to_eval = utils.expand_delimited_tokens(str_to_eval, expand_feature_ref, delimiters=('@{', '}'))
+        str_to_eval = utils.expand_delimited_tokens(str_to_eval, expand_value_ref, delimiters=('${', '}'))
+        
+        # Strip leading and trailing whitespace to avoid indentation problems
+        str_to_eval = str_to_eval.strip()
+        
+        ret = None
+        
+        try:
+            ret = eval(str_to_eval, globals_and_locals)
+            return ret
+        except SyntaxError, e:
+            logging.getLogger('cone.ruleml').warning("Invalid syntax in eval: %s" % (str_to_eval) )
+            self.ast.add_error(self.expression, { 'error_string' : 'Invalid syntax in eval', 'str_to_eval' : str_to_eval, 'rule' : self.ast.expression })
+        except Exception, e:
+            logging.getLogger('cone.ruleml').warning("Execution failed for eval: %s %s: %s" % (str_to_eval, type(e), e) )
+            self.ast.add_error(self.expression, { 'error_string' : 'Execution failed for eval', 'str_to_eval' : str_to_eval, 'rule' : self.ast.expression })
+
+rules.OPERATORS[EvalExpression.KEY] = EvalExpression
+
+class FilenamejoinExpression(rules.TwoOperatorExpression):
+    expression = "filenamejoin"
+    PRECEDENCE = rules.PRECEDENCES['ADDSUB_OPERATORS']
+    KEY = 'filenamejoin'
+    OP = handle_filenamejoin
+    
+rules.OPERATORS[FilenamejoinExpression.KEY] = FilenamejoinExpression
+    
+class SetExpression(rules.TwoOperatorExpression):
+    PRECEDENCE = rules.PRECEDENCES['SET_OPERATORS']
+    KEY= '='
+    OP = handle_set
+
+    def eval(self, context):
+        try:
+            variable = context.data.get_default_view().get_feature(self.left.expression)
+            value = self.right.eval(context)
+            variable.set_value(value)
+            logging.getLogger('cone.ruleml').info("Set %r = %r from %r" % (self.left.expression, value, self.right.expression) )
+            if context.ref_set_callback:
+                context.ref_set_callback(self.left.expression)
+            return True
+        except exceptions.NotFound,e:
+            self.ast.add_error(self.left.expression, { 'error_string' : 'Setting value failed, because of %s' % e,
+                               'left_key' : self.left.expression,
+                               'rule' : self.ast.expression})
+            return False
+
+_relations_and_operators_backup = None
+
+def register():
+    """
+    Register the relations and operators to ConE rules.
+    """
+    global _relations_and_operators_backup
+    if _relations_and_operators_backup is None:
+        # Create the backup copies of the dictionaries
+        rels_backup = rules.RELATIONS.copy()
+        ops_backup = rules.OPERATORS.copy()
+        assert rels_backup is not rules.RELATIONS
+        assert ops_backup is not rules.OPERATORS
+        _relations_and_operators_backup = (rels_backup, ops_backup)
+        
+        # Register relations and operators to rules
+        rules.RELATIONS[RequireRelation.KEY] = RequireRelation
+        rules.RELATIONS[ConfigureRelation.KEY] = ConfigureRelation
+        rules.OPERATORS[ConfigureExpression.KEY] = ConfigureExpression
+        rules.OPERATORS[PlusExpression.KEY] = PlusExpression
+        rules.OPERATORS[SetExpression.KEY] = SetExpression
+        rules.OPERATORS[MinusExpression.KEY] = MinusExpression
+        rules.OPERATORS[MultiplyExpression.KEY] = MultiplyExpression
+        rules.OPERATORS[DivideExpression.KEY] = DivideExpression
+
+def unregister():
+    """
+    Undo the changes made by a call to register().
+    """
+    global _relations_and_operators_backup
+    if _relations_and_operators_backup is not None:
+        rules.RELATIONS = _relations_and_operators_backup[0]
+        rules.OPERATORS = _relations_and_operators_backup[1]
+        _relations_and_operators_backup = None
+
+def parse_rule(rulestring):
+    """
+    Divide the given rule string into (left side, relation, right side) components. 
+    @return: Triple (left side, relation, right side)
+    """
+    left_expression = ''
+    relation_name = None
+    right_expression = ''
+    for token in rules.get_tokens(rulestring):
+        if relation_name == None:
+            if token in rules.RELATIONS.keys():
+                relation_name = token
+            else:
+                left_expression += ' ' + token
+        else:
+            right_expression += ' ' + token
+    
+    if relation_name == None:
+        raise exceptions.ParseError('invalid rule definition %s' % rulestring)
+    
+    return (left_expression,relation_name,right_expression)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/ruleml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,241 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+A plugin implementation for rule generation.
+'''
+
+
+import os
+import sys
+import logging
+import shutil
+
+import __init__
+import re
+
+from ruleplugin import relations
+from cone.public import exceptions,plugin,utils,api,rules
+
+class RuleImpl(plugin.ImplBase):
+    """
+    MakeImpl plugin finds feature references that are configured in a .ruleml file
+    and generate a rule from them
+    """
+    IMPL_TYPE_ID = 'ruleml'
+    DEFAULT_INVOCATION_PHASE = 'pre'
+    
+    def __init__(self, ref, configuration, relation_container):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.logger = logging.getLogger('cone.ruleml(%s)' % self.ref)
+        self.relation_container = relation_container
+
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        return []
+    
+    def generate(self, context=None):
+        self.logger.info("Generating rules from %s" % self.ref)
+        relation_container = self.get_relation_container()
+        relation_container.context = context
+        return relation_container.execute()
+    
+    def has_tag(self, tags, policy=None):
+        # RuleML should always be executed, regardless of the tags
+        return True
+    
+    def get_relation_container(self):
+        return self.relation_container
+
+class RulemlRelationContainer(plugin.RelationContainer):
+    """
+    Relation container for RuleML rules.
+    
+    Basically this is a wrapper for rules.RelationContainer that adapts
+    it to the interface of plugin.RelationContainer.
+    """
+    def __init__(self, configuration, source, rule_list, eval_globals):
+        plugin.RelationContainer.__init__(self, configuration, source=source)
+        self.logger = logging.getLogger('cone.ruleml_relation_container(%s)' % self.source)
+        self.configuration = configuration
+        self.relation_container = rules.RelationContainerImpl()
+        self.eval_globals = eval_globals
+        self.context = None
+        for rule in rule_list:
+            self.relation_container.add_relation(rule)
+    
+    def execute(self):
+        results = []
+        
+        # Create the autoconfig if not done already
+        plugin.get_autoconfig(self.configuration)
+        
+        # Register relations etc. to the rule engine.
+        # Due to unit test issues the relations are not registered
+        # in the relations module, but only for the duration of
+        # rule parsing and execution
+        relations.register()
+        try:
+            # Using the configuration to pass the eval globals dict to the
+            # eval expression. The configuration only contains the globals
+            # dict for the duration of the rule execution, so hopefully this
+            # shouldn't mess anything up
+            self._set_builtin_eval_globals()
+            self.configuration._eval_expression_globals_dict = self.eval_globals
+            for i, rel in enumerate(self.relation_container):
+                index = i + 1
+                
+                # Execute
+                self._execute_relation_and_log_error(rel, self.source, index)
+                
+                # Collect execution result if supported
+                if hasattr(rel, 'get_execution_result'):
+                    result = rel.get_execution_result()
+                    if isinstance(result, plugin.RelationExecutionResult):
+                        result.source = self.source
+                        result.index = index
+                        results.append(result)
+            
+            del self.configuration._eval_expression_globals_dict
+            
+            if self.relation_container.has_errors():
+                for error in self.relation_container.get_errors():
+                    self.logger.error(error)
+            
+            if self.context:
+                self.context.results += results
+            return results
+        finally:
+            relations.unregister()
+    
+    def get_relation_count(self):
+        return len(self.relation_container)
+    
+    def _set_builtin_eval_globals(self):
+        """
+        Add built-in attributes into the eval globals dictionary.
+        """
+        class RuleBuiltinsModule(object):
+            pass
+                
+        builtins = RuleBuiltinsModule()
+        builtins.configuration = self.configuration
+        
+        self.eval_globals['ruleml'] = builtins
+
+class RuleImplReaderBase(plugin.ReaderBase):
+    NAMESPACE = None # Used as a base class, so should have no namespace
+    FILE_EXTENSIONS = ['ruleml']
+    
+    def __init__(self, resource_ref, configuration):
+        self.resource_ref = resource_ref
+        self.configuration = configuration
+        self.logger = logging.getLogger('cone.ruleml(%s)' % self.resource_ref)
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = cls(resource_ref, configuration)
+        
+        # Register relations etc. to the rule engine.
+        # Due to unit test issues the relations are not registered
+        # in the relations module, but only for the duration of
+        # rule parsing and execution
+        relations.register()
+        try:
+            rules = reader.parse_rules(etree)
+            eval_globals = reader.parse_eval_globals(etree)
+            
+            relation_container = RulemlRelationContainer(
+                configuration   = configuration,
+                source          = resource_ref,
+                rule_list       = rules,
+                eval_globals    = eval_globals)
+            
+            impl = RuleImpl(resource_ref, configuration, relation_container)
+        finally:
+            relations.unregister()
+        
+        return impl
+        
+class RuleImplReader1(RuleImplReaderBase):
+    NAMESPACE = 'http://www.s60.com/xml/ruleml/1'
+    
+    def __init__(self, resource_ref, configuration):
+        RuleImplReaderBase.__init__(self, resource_ref, configuration)
+    
+    def parse_rules(self, etree):
+        rules = []
+        for elem in etree.getiterator("{%s}rule" % self.NAMESPACE):
+            rules.extend(relations.RelationFactory.get_relations(self.configuration, elem.text))
+        return rules
+    
+    def parse_eval_globals(self, etree):
+        return {}
+
+class RuleImplReader2(RuleImplReaderBase):
+    NAMESPACE = 'http://www.s60.com/xml/ruleml/2'
+    
+    def __init__(self, resource_ref, configuration):
+        RuleImplReaderBase.__init__(self, resource_ref, configuration)
+    
+    def parse_rules(self, etree):
+        rules = []
+        for elem in etree.getiterator("{%s}rule" % self.NAMESPACE):
+            rules.extend(relations.RelationFactory.get_relations(self.configuration, self._replace_eval_blocks(elem.text)))
+        return rules
+    
+    def parse_eval_globals(self, etree):
+        eval_globals = {}
+        for elem in etree.getiterator("{%s}eval_globals" % self.NAMESPACE):
+            text = ""
+            if elem.get('file') != None:
+                self._read_eval_globals_from_file(elem.get('file'), eval_globals)
+            else:
+                try: 
+                    # Strip surrounding whitespace, otherwise there might be Python
+                    # indentation errors
+                    text = elem.text.strip()
+                    exec(text, eval_globals)
+                except Exception, e:
+                    self.logger.warning('Failed to evaluate eval_globals block, exception: %s' % (e))
+        return eval_globals
+    
+    def _read_eval_globals_from_file(self, relative_path, eval_globals):
+        # Get the actual path (relative to the current implementation file)
+        base_path = os.path.dirname(self.resource_ref)
+        pyfile_path = os.path.normpath(os.path.join(base_path, relative_path)).replace('\\', '/')
+        # Read the data and execute
+        try:
+            resource = None
+            resource = self.configuration.get_resource(pyfile_path)
+            text = resource.read()
+            exec(text.replace('\r', ''), eval_globals)
+        except Exception, e:
+            self.logger.warning('Cannot import eval file: %s. Exception: %s' % (pyfile_path, e))
+        finally:
+            if resource is not None: resource.close()
+        
+    
+    @classmethod
+    def _replace_eval_blocks(cls, code):
+        return utils.expand_delimited_tokens(
+            string          = code,
+            expander_func   = lambda ref, index: '__eval__ %r' % ref,
+            delimiters      =('{%', '%}'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/confml/testdata.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest" name="Test settings for eval blocks">
+    <setting ref="StringLenResult" name="String length result" type="int" />
+  </feature>
+  <data>
+    <EvalTest>
+      <StringLenResult>0</StringLenResult>
+    </EvalTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/implml/terminalexpression.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest.StringLenResult = 22</rule>
+  <rule>True configures EvalTest.StringLenResult = {% SOME_VALUE %}</rule>
+  <eval_globals>SOME_VALUE = 12345</eval_globals>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/testdata.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/confml/invalid_python_eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest2" name="Test settings for eval blocks">
+    <setting ref="StringResult" name="String result" type="string" />
+  </feature>
+  <data>
+    <EvalTest2>
+      <StringResult>0</StringResult>
+    </EvalTest2>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/implml/invalid_python_eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest2.StringResult = {% -> this is invalid python code %}</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/invalid_python_eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/confml/invalid_python_eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest3" name="Test settings for eval blocks">
+    <setting ref="StringResult" name="String result" type="string" />
+  </feature>
+  <data>
+    <EvalTest3>
+      <StringResult>0</StringResult>
+    </EvalTest3>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/implml/invalid_python_eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest3.StringResult = 22</rule>
+  <eval_globals file="scripts/test_eval.py"/>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/implml/scripts/test_eval.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+this is some other invalid python code
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test3/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/invalid_python_eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/confml/invalid_python_eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest4" name="Test settings for eval blocks">
+    <setting ref="StringResult" name="String result" type="string" />
+  </feature>
+  <data>
+    <EvalTest4>
+      <StringResult>0</StringResult>
+    </EvalTest4>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/implml/invalid_python_eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest4.StringResult = 22</rule>
+  <eval_globals file="scripts/not_valid_filename.py"/>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test4/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/invalid_python_eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/confml/invalid_python_eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest5" name="Test settings for eval blocks">
+    <setting ref="StringResult" name="String result" type="string" />
+  </feature>
+  <data>
+    <EvalTest5>
+      <StringResult>0</StringResult>
+    </EvalTest5>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/implml/invalid_python_eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest5.StringResult = {% 7/0 %}</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/implml/scripts/test_eval.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+this is some other invalid python code
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test5/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/invalid_python_eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/confml/invalid_python_eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest6" name="Test settings for eval blocks">
+    <setting ref="StringResult" name="String result" type="string" />
+  </feature>
+  <data>
+    <EvalTest6>
+      <StringResult>0</StringResult>
+    </EvalTest6>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/implml/invalid_python_eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest6.StringResult = Invalid.setting</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/errorruleproject/test6/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+<xi:include href="confml/invalid_python_eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.name"/>
+  <property name="cpf.description"/>
+  <property name="cpf.viewId"/>
+  <property name="cpf.rootFile" value="terra_VF_UK_101.confml"/>
+  <property name="cpf.dataFile"/>
+  <property name="cpf.author"/>
+  <property name="cpf.version"/>
+  <property name="cpf.product"/>
+  <property name="cpf.customer"/>
+  <property name="cpf.platform"/>
+  <property name="cpf.release"/>
+  <property name="cpf.date"/>
+  <property name="cpf.owner"/>
+</metadata>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>config_project</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.tools.variant.confml.core.ConfMLLayerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.tools.variant.confml.core.ConfMLLayerNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.rootFile" />
+</metadata>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/confml/actionpriorities.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+<configuration name="actionpriorities" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="Contact Action Service" ref="KCRUidFsContactActionService">
+    <desc />
+  <setting name="Call GSM" ref="KFscCrUidCallGsm" type="string" />
+  </feature>
+<feature name="ar operations" ref="operations">
+    <setting name="MINUS" ref="minus" type="int" />
+  <setting name="MINUS1" ref="minus1" type="int" />
+  <setting name="MINUS2" ref="minus2" type="int" />
+  <setting name="MINUS3" ref="minus3" type="int" />
+  <setting name="MINUS4" ref="minus4" type="int" />
+  <setting name="MINUS5" ref="minus5" type="int" />
+  <setting name="MINUS6" ref="minus6" type="int" />
+  <setting name="MINUS7" ref="minus7" type="int" />
+  <setting name="MINUS8" ref="minus8" type="int" />
+  <setting name="STRING1" ref="string1" type="string" />
+  <setting name="STRING2" ref="string2" type="string" />
+  </feature>
+<data>
+    <KCRUidFsContactActionService>
+      <KFscCrUidCallGsm />
+    </KCRUidFsContactActionService>
+  <operations>
+      <minus>5</minus>
+    <minus1>25</minus1>
+    <minus2>7</minus2>
+    <minus3>5</minus3>
+    <minus4>10</minus4>
+    <minus5>2</minus5>
+    <minus6>6</minus6>
+    <minus7>10</minus7>
+    <minus8>9</minus8>
+    <string1>Hello</string1>
+    <string2>World</string2>
+    </operations>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/implml/gsm.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>operations.minus == 5 configures operations.minus = operations.minus1 - operations.minus2</rule>
+  <rule>operations.minus1 == 25 configures operations.minus1 = operations.minus3 * operations.minus2</rule>
+  <rule>operations.minus4 == 10 configures operations.minus4 = operations.minus4 / operations.minus5</rule>
+  <rule>operations.minus6 == 6 configures operations.minus6 = operations.minus7 + operations.minus8</rule>
+  <rule>operations.string1 == 'Hello' configures operations.string1 = operations.string1 + operations.string2</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/rule/config_project/platforms/customsw/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<configuration name="platforms_customsw_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/actionpriorities.confml" />
+<xi:include href="autodata.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.rootFile" value="root.confml" />
+</metadata>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/arithmetic.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,91 @@
+<configuration name="Arithmetic operation test" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="Test settings for arithmetic operations" ref="Arithmetic">
+    <!-- Values used in tests -->
+    <setting name="Value 1" ref="Value1" type="int" />
+    <setting name="Value 2" ref="Value2" type="int" />
+    
+    <setting name="Real value 1" ref="RealValue1" type="real" />
+    <setting name="Real value 2" ref="RealValue2" type="real" />
+    
+    <!-- Settings for storing the result of the calculation -->
+    <setting name="Addition result 1" ref="AdditionResult1" type="int" />
+    <setting name="Addition result 2" ref="AdditionResult2" type="int" />
+    <setting name="Addition result 3" ref="AdditionResult3" type="int" />
+    <setting name="Addition result 4" ref="AdditionResult4" type="int" />
+    
+    <setting name="Subtraction result 1" ref="SubtractionResult1" type="int" />
+    <setting name="Subtraction result 2" ref="SubtractionResult2" type="int" />
+    <setting name="Subtraction result 3" ref="SubtractionResult3" type="int" />
+    <setting name="Subtraction result 4" ref="SubtractionResult4" type="int" />
+    
+    <setting name="Multiplication result 1" ref="MultiplicationResult1" type="int" />
+    <setting name="Multiplication result 2" ref="MultiplicationResult2" type="int" />
+    <setting name="Multiplication result 3" ref="MultiplicationResult3" type="int" />
+    <setting name="Multiplication result 4" ref="MultiplicationResult4" type="int" />
+    
+    <setting name="Division result 1" ref="DivisionResult1" type="int" />
+    <setting name="Division result 2" ref="DivisionResult2" type="int" />
+    <setting name="Division result 3" ref="DivisionResult3" type="int" />
+    <setting name="Division result 4" ref="DivisionResult4" type="int" />
+    
+    <setting name="Mixed result 1" ref="MixedResult1" type="int" />
+    <setting name="Mixed result 2" ref="MixedResult2" type="int" />
+    <setting name="Mixed result 3" ref="MixedResult3" type="int" />
+    <setting name="Mixed result 4" ref="MixedResult4" type="int" />
+    <setting name="Mixed result 5" ref="MixedResult5" type="int" />
+    
+    <setting name="Real result 1" ref="RealResult1" type="real" />
+    <setting name="Real result 2" ref="RealResult2" type="real" />
+    <setting name="Real result 3" ref="RealResult3" type="real" />
+    <setting name="Real result 4" ref="RealResult4" type="real" />
+    
+    <setting name="Real calculation into int setting result" ref="RealCalcIntoIntResult" type="int" />
+    <setting name="Int calculation into real setting result" ref="IntCalcIntoRealResult" type="real" />
+
+
+  </feature>
+  
+  <data>
+    <Arithmetic>
+      <Value1>5</Value1>
+      <Value2>20</Value2>
+      
+      <RealValue1>5</RealValue1>
+      <RealValue2>20</RealValue2>
+      
+      <AdditionResult1>0</AdditionResult1>
+      <AdditionResult2>0</AdditionResult2>
+      <AdditionResult3>0</AdditionResult3>
+      <AdditionResult4>0</AdditionResult4>
+      
+      <SubtractionResult1>0</SubtractionResult1>
+      <SubtractionResult2>0</SubtractionResult2>
+      <SubtractionResult3>0</SubtractionResult3>
+      <SubtractionResult4>0</SubtractionResult4>
+      
+      <MultiplicationResult1>0</MultiplicationResult1>
+      <MultiplicationResult2>0</MultiplicationResult2>
+      <MultiplicationResult3>0</MultiplicationResult3>
+      <MultiplicationResult4>0</MultiplicationResult4>
+      
+      <DivisionResult1>0</DivisionResult1>
+      <DivisionResult2>0</DivisionResult2>
+      <DivisionResult3>0</DivisionResult3>
+      <DivisionResult4>0</DivisionResult4>
+      
+      <MixedResult1>0</MixedResult1>
+      <MixedResult2>0</MixedResult2>
+      <MixedResult3>0</MixedResult3>
+      <MixedResult4>0</MixedResult4>
+      <MixedResult5>0</MixedResult5>
+      
+      <RealResult1>0</RealResult1>
+      <RealResult2>0</RealResult2>
+      <RealResult3>0</RealResult3>
+      <RealResult4>0</RealResult4>
+      
+      <RealCalcIntoIntResult>0</RealCalcIntoIntResult>
+      <IntCalcIntoRealResult>0</IntCalcIntoRealResult>
+    </Arithmetic>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/commsdatcreator.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1935 @@
+<configuration name="Default CommsDat settings" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="CommsDat generation" ref="KCRUidCommsDatCreator">
+    <desc>Used to configure whether CommsDat generation from these settings is enabled.</desc>
+  <setting name="CommsDat generation enabled" ref="KCommsDatCreatorInputFileName" type="string">
+      <desc>This is the master switch that determines whether CommsDat is created in the first boot 
+    	of the device based on Configuration Tool output. Set this to Yes if you are creating variant 
+    	and need to configure anything under Default CommsDat settings.</desc>
+    <option name="No" value="" />
+    <option name="Yes" value="VariantData_commsdat.xml" />
+    </setting>
+  <setting name="CommsDatCreator startup status flag" readOnly="true" ref="KCommsDatCreatorStartupStatus" type="int">
+      <desc>Read-only flag that indicates the CommsDatCreator start-up status in runtime.</desc>
+    </setting>
+  </feature>
+<feature name="Global settings" ref="Global">
+    <desc>
+  	Global networking related settings not tied to individual connection methods.
+  	</desc>
+  <setting name="Attachmode" ref="Attachmode" type="selection">
+      <desc>
+      GPRS attach mode (attach when needed/when available).
+      </desc>
+    <option name="When available" value="whenavailable" />
+    <option name="When needed" value="whenneeded" />
+    </setting>
+  <setting name="Default access point" ref="DefaultAP" type="string">
+      <desc>
+    	Default GPRS access point. Used when the phone is used as a modem for a PC.
+    	The corresponding UI setting is Connection-Packet data-Access point.
+    	</desc>
+    </setting>
+  <setting name="Default icon for DNs" ref="DefaultDnIcon" type="selection">
+      <desc>
+      Default icon for destination networks.
+      </desc>
+    <option name="internet" value="0" />
+    <option name="wap" value="1" />
+    <option name="mms" value="2" />
+    <option name="intranet" value="3" />
+    <option name="operator" value="4" />
+    <option name="icon1" value="5" />
+    <option name="icon2" value="6" />
+    <option name="icon3" value="7" />
+    <option name="icon4" value="8" />
+    <option name="icon5" value="9" />
+    <option name="icon6" value="10" />
+    <option name="default" value="11" />
+    </setting>
+  <setting name="LAN bearer default priority" ref="PriorityLan" type="string">
+      <desc>
+    	Default priority for LAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="WLAN bearer default priority" ref="PriorityWlan" type="string">
+      <desc>
+    	Default priority for WLAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="PAN bearer default priority" ref="PriorityPan" type="string">
+      <desc>
+    	Default priority for PAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="Outgoing GPRS bearer default priority" ref="PriorityGprsOut" type="string">
+      <desc>
+    	Default priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="Incoming GPRS bearer default priority" ref="PriorityGprsIn" type="string">
+      <desc>
+    	Default priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="CDMA2000 bearer default priority" ref="PriorityCdma2k" type="string">
+      <desc>
+    	Default priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialOut ISP bearer default priority" ref="PriorityDialOut" type="string">
+      <desc>
+    	Default priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialIn ISP bearer default priority" ref="PriorityDialIn" type="string">
+      <desc>
+    	Default priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="VPN bearer default priority" ref="PriorityVpn" type="string">
+      <desc>
+    	Default priority for VPN bearer type.
+    	</desc>
+    </setting>
+  <setting name="MIP bearer default priority" ref="PriorityMip" type="string">
+      <desc>
+    	Default priority for MIP bearer type.
+    	</desc>
+    </setting>
+  <setting name="LAN bearer default UI priority" ref="UIPriorityLan" type="string">
+      <desc>
+    	Default UI priority of LAN connection.
+    	</desc>
+    </setting>
+  <setting name="WLAN bearer default UI priority" ref="UIPriorityWlan" type="string">
+      <desc>
+    	Default UI priority for WLAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="PAN bearer default UI priority" ref="UIPriorityPan" type="string">
+      <desc>
+    	Default UI priority for PAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="Outgoing GPRS bearer default UI priority" ref="UIPriorityGprsOut" type="string">
+      <desc>
+    	Default UI priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="Incoming GPRS bearer default UI priority" ref="UIPriorityGprsIn" type="string">
+      <desc>
+    	Default UI priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="CDMA2000 bearer default UI priority" ref="UIPriorityCdma2k" type="string">
+      <desc>
+    	Default UI priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialOut ISP bearer default UI priority" ref="UIPriorityDialOut" type="string">
+      <desc>
+    	Default UI priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialIn ISP bearer default UI priority" ref="UIPriorityDialIn" type="string">
+      <desc>
+    	Default UI priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="VPN bearer default UI priority" ref="UIPriorityVpn" type="string">
+      <desc>
+    	Default UI priority for VPN bearer type.
+    	</desc>
+    </setting>
+  <setting name="MIP bearer default UI priority" ref="UIPriorityMip" type="string">
+      <desc>
+    	Default UI priority for MIP bearer type.
+    	</desc>
+    </setting>
+  <setting name="Default connection type" ref="DefaultConnectionType" type="selection">
+      <desc>
+      Specifies how the applications' default connection is specified.
+      </desc>
+    <option name="Ask once" value="Ask once" />
+    <option name="Always ask" value="Always ask" />
+    <option name="Destination" value="Destination" />
+    <option name="Connection method" value="Connection method" />
+    </setting>
+  <setting name="Default connection name" ref="DefaultConnectionName" type="string">
+      <desc>
+    	The name of the default connection (connection method or destination network). 
+    	Default connection type parameter needs to be set accordingly.
+    	</desc>
+    </setting>
+  <setting name="GPRS last socket activity timeout" ref="GprsLastSocketActivityTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="GPRS last session closed timeout" ref="GprsLastSessionClosedTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when session has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="GPRS last socket closed timeout" ref="GprsLastSocketClosedTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when socket has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last socket activity timeout" ref="CsdLastSocketActivityTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last session closed timeout" ref="CsdLastSessionClosedTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last socket closed timeout" ref="CsdLastSocketClosedTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last socket activity timeout" ref="WlanLastSocketActivityTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last session closed timeout" ref="WlanLastSessionClosedTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last socket closed timeout" ref="WlanLastSocketClosedTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN background scan interval" ref="WlanBGScanInterval" type="selection">
+      <desc>
+      How often WLAN networks are scanned when idle.
+      </desc>
+    <option name="Never" value="0" />
+    <option name="Every minute" value="60" />
+    <option name="Every 2 minutes" value="120" />
+    <option name="Every 5 minutes" value="300" />
+    <option name="Every 10 minutes" value="600" />
+    </setting>
+  <setting name="WLAN use default settings" ref="WlanUseDefSettings" type="selection">
+      <desc>Defines whether default values are being used for the advanced WLAN settings (recommended). </desc>
+    <option name="No" value="0" />
+    <option name="Yes" value="1" />
+    </setting>
+  <setting name="WLAN long retry limit" ref="WlanLongRetry" type="int">
+      <desc>Defines how many times packets bigger than RTS Threshold are been resent.</desc>
+    </setting>
+  <setting name="WLAN short retry limit" ref="WlanShortRetry" type="int">
+      <desc>Defines how many times packets smaller than RTS Threshold are been resent.</desc>
+    </setting>
+  <setting name="WLAN RTS threshold" ref="WlanRTS" type="int">
+      <desc>Minimum size of a packet for which CTS/RTS handshake has been used.</desc>
+    </setting>
+  <setting name="WLAN TX power level" ref="WlanTxPowerLevel" type="selection">
+      <desc>Transmission power level in use. In mWs. 4, 10 or 100 mW.</desc>
+    <option name="100 mW" value="100" />
+    <option name="10 mW" value="10" />
+    <option name="4 mW" value="4" />
+    </setting>
+  <setting name="WLAN allow radio measurements" ref="WlanRadioMeasurements" type="selection">
+      <desc>Defines whether the CCX radio measurements are allowed.</desc>
+    <option name="No" value="0" />
+    <option name="Yes" value="1" />
+    </setting>
+  <setting name="WLAN power save" ref="WlanPowerMode" type="selection">
+      <desc>Defines whether power saving methods are active. Disabling WLAN
+      power save might increase interoperability but will dramatically shorten battery life.</desc>
+    <option name="On" value="1" />
+    <option name="Off" value="0" />
+    </setting>
+  </feature>
+<feature name="GPRS Access Points" ref="APs">
+    <desc>GPRS connection method (CM) definitions</desc>
+  <setting maxOccurs="99" minOccurs="0" name="GPRS" ref="AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Network type" ref="NetworkType" type="selection">
+        <desc>Addressing that the network uses.</desc>
+      <option name="IPv4" value="IPv4" />
+      <option name="IPv6" value="IPv6" />
+      </setting>
+    <setting name="GPRS Access Point Name" ref="GPRS_AP_Name" type="string">
+        <desc>The access point name for this GPRS connection</desc>
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="GPRS Use EDGE" ref="GprsUseEdge" type="selection">
+        <desc>Allow EDGE usage.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="ISP Type" ref="IspType" type="selection">
+        <desc>Specifies the service provider type. Used when filtering connection methods for certain purpose.</desc>
+      <option name="Internet" value="0" />
+      <option name="WAP" value="1" />
+      <option name="Both" value="2" />
+      </setting>
+    </setting>
+  </feature>
+<feature name="WLAN Access Points" ref="WLAN_APs">
+    <desc>WLAN connection method (CM) definitions</desc>
+  <setting maxOccurs="99" minOccurs="0" name="WLAN" ref="WLAN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Network Name" ref="NetworkName" type="string">
+        <desc>Service set identifier (SSID) of the primary WLAN network.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+    <setting name="Network Mode" ref="NetworkMode" type="string">
+        <desc>Determines the network infrastructure. 
+        If there is a WLAN access point in the network then this should be Infrastructure.</desc>
+      <option name="Infrastructure" value="Infrastructure" />
+      <option name="Ad-hoc" value="Ad-hoc" />
+      </setting>
+    <setting name="Security Mode" ref="SecurityMode" type="selection">
+        <desc>Security mode of the WLAN network.</desc>
+      <option name="Open" value="Open" />
+      <option name="WEP" value="WEP" />
+      <option name="802.1x" value="802.1x" />
+      <option name="WPA" value="WPA" />
+      <option name="WPA2" value="WPA2" />
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="WLAN IP Gateway Address" ref="WlanIpGatewayAddress" type="string">
+        <desc>The gateway IP address. 
+      Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="Wlan IP Net Mask" ref="WlanIpNetMask" type="string">
+        <desc>Network mask. Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="WLAN Scan SSID" ref="WLANScanSSID" type="selection">
+        <desc>Defines whether the SSID should be actively scanned. 
+        This is needed if the SSID is hidden (not broadcasted by the AP) </desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="WLAN Channel ID" ref="WlanChannelId" type="string">
+        <desc>
+      	802.11 Channel ID (1-14). Used only when connecting/setting up adhoc network.
+      	</desc>
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="WEP Key In Use" ref="WEPKeyInUse" type="selection">
+        <desc>Index of default WEP key. Used only when security mode is WEP.</desc>
+      <option name="key1" value="key1" />
+      <option name="key2" value="key2" />
+      <option name="key3" value="key3" />
+      <option name="key4" value="key4" />
+      </setting>
+    <setting name="WEP Auth Type" ref="WEPAuthType" type="selection">
+        <desc>WEP authentication mode. Only used when security mode is WEP.</desc>
+      <option name="Shared" value="Shared" />
+      <option name="Open" value="Open" />
+      </setting>
+    <setting name="WEP Key1 Length" ref="WEPKey1Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key1 Format" ref="WEPKey1Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key1 Data" ref="WEPKey1Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key2 Length" ref="WEPKey2Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key2 Format" ref="WEPKey2Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key2 Data" ref="WEPKey2Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key3 Length" ref="WEPKey3Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key3 Format" ref="WEPKey3Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key3 Data" ref="WEPKey3Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key4 Length" ref="WEPKey4Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key4 Format" ref="WEPKey4Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key4 Data" ref="WEPKey4Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WPA Pre-shared Key" ref="WPAPresharedKey" type="string">
+        <desc>WPA/WPA2 pre-shared key in plain text. ASCII character set values between 32-126 must be used. Minimum length is 8 characters and maximum 63.
+        You need to also define the WPA pre-shared key length field accordingly</desc>
+      </setting>
+    <setting name="WPA Use of Pre-shared Key" ref="WPAUseOfPresharedKey" type="selection">
+        <desc>Specifies that when the security mode is WPA or WPA2 if the PSK mode is enabled. 
+        If this is off then EAP mode is used and the list of EAPs needs to be defined.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="WPA Pre-shared key length" ref="WPAKeyLength" type="int">
+        <desc>The length of the specified pre-shared key (in WPA pre-shared key field)</desc>
+      </setting>
+    <setting name="WPA List Of EAPs" ref="WPAListOfEAPs" type="string">
+        <desc>
+      	A list of Extensible Authentication Protocols (EAPs) in use. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM the string needs to be "+018". 
+      	The list is in priority order, highest priority first.      	
+      	</desc>
+      </setting>
+    <setting name="EAP-GTC user name" ref="EapGtcUsername" type="string">
+        <desc>The username used with EAP-GTC.</desc>
+      </setting>
+    <setting name="EAP-GTC session validity time" ref="EapGtcSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-GTC tunneling method" ref="EapGtcEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-GTC.</desc>
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-TLS user name" ref="EapTlsUsername" type="string">
+        <desc>The username used with EAP-TLS.</desc>
+      </setting>
+    <setting name="EAP-TLS realm" ref="EapTlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-TLS verify server realm" ref="EapTlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TLS require client authentication" ref="EapTlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TLS session validity time" ref="EapTlsSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-TLS cipher suites" ref="EapTlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate subject key id" ref="EapTlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate. 
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate issuer" ref="EapTlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate serial number" ref="EapTlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate subject key id" ref="EapTlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate issuer" ref="EapTlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate serial number" ref="EapTlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS tunneling method" ref="EapTlsEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-TLS.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-LEAP user name" ref="EapLeapUsername" type="string">
+        <desc>The username used with EAP-LEAP.</desc>
+      </setting>
+    <setting name="EAP-LEAP password" ref="EapLeapPassword" type="string">
+        <desc>The password used with EAP-LEAP.</desc>
+      </setting>
+    <setting name="EAP-LEAP session validity time" ref="EapLeapSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-SIM user name" ref="EapSimUsername" type="string">
+        <desc>The username used with EAP-SIM.</desc>
+      </setting>
+    <setting name="EAP-SIM realm" ref="EapSimRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-SIM pseudonyms allowed" ref="EapSimUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-SIM session validity time" ref="EapSimSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-SIM tunneling method" ref="EapSimEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-SIM.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-TTLS user name" ref="EapTtlsUsername" type="string">
+        <desc>The username used with EAP-TTLS.</desc>
+      </setting>
+    <setting name="EAP-TTLS realm" ref="EapTtlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-TTLS verify server realm" ref="EapTtlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TTLS require client authentication" ref="EapTtlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TTLS session validity time" ref="EapTtlsSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-TTLS cipher suites" ref="EapTtlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-TTLS tunneled methods" ref="EapTtlsEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-TTLS. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate subject key id" ref="EapTtlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate issuer" ref="EapTtlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate serial number" ref="EapTtlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate subject key id" ref="EapTtlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate issuer" ref="EapTtlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate serial number" ref="EapTtlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-AKA user name" ref="EapAkaUsername" type="string">
+        <desc>The username used with EAP-AKA.</desc>
+      </setting>
+    <setting name="EAP-AKA realm" ref="EapAkaRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-AKA pseudonyms allowed" ref="EapAkaUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-AKA session validity time" ref="EapAkaSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-AKA tunneling method" ref="EapAkaEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-AKA.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-PEAP user name" ref="EapPeapUsername" type="string">
+        <desc>The username used with EAP-PEAP.</desc>
+      </setting>
+    <setting name="EAP-PEAP realm" ref="EapPeapRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-PEAP verify server realm" ref="EapPeapVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP require client authentication" ref="EapPeapRequireClientAuth" type="selection">
+        <desc>Specifies whether PEAP requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP session validity time" ref="EapPeapSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-PEAP cipher suites" ref="EapPeapCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-PEAP version 0 allowed" ref="EapPeapV0Allowed" type="selection">
+        <desc>Is PEAP version 0 allowed. If in doubt enable only this one.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP version 1 allowed" ref="EapPeapV1Allowed" type="selection">
+        <desc>Is PEAP version 1 allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP version 2 allowed" ref="EapPeapV2Allowed" type="selection">
+        <desc>Is PEAP version 2 allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP tunneled methods" ref="EapPeapEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-PEAP. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate subject key id" ref="EapPeapUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate issuer" ref="EapPeapUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate serial number" ref="EapPeapUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate subject key id" ref="EapPeapCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate issuer" ref="EapPeapCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate serial number" ref="EapPeapCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 user name" ref="EapMschapv2Username" type="string">
+        <desc>The username used with EAP-MSCHAPv2.</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 password" ref="EapMschapv2Password" type="string">
+        <desc>The password used with EAP-MSCHAPv2.</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 session validity time" ref="EapMschapv2SessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 tunneling method" ref="EapMschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-MSCHAPv2.</desc>
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-FAST user name" ref="EapFastUsername" type="string">
+        <desc>The username used with EAP-FAST.</desc>
+      </setting>
+    <setting name="EAP-FAST realm" ref="EapFastRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-FAST verify server realm" ref="EapFastVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST require client authentication" ref="EapFastRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST session validity time" ref="EapFastSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-FAST cipher suites" ref="EapFastCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-FAST tunneled methods" ref="EapFastEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-FAST. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-FAST authenticated provisioning mode allowed" ref="EapFastAuthProvModeAllowed" type="selection">
+        <desc>EAP-FAST authenticated provisioning mode allowed</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST unauthenticated provisioning mode allowed" ref="EapFastUnauthProvModeAllowed" type="selection">
+        <desc>EAP-FAST unauthenticated provisioning mode allowed</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn ADHP no PAC" ref="EapFastWarnADHPNoPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no PAC</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn ADHP no matching PAC" ref="EapFastWarnADHPNoMatchingPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no matching PAC</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn not default server" ref="EapFastWarnNotDefaultServer" type="selection">
+        <desc>EAP-FAST warn not default server</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST user certificate subject key id" ref="EapFastUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-FAST user certificate issuer" ref="EapFastUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST user certificate serial number" ref="EapFastUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate subject key id" ref="EapFastCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate issuer" ref="EapFastCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate serial number" ref="EapFastCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="MSCHAPv2 user name" ref="Mschapv2Username" type="string">
+        <desc>The username used with MSCHAPv2.</desc>
+      </setting>
+    <setting name="MSCHAPv2 password" ref="Mschapv2Password" type="string">
+        <desc>The password used with MSCHAPv2.</desc>
+      </setting>
+    <setting name="MSCHAPv2 session validity time" ref="Mschapv2SessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="MSCHAPv2 tunneling method" ref="Mschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with MSCHAPv2. Needs to be EAP-TTLS.</desc>
+      <option name="EAP-TTLS" value="21" />
+      </setting>
+    </setting>
+  </feature>
+<feature name="CSD Access Points" ref="CSD_APs">
+    <desc>Circuit-Switched Data connection methods</desc>
+  <setting maxOccurs="99" minOccurs="0" name="CSD" ref="CSD_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>Username for the connection.</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password on connection set-up time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password Authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication type.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Starting page.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>WTLS security.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Connection type.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+    <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+      <option name="Autodetect" value="Autodetect" />
+      <option name="9600" value="9600" />
+      <option name="14400" value="14400" />
+      <option name="19200" value="19200" />
+      <option name="28800" value="28800" />
+      <option name="38400" value="38400" />
+      <option name="43200" value="43200" />
+      <option name="56000" value="56000" />
+      </setting>
+    <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+      <option name="Analogue" value="Analogue" />
+      <option name="Isdn v110" value="Isdn v110" />
+      <option name="Isdn v120" value="Isdn v120" />
+      </setting>
+    <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+      <option name="Server Number" value="Server Number" />
+      <option name="Other Number" value="Other Number" />
+      </setting>
+    <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+    <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+    <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="HSCD Access Points" ref="HSCSD_APs">
+    <desc>High-speed Circuit-Switched Data connection methods</desc>
+  <setting maxOccurs="99" minOccurs="0" name="HSCSD" ref="HSCSD_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+    <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+      <option name="Autodetect" value="Autodetect" />
+      <option name="9600" value="9600" />
+      <option name="14400" value="14400" />
+      <option name="19200" value="19200" />
+      <option name="28800" value="28800" />
+      <option name="38400" value="38400" />
+      <option name="43200" value="43200" />
+      <option name="56000" value="56000" />
+      </setting>
+    <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+      <option name="Analogue" value="Analogue" />
+      <option name="Isdn v110" value="Isdn v110" />
+      <option name="Isdn v120" value="Isdn v120" />
+      </setting>
+    <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+      <option name="Server Number" value="Server Number" />
+      <option name="Other Number" value="Other Number" />
+      </setting>
+    <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+    <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+    <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="LAN Access Points" ref="LAN_APs">
+    <desc>LAN connection methods</desc>
+  <setting maxOccurs="99" minOccurs="0" name="LAN" ref="LAN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="LAN If Networks" ref="LanIfNetworks" type="string">
+        <desc>LAN interface networks.</desc>
+      </setting>
+    <setting name="LAN IP Netmask" ref="LanIpNetmask" type="string">
+        <desc>LAN interface netmask.</desc>
+      </setting>
+    <setting name="LAN IP Gateway" ref="LanIpGateway" type="string">
+        <desc>LAN IP Gateway.</desc>
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="VPN Access Points" ref="VPN_APs">
+    <desc>Virtual Private Network connection methods</desc>
+  <setting maxOccurs="99" minOccurs="0" name="VPN" ref="VPN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Underlying IAP Name" ref="IAP_Name" type="string">
+        <desc>The network connection provider IAP name.</desc>
+      </setting>
+    <setting name="Service Policy" ref="ServicePolicy" type="string">
+        <desc>Service policy.</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="Destination Networks" ref="DNs">
+    <desc>Destination network (SNAP) definitions.</desc>
+  <setting maxOccurs="99" minOccurs="0" name="DN" ref="DN" type="sequence">
+      <setting name="Name" ref="Name" type="string">
+        <desc>The name that is visible to the user</desc>
+      </setting>
+    <setting name="Destination Network ID" ref="DNId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Metadata" ref="Metadata" type="selection">
+        <desc>Metadata that specifies a few default destination networks that applications can use</desc>
+      <option name="User Defined" value="UserDefined" />
+      <option name="Internet" value="Internet" />
+      <option name="Operator" value="Operator" />
+      <option name="MMS" value="MMS" />
+      <option name="Intranet" value="Intranet" />
+      </setting>
+    <setting name="Protection Level" ref="Protection" type="selection">
+        <desc>DN protection level. Destination contents mean the connection methods inside the destination and their priorities. </desc>
+      <option name="No protection" value="0" />
+      <option name="Destination and contents" value="1" />
+      <option name="Destination" value="2" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Is DN hidden or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Is DN hidden in CConnDlg or not</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Is DN highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Icon" ref="Icon" type="selection">
+        <desc>Icon to be assigned to DN.</desc>
+      <option name="internet" value="0" />
+      <option name="wap" value="1" />
+      <option name="mms" value="2" />
+      <option name="intranet" value="3" />
+      <option name="operator" value="4" />
+      <option name="icon1" value="5" />
+      <option name="icon2" value="6" />
+      <option name="icon3" value="7" />
+      <option name="icon4" value="8" />
+      <option name="icon5" value="9" />
+      <option name="icon6" value="10" />
+      <option name="default" value="11" />
+      </setting>
+    <setting name="EmbeddedDN" ref="EmbeddedDN" type="string">
+        <desc>
+	    	Name of an embedded DN that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 1" ref="IAP" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 2" ref="IAP2" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 3" ref="IAP3" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 4" ref="IAP4" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 5" ref="IAP5" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 6" ref="IAP6" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 7" ref="IAP7" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 8" ref="IAP8" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 9" ref="IAP9" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 10" ref="IAP10" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    </setting>
+  </feature>
+<data>
+    <CSD_APs>
+      <CSD_AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+      <WTLS_Security>On</WTLS_Security>
+      <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      <BearerSpeed>Autodetect</BearerSpeed>
+      <BearerCallTypeIsdn>Analogue</BearerCallTypeIsdn>
+      <CallbackEnabled>Yes</CallbackEnabled>
+      <CallbackType>Server Number</CallbackType>
+      <EnableSWCompression>No</EnableSWCompression>
+      <UseLoginScript>No</UseLoginScript>
+      <ConnectionName />
+      <ConnectionId />
+      <UserName />
+      <PromptPassword />
+      <Password />
+      <WAPGatewayIP />
+      <StartingPage />
+      <PhoneIP />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <DefaultTelNumber />
+      <CallbackInfo />
+      <LoginScript />
+      <InitString />
+      </CSD_AP>
+    </CSD_APs>
+  <DNs>
+      <DN template="true">
+        <Metadata>User Defined</Metadata>
+      <Protection>0</Protection>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Icon>11</Icon>
+      <Name />
+      <DNId />
+      <EmbeddedDN />
+      <IAP />
+      <IAP2 />
+      <IAP3 />
+      <IAP4 />
+      <IAP5 />
+      <IAP6 />
+      <IAP7 />
+      <IAP8 />
+      <IAP9 />
+      <IAP10 />
+      </DN>
+    <DN>
+        <Name>Internet</Name>
+      <DNId>1</DNId>
+      <Metadata>Internet</Metadata>
+      <Protection>2</Protection>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>Yes</Highlighted>
+      <Icon>0</Icon>
+      <EmbeddedDN />
+      <IAP />
+      <IAP2 />
+      <IAP3 />
+      <IAP4 />
+      <IAP5 />
+      <IAP6 />
+      <IAP7 />
+      <IAP8 />
+      <IAP9 />
+      <IAP10 />
+      </DN>
+    <DN>
+        <Name>MMS</Name>
+      <DNId>2</DNId>
+      <Metadata>MMS</Metadata>
+      <Protection>2</Protection>
+      <Hidden>No</Hidden>
+      <HiddenAgent>Yes</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Icon>2</Icon>
+      <EmbeddedDN />
+      <IAP />
+      <IAP2 />
+      <IAP3 />
+      <IAP4 />
+      <IAP5 />
+      <IAP6 />
+      <IAP7 />
+      <IAP8 />
+      <IAP9 />
+      <IAP10 />
+      </DN>
+    <DN>
+        <Name>Operator</Name>
+      <DNId>3</DNId>
+      <Metadata>Operator</Metadata>
+      <Protection>2</Protection>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Icon>4</Icon>
+      <EmbeddedDN />
+      <IAP />
+      <IAP2 />
+      <IAP3 />
+      <IAP4 />
+      <IAP5 />
+      <IAP6 />
+      <IAP7 />
+      <IAP8 />
+      <IAP9 />
+      <IAP10 />
+      </DN>
+    </DNs>
+  <Global>
+      <Attachmode>whenavailable</Attachmode>
+    <DefaultDnIcon>11</DefaultDnIcon>
+    <DefaultConnectionType>Ask once</DefaultConnectionType>
+    <DefaultConnectionName />
+    <DefaultAP />
+    <WlanUseDefSettings>1</WlanUseDefSettings>
+    <WlanBGScanInterval>0</WlanBGScanInterval>
+    <WlanTxPowerLevel>100</WlanTxPowerLevel>
+    <WlanRadioMeasurements>1</WlanRadioMeasurements>
+    <WlanPowerMode>1</WlanPowerMode>
+    <PriorityLan>0</PriorityLan>
+    <PriorityWlan>1</PriorityWlan>
+    <PriorityPan>2</PriorityPan>
+    <PriorityGprsOut>3</PriorityGprsOut>
+    <PriorityGprsIn>4</PriorityGprsIn>
+    <PriorityCdma2k>5</PriorityCdma2k>
+    <PriorityDialOut>6</PriorityDialOut>
+    <PriorityDialIn>7</PriorityDialIn>
+    <PriorityVpn>253</PriorityVpn>
+    <PriorityMip>254</PriorityMip>
+    <UIPriorityLan>9</UIPriorityLan>
+    <UIPriorityWlan>0</UIPriorityWlan>
+    <UIPriorityPan>8</UIPriorityPan>
+    <UIPriorityGprsOut>1</UIPriorityGprsOut>
+    <UIPriorityGprsIn>2</UIPriorityGprsIn>
+    <UIPriorityCdma2k>3</UIPriorityCdma2k>
+    <UIPriorityDialOut>4</UIPriorityDialOut>
+    <UIPriorityDialIn>5</UIPriorityDialIn>
+    <UIPriorityVpn>6</UIPriorityVpn>
+    <UIPriorityMip>7</UIPriorityMip>
+    <WlanLongRetry>4</WlanLongRetry>
+    <WlanShortRetry>7</WlanShortRetry>
+    <WlanRTS>2347</WlanRTS>
+    <CsdLastSocketActivityTimeout>300</CsdLastSocketActivityTimeout>
+    <CsdLastSessionClosedTimeout>1</CsdLastSessionClosedTimeout>
+    <CsdLastSocketClosedTimeout>300</CsdLastSocketClosedTimeout>
+    <WlanLastSocketActivityTimeout>-1</WlanLastSocketActivityTimeout>
+    <WlanLastSessionClosedTimeout>1</WlanLastSessionClosedTimeout>
+    <WlanLastSocketClosedTimeout>-1</WlanLastSocketClosedTimeout>
+    <GprsLastSocketActivityTimeout>-1</GprsLastSocketActivityTimeout>
+    <GprsLastSessionClosedTimeout>1</GprsLastSessionClosedTimeout>
+    <GprsLastSocketClosedTimeout>-1</GprsLastSocketClosedTimeout>
+    </Global>
+  <APs>
+      <AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <NetworkType>IPv4</NetworkType>
+      <PromptPassword>No</PromptPassword>
+      <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+      <WTLS_Security>On</WTLS_Security>
+      <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      <GprsUseEdge>Yes</GprsUseEdge>
+      <ConnectionName />
+      <ConnectionId />
+      <GPRS_AP_Name />
+      <UserName />
+      <Password />
+      <WAPGatewayIP />
+      <StartingPage />
+      <PhoneIP />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <IspType />
+      </AP>
+    <AP>
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <NetworkType>IPv4</NetworkType>
+      <PromptPassword>No</PromptPassword>
+      <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+      <WTLS_Security>On</WTLS_Security>
+      <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      <GprsUseEdge>Yes</GprsUseEdge>
+      <ConnectionName />
+      <ConnectionId />
+      <GPRS_AP_Name />
+      <UserName />
+      <Password />
+      <WAPGatewayIP />
+      <StartingPage />
+      <PhoneIP />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <IspType />
+      </AP>
+    </APs>
+  <HSCSD_APs>
+      <HSCSD_AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <PromptPassword>No</PromptPassword>
+      <PasswordAuthenticationType>Normal</PasswordAuthenticationType>
+      <WTLS_Security>On</WTLS_Security>
+      <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      <BearerSpeed>Autodetect</BearerSpeed>
+      <BearerCallTypeIsdn>Analogue</BearerCallTypeIsdn>
+      <CallbackEnabled>Yes</CallbackEnabled>
+      <CallbackType>Server Number</CallbackType>
+      <EnableSWCompression>No</EnableSWCompression>
+      <UseLoginScript>No</UseLoginScript>
+      <ConnectionName />
+      <ConnectionId />
+      <UserName />
+      <Password />
+      <WAPGatewayIP />
+      <StartingPage />
+      <PhoneIP />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <DefaultTelNumber />
+      <CallbackInfo />
+      <LoginScript />
+      <InitString />
+      </HSCSD_AP>
+    </HSCSD_APs>
+  <LAN_APs>
+      <LAN_AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>Confirm first</Seamlessness>
+      <WTLS_Security>On</WTLS_Security>
+      <WAP_ConnectionType>Continuous</WAP_ConnectionType>
+      <ConnectionName />
+      <ConnectionId />
+      <WAPGatewayIP />
+      <StartingPage />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <LanIfNetworks />
+      <LanIpNetmask />
+      <LanIpGateway />
+      <PhoneIP />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      </LAN_AP>
+    </LAN_APs>
+  <WLAN_APs>
+      <WLAN_AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <NetworkMode>Infrastructure</NetworkMode>
+      <SecurityMode>Open</SecurityMode>
+      <WLANScanSSID>No</WLANScanSSID>
+      <WEPKeyInUse>key1</WEPKeyInUse>
+      <WEPAuthType>Shared</WEPAuthType>
+      <WEPKey1Length>64</WEPKey1Length>
+      <WEPKey1Format>ASCII</WEPKey1Format>
+      <WEPKey2Length>64</WEPKey2Length>
+      <WEPKey2Format>ASCII</WEPKey2Format>
+      <WEPKey3Length>64</WEPKey3Length>
+      <WEPKey3Format>ASCII</WEPKey3Format>
+      <WEPKey4Length>64</WEPKey4Length>
+      <WEPKey4Format>ASCII</WEPKey4Format>
+      <WPAUseOfPresharedKey>No</WPAUseOfPresharedKey>
+      <WPAKeyLength>0</WPAKeyLength>
+      <ConnectionName />
+      <ConnectionId />
+      <NetworkName />
+      <StartingPage />
+      <PrimaryNameServer />
+      <SecondaryNameServer />
+      <PrimaryIP6NameServer />
+      <SecondaryIP6NameServer />
+      <WlanIpGatewayAddress />
+      <WlanIpNetMask />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <WlanChannelId />
+      <PhoneIP />
+      <WEPKey1Data />
+      <WEPKey2Data />
+      <WEPKey3Data />
+      <WEPKey4Data />
+      <WPAPresharedKey />
+      <WPAListOfEAPs />
+      <EapGtcUsername />
+      <EapGtcSessionValidityTime />
+      <EapGtcEncapsulation />
+      <EapTlsUsername />
+      <EapTlsRealm />
+      <EapTlsVerifyServerRealm />
+      <EapTlsRequireClientAuth />
+      <EapTlsSessionValidityTime />
+      <EapTlsCipherSuites />
+      <EapTlsUserCertSubjectKeyId />
+      <EapTlsUserCertIssuerName />
+      <EapTlsUserCertSerialNumber />
+      <EapTlsCaCertSubjectKeyId />
+      <EapTlsCaCertIssuerName />
+      <EapTlsCaCertSerialNumber />
+      <EapTlsEncapsulation />
+      <EapLeapUsername />
+      <EapLeapPassword />
+      <EapLeapSessionValidityTime />
+      <EapSimUsername />
+      <EapSimRealm />
+      <EapSimUsePseudonyms />
+      <EapSimSessionValidityTime />
+      <EapSimEncapsulation />
+      <EapTtlsUsername />
+      <EapTtlsRealm />
+      <EapTtlsVerifyServerRealm />
+      <EapTtlsRequireClientAuth />
+      <EapTtlsSessionValidityTime />
+      <EapTtlsCipherSuites />
+      <EapTtlsEncapsulatedTypes />
+      <EapTtlsUserCertSubjectKeyId />
+      <EapTtlsUserCertIssuerName />
+      <EapTtlsUserCertSerialNumber />
+      <EapTtlsCaCertSubjectKeyId />
+      <EapTtlsCaCertIssuerName />
+      <EapTtlsCaCertSerialNumber />
+      <EapAkaUsername />
+      <EapAkaRealm />
+      <EapAkaUsePseudonyms />
+      <EapAkaSessionValidityTime />
+      <EapAkaEncapsulation />
+      <EapPeapUsername />
+      <EapPeapRealm />
+      <EapPeapVerifyServerRealm />
+      <EapPeapRequireClientAuth />
+      <EapPeapSessionValidityTime />
+      <EapPeapCipherSuites />
+      <EapPeapV0Allowed />
+      <EapPeapV1Allowed />
+      <EapPeapV2Allowed />
+      <EapPeapEncapsulatedTypes />
+      <EapPeapUserCertSubjectKeyId />
+      <EapPeapUserCertIssuerName />
+      <EapPeapUserCertSerialNumber />
+      <EapPeapCaCertSubjectKeyId />
+      <EapPeapCaCertIssuerName />
+      <EapPeapCaCertSerialNumber />
+      <EapMschapv2Username />
+      <EapMschapv2Password />
+      <EapMschapv2SessionValidityTime />
+      <EapMschapv2Encapsulation />
+      <EapFastUsername />
+      <EapFastRealm />
+      <EapFastVerifyServerRealm />
+      <EapFastRequireClientAuth />
+      <EapFastSessionValidityTime />
+      <EapFastCipherSuites />
+      <EapFastEncapsulatedTypes />
+      <EapFastAuthProvModeAllowed />
+      <EapFastUnauthProvModeAllowed />
+      <EapFastWarnADHPNoPAC />
+      <EapFastWarnADHPNoMatchingPAC />
+      <EapFastWarnNotDefaultServer />
+      <EapFastUserCertSubjectKeyId />
+      <EapFastUserCertIssuerName />
+      <EapFastUserCertSerialNumber />
+      <EapFastCaCertSubjectKeyId />
+      <EapFastCaCertIssuerName />
+      <EapFastCaCertSerialNumber />
+      <Mschapv2Username />
+      <Mschapv2Password />
+      <Mschapv2SessionValidityTime />
+      <Mschapv2Encapsulation />
+      </WLAN_AP>
+    </WLAN_APs>
+  <VPN_APs>
+      <VPN_AP template="true">
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <ConnectionName />
+      <ConnectionId />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <IAP_Name />
+      <ServicePolicy />
+      </VPN_AP>
+    <VPN_AP>
+        <Protected>No</Protected>
+      <Hidden>No</Hidden>
+      <HiddenAgent>No</HiddenAgent>
+      <Highlighted>No</Highlighted>
+      <Seamlessness>ConfirmFirst</Seamlessness>
+      <ConnectionName />
+      <ConnectionId />
+      <ProxyServerAddress />
+      <ProxyPortNumber />
+      <ProxyProtocolName />
+      <IAP_Name />
+      <ServicePolicy />
+      </VPN_AP>
+    </VPN_APs>
+  <KCRUidCommsDatCreator>
+      <KCommsDatCreatorStartupStatus>0</KCommsDatCreatorStartupStatus>
+    </KCRUidCommsDatCreator>
+  </data>
+<rfs>
+    <KCRUidCommsDatCreator>
+      <KCommsDatCreatorStartupStatus>false</KCommsDatCreatorStartupStatus>
+    <KCommsDatCreatorInputFileName>false</KCommsDatCreatorInputFileName>
+    </KCRUidCommsDatCreator>
+  </rfs>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/comparison_operators.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,62 @@
+<configuration name="Arithmetic operation test" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="Test settings for comparison operators" ref="CompOperTest">
+    <setting name="Value zero" ref="Zero" type="int" />
+    <setting name="Value one" ref="One" type="int" />
+    <setting name="Value two" ref="Two" type="int" />
+    
+    <setting name="Literals result" ref="LiteralsResult1" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult2" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult3" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult4" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult5" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult6" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult7" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult8" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult9" type="boolean" />
+    <setting name="Literals result" ref="LiteralsResult10" type="boolean" />
+    
+    <setting name="Refs result" ref="RefsResult1" type="boolean" />
+    <setting name="Refs result" ref="RefsResult2" type="boolean" />
+    <setting name="Refs result" ref="RefsResult3" type="boolean" />
+    <setting name="Refs result" ref="RefsResult4" type="boolean" />
+    <setting name="Refs result" ref="RefsResult5" type="boolean" />
+    <setting name="Refs result" ref="RefsResult6" type="boolean" />
+    <setting name="Refs result" ref="RefsResult7" type="boolean" />
+    <setting name="Refs result" ref="RefsResult8" type="boolean" />
+    <setting name="Refs result" ref="RefsResult9" type="boolean" />
+    <setting name="Refs result" ref="RefsResult10" type="boolean" />
+
+
+  </feature>
+  
+  <data>
+    <CompOperTest>
+      <Zero>0</Zero>
+      <One>1</One>
+      <Two>2</Two>
+      
+      <LiteralsResult1>0</LiteralsResult1>
+      <LiteralsResult2>0</LiteralsResult2>
+      <LiteralsResult3>0</LiteralsResult3>
+      <LiteralsResult4>0</LiteralsResult4>
+      <LiteralsResult5>0</LiteralsResult5>
+      <LiteralsResult6>0</LiteralsResult6>
+      <LiteralsResult7>0</LiteralsResult7>
+      <LiteralsResult8>0</LiteralsResult8>
+      <LiteralsResult9>0</LiteralsResult9>
+      <LiteralsResult10>0</LiteralsResult10>
+      
+      <RefsResult1>0</RefsResult1>
+      <RefsResult2>0</RefsResult2>
+      <RefsResult3>0</RefsResult3>
+      <RefsResult4>0</RefsResult4>
+      <RefsResult5>0</RefsResult5>
+      <RefsResult6>0</RefsResult6>
+      <RefsResult7>0</RefsResult7>
+      <RefsResult8>0</RefsResult8>
+      <RefsResult9>0</RefsResult9>
+      <RefsResult10>0</RefsResult10>
+      
+    </CompOperTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/eval.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,83 @@
+<configuration name="Eval test data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature ref="EvalTest" name="Test settings for eval blocks">
+  
+    <setting ref="StringLenResult" name="String length result" type="int" />
+    <setting ref="EvalConstantResult" name="Result set from an eval global constant" type="int" />
+	<setting ref="EvalFileImport" name="Result set from an imported pyfile" type="int" />
+    <setting ref="UnchangedValue" name="Value that should remain unchanged" type="int" />
+    <setting ref="UnicodeResult1" name="Result set with an eval block using characters outside the ASCII range" type="string" />
+    <setting ref="UnicodeResult2" name="Result set with an eval block using characters outside the ASCII range" type="string" />
+    
+    <setting ref="Bitmask" name="Bitmask int setting" type="int" />
+    
+    <setting ref="Bit0Result" name="Bitmask bit 0 result" type="boolean"/>
+    <setting ref="Bit1Result" name="Bitmask bit 1 result" type="boolean"/>
+    <setting ref="Bit2Result" name="Bitmask bit 2 result" type="boolean"/>
+    <setting ref="Bit3Result" name="Bitmask bit 3 result" type="boolean"/>
+    
+    <setting ref="EvalBuiltinResult" name="String value set from eval using the built-in configuration member" type="string"/>
+    
+    <setting ref="StrippedSequence" name="Stripped sequence" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int"/>
+    </setting>
+    
+    <setting ref="FullSequence" name="Full sequence" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int"/>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real"/>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <EvalTest>
+      <StringLenResult>0</StringLenResult>
+      <EvalConstantResult>0</EvalConstantResult>
+      <EvalFileImport></EvalFileImport>
+      <UnchangedValue>0</UnchangedValue>
+      <UnicodeResult1></UnicodeResult1>
+      <UnicodeResult2></UnicodeResult2>
+      
+      <Bitmask>10</Bitmask>
+      <Bit0Result>false</Bit0Result>
+      <Bit1Result>false</Bit1Result>
+      <Bit2Result>false</Bit2Result>
+      <Bit3Result>false</Bit3Result>
+      
+      <EvalBuiltinResult></EvalBuiltinResult>
+      
+      <StrippedSequence template="true">
+        <StringSubSetting>Default</StringSubSetting>
+        <IntSubSetting>0</IntSubSetting>
+      </StrippedSequence>
+      <StrippedSequence>
+        <StringSubSetting>Stripped 1</StringSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+      </StrippedSequence>
+      <StrippedSequence>
+        <StringSubSetting>Stripped 2</StringSubSetting>
+        <IntSubSetting>2</IntSubSetting>
+      </StrippedSequence>
+      
+      <FullSequence template="true">
+        <StringSubSetting>Default</StringSubSetting>
+        <IntSubSetting>0</IntSubSetting>
+        <RealSubSetting>0.5</RealSubSetting>
+        <IntSubSetting>false</IntSubSetting>
+      </FullSequence>
+      <FullSequence>
+        <StringSubSetting>Full 1</StringSubSetting>
+        <IntSubSetting>10</IntSubSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <BooleanSubSetting>true</BooleanSubSetting>
+      </FullSequence>
+      <FullSequence>
+        <StringSubSetting>Full 2</StringSubSetting>
+        <IntSubSetting>20</IntSubSetting>
+        <RealSubSetting>2.5</RealSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+      </FullSequence>
+    </EvalTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/filename_testdata.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+<configuration name="Filenamejoin test" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="Filenamejoin rule test" ref="FilenamejoinTest">
+  
+    <setting name="Folder setting 1" ref="Folder1" type="folder">
+      <localPath/>
+    </setting>
+    <setting name="File setting 1" ref="File1" type="file">
+      <localPath/>
+    </setting>
+    <setting name="String setting 1" ref="String1" type="string"/>
+    
+    <setting name="Result 1" ref="Result1" type="string"/>
+    <setting name="Result 2" ref="Result2" type="string"/>
+    <setting name="Result 3" ref="Result3" type="string"/>
+    <setting name="Result 4" ref="Result4" type="string"/>
+    <setting name="Result 5" ref="Result5" type="string"/>
+    <setting name="Result 6" ref="Result6" type="string"/>
+    <setting name="Result 7" ref="Result7" type="string"/>
+    <setting name="Result 8" ref="Result8" type="string"/>
+    <setting name="Result 9" ref="Result9" type="string"/>
+	<setting name="Result 10" ref="Result10" type="string"/>
+	<setting name="Result 11" ref="Result11" type="string"/>
+  </feature>
+  <data>
+    <FilenamejoinTest>
+      <Folder1><localPath>some/folder1</localPath></Folder1>
+      <File1><localPath>sounds/file1.txt</localPath></File1>
+      <String1>Z:\\data\\sound.mp3</String1>
+      
+      <Result1>x</Result1>
+      <Result2>x</Result2>
+      <Result3>x</Result3>
+      <Result4>x</Result4>
+      <Result5>x</Result5>
+      <Result6>x</Result6>
+      <Result7>x</Result7>
+      <Result8>x</Result8>
+      <Result9>x</Result9>
+	  <Result10>x</Result10>
+      <Result11>x</Result11>
+    </FilenamejoinTest>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/confml/testdata.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration name="imaker interface" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <feature name="iMaker Image creation" ref="imaker">
+    <setting name="IMAGE_TARGET" ref="imagetarget" type="selection">
+      <option name="core" value="0" />
+    <option name="rofs2" value="1" />
+    <option name="rofs3" value="2" />
+    <option name="rofs4" value="3" />
+    <option name="uda" value="4" />
+    <option name="rofs3_uda" value="4" />
+    </setting>
+  <setting name="iMaker api makefile" ref="makefilename" type="string" />
+  </feature>
+<feature name="iMaker API" ref="imakerapi">
+    <setting name="IMAGE_TYPE" ref="imagetype" type="selection">
+      <option name="rnd" value="0" />
+    <option name="subcon" value="1" />
+    <option name="prd" value="2" />
+    </setting>
+  <setting name="ROFS3_VERSION" ref="rofs3version" type="string" />
+  <setting name="PRODUCT_NAME" ref="productname" type="string" />
+  <setting name="OUTPUT_LOCATION" ref="outputLocation" type="string" />
+  <setting name="OUTPUT_LOCATIONY" ref="outputLocationY" type="string" />
+  </feature>
+<feature name="ar operations" ref="operations">
+    <setting name="MINUS" ref="minus" type="int" />
+  <setting name="MINUS1" ref="minus1" type="int" />
+  <setting name="MINUS2" ref="minus2" type="int" />
+  <setting name="MINUS3" ref="minus3" type="int" />
+  <setting name="MINUS4" ref="minus4" type="int" />
+  <setting name="MINUS5" ref="minus5" type="int" />
+  <setting name="MINUS6" ref="minus6" type="int" />
+  <setting name="MINUS7" ref="minus7" type="int" />
+  <setting name="MINUS8" ref="minus8" type="int" />
+  </feature>
+<feature name="String concatenation test" ref="StringConcatenationTest">
+    <setting name="Value 1" ref="Value1" type="string" />
+  <setting name="Value 2" ref="Value2" type="string" />
+  <setting name="Result 1" ref="Result1" type="string" />
+  <setting name="Result 2" ref="Result2" type="string" />
+  <setting name="Result 3" ref="Result3" type="string" />
+  <setting name="Result 4" ref="Result4" type="string" />
+  <setting name="Result 5" ref="Result5" type="string" />
+  <setting name="Result 6" ref="Result6" type="string" />
+  </feature>
+<feature name="Unicode test feature" ref="ударениÑ">
+    <setting name="Unicode test setting" ref="ελληνικά" type="string" />
+  </feature>
+<data>
+    <imaker>
+      <imagetarget>2</imagetarget>
+    <makefilename>image_conf_imakerapi.mk</makefilename>
+    </imaker>
+  <imakerapi>
+      <imagetype>0</imagetype>
+    <rofs3version>V .50.2009.04.0113 RND</rofs3version>
+    <productname>myProduct</productname>
+    <outputLocation>myProduct</outputLocation>
+    <outputLocationY />
+    </imakerapi>
+  <operations>
+      <minus>5</minus>
+    <minus1>25</minus1>
+    <minus2>7</minus2>
+    <minus3>5</minus3>
+    <minus4>10</minus4>
+    <minus5>2</minus5>
+    <minus6>5</minus6>
+    <minus7>10</minus7>
+    <minus8>8</minus8>
+    </operations>
+  <StringConcatenationTest>
+      <Value1>String 1</Value1>
+    <Value2>String 2</Value2>
+    <Result1>x</Result1>
+    <Result2>x</Result2>
+    <Result3>x</Result3>
+    <Result4>x</Result4>
+    <Result5>x</Result5>
+    <Result6>x</Result6>
+    </StringConcatenationTest>
+    
+    <ударениÑ>
+      <ελληνικά>カタカナ</ελληνικά>
+    </ударениÑ>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/arithmetic.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <!-- Value1 = 5, Value2 = 20 -->
+  <rule>True configures Arithmetic.AdditionResult1 = 2 + 6</rule>
+  <rule>True configures Arithmetic.AdditionResult2 = Arithmetic.Value1 + 6</rule>
+  <rule>True configures Arithmetic.AdditionResult3 = 2 + Arithmetic.Value2</rule>
+  <rule>True configures Arithmetic.AdditionResult4 = Arithmetic.Value1 + Arithmetic.Value2</rule>
+  
+  <rule>True configures Arithmetic.SubtractionResult1 = 2 - 6</rule>
+  <rule>True configures Arithmetic.SubtractionResult2 = Arithmetic.Value1 - 6</rule>
+  <rule>True configures Arithmetic.SubtractionResult3 = 2 - Arithmetic.Value2</rule>
+  <rule>True configures Arithmetic.SubtractionResult4 = Arithmetic.Value1 - Arithmetic.Value2</rule>
+  
+  <rule>True configures Arithmetic.MultiplicationResult1 = 2 * 6</rule>
+  <rule>True configures Arithmetic.MultiplicationResult2 = Arithmetic.Value1 * 6</rule>
+  <rule>True configures Arithmetic.MultiplicationResult3 = 2 * Arithmetic.Value2</rule>
+  <rule>True configures Arithmetic.MultiplicationResult4 = Arithmetic.Value1 * Arithmetic.Value2</rule>
+  
+  <rule>True configures Arithmetic.DivisionResult1 = 6 / 2</rule>
+  <rule>True configures Arithmetic.DivisionResult2 = Arithmetic.Value2 / 4</rule>
+  <rule>True configures Arithmetic.DivisionResult3 = 10 / Arithmetic.Value1</rule>
+  <rule>True configures Arithmetic.DivisionResult4 = Arithmetic.Value2 / Arithmetic.Value1</rule>
+  
+  <rule>True configures Arithmetic.MixedResult1 = (6 / 2 + 3 * 9) - 7</rule> 
+  <rule>True configures Arithmetic.MixedResult2 = (6 / 2 + Arithmetic.Value1 * 9) - 7</rule> 
+  <rule>True configures Arithmetic.MixedResult3 = (Arithmetic.Value2 / 2 + Arithmetic.Value1 * 9) - 7</rule> 
+  <rule>True configures Arithmetic.MixedResult4 = (Arithmetic.Value2 / Arithmetic.Value1 + Arithmetic.Value1 * Arithmetic.Value1) - Arithmetic.Value2</rule> 
+  <rule>True configures Arithmetic.MixedResult5 = 4 + 6 / 2 - 3 * 9 + 10 / 5 - 8</rule>
+  
+  <rule>True configures Arithmetic.RealResult1 = 5.0 / 2.0</rule>
+  <rule>True configures Arithmetic.RealResult2 = Arithmetic.RealValue1 / 2</rule>
+  <rule>True configures Arithmetic.RealResult3 = 0.25 * Arithmetic.RealValue2</rule>
+  <rule>True configures Arithmetic.RealResult4 = Arithmetic.RealValue1 / 2.0 * Arithmetic.RealValue2</rule>
+  
+  <rule>True configures Arithmetic.RealCalcIntoIntResult = 0.25 * Arithmetic.RealValue1</rule>
+  <rule>True configures Arithmetic.IntCalcIntoRealResult = 3 * Arithmetic.Value1</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/commsdat.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>(APs.AP != []) or (VPN_APs.VPN_AP != []) configures KCRUidCommsDatCreator.KCommsDatCreatorInputFileName = 'test.xml'</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/comparison_operators.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>0 == 0 configures CompOperTest.LiteralsResult1 = true</rule>
+  <rule>0 != 1 configures CompOperTest.LiteralsResult2 = true</rule>
+  <rule>1 &lt; 2 configures CompOperTest.LiteralsResult3 = true</rule>
+  <rule>2 > 1 configures CompOperTest.LiteralsResult4 = true</rule>
+  <rule>1 &lt;= 1 configures CompOperTest.LiteralsResult5 = true</rule>
+  <rule>1 &lt;= 2 configures CompOperTest.LiteralsResult6 = true</rule>
+  <rule>1 >= 1 configures CompOperTest.LiteralsResult7 = true</rule>
+  <rule>2 >= 1 configures CompOperTest.LiteralsResult8 = true</rule>
+
+  <rule>CompOperTest.Zero == CompOperTest.Zero configures CompOperTest.RefsResult1 = true</rule>
+  <rule>CompOperTest.Zero != CompOperTest.One configures CompOperTest.RefsResult2 = true</rule>
+  <rule>CompOperTest.One &lt; CompOperTest.Two configures CompOperTest.RefsResult3 = true</rule>
+  <rule>CompOperTest.Two > CompOperTest.One configures CompOperTest.RefsResult4 = true</rule>
+  <rule>CompOperTest.One &lt;= CompOperTest.One configures CompOperTest.RefsResult5 = true</rule>
+  <rule>CompOperTest.One &lt;= CompOperTest.Two configures CompOperTest.RefsResult6 = true</rule>
+  <rule>CompOperTest.One >= CompOperTest.One configures CompOperTest.RefsResult7 = true</rule>
+  <rule>CompOperTest.Two >= CompOperTest.One configures CompOperTest.RefsResult8 = true</rule>
+</ruleml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/container_with_rules.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <container>
+        <phase name="pre"/>
+        <rules:ruleml xmlns:rules="http://www.s60.com/xml/ruleml/1">
+          <rules:rule>imaker.imagetarget configures imakerapi.outputLocation = imaker.imagetarget</rules:rule>
+          <rules:rule>True configures StringConcatenationTest.Result1 = "Test " + "test"</rules:rule>
+          <rules:rule>True configures StringConcatenationTest.Result2 = StringConcatenationTest.Value1 + " Literal 2"</rules:rule>
+        </rules:ruleml>
+    </container>
+    <container>
+        <phase name="normal"/>
+        <rules:ruleml xmlns:rules="http://www.s60.com/xml/ruleml/1">
+          <rules:rule>True configures StringConcatenationTest.Result3 = "Literal 1 " + StringConcatenationTest.Value2</rules:rule>
+          <rules:rule>True configures StringConcatenationTest.Result4 = StringConcatenationTest.Value1 + StringConcatenationTest.Value2</rules:rule>
+          <rules:rule>True configures StringConcatenationTest.Result5 = StringConcatenationTest.Value1 + " &amp; " + StringConcatenationTest.Value2</rules:rule>
+          <rules:rule>True configures StringConcatenationTest.Result6 = StringConcatenationTest.Value1 + u" € カタカナ"</rules:rule>      
+        </rules:ruleml>
+    </container>
+</container>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/eval.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>True configures EvalTest.StringLenResult = {% len("faklskjh") %}</rule>
+  <rule>True configures EvalTest.EvalConstantResult = {% SOME_VALUE %}</rule>
+  <rule>True configures EvalTest.EvalFileImport = {% do_something(SOME_VALUE) %}</rule>
+  
+  <rule>{% ${EvalTest.Bitmask} &amp; 0x1 %} configures EvalTest.Bit0Result = True</rule>
+  <rule>{% ${EvalTest.Bitmask} &amp; 0x2 %} configures EvalTest.Bit1Result = True</rule>
+  <rule>True configures EvalTest.Bit2Result = {% 
+    bool(${EvalTest.Bitmask} &amp; 0x4) 
+    %}
+    </rule>
+  
+  <rule>True configures EvalTest.Bit3Result = {% bool(${EvalTest.Bitmask} &amp; 0x8) %}</rule>
+  
+  <rule>
+    True configures EvalTest.FullSequence = {% append_stripped_seq_to_full_seq(
+        @{EvalTest.StrippedSequence},
+        @{EvalTest.FullSequence})
+    %}
+  </rule>
+  
+  <!-- The eval block here should not be executed -->
+  <rule>False configures {% @{EvalTest.UnchangedValue}.set_value(54321) %}</rule>
+  
+  <rule>True configures EvalTest.UnicodeResult1 = {% u'100€' %}</rule>
+  <rule>True configures EvalTest.UnicodeResult2 = {% @{ударениÑ.ελληνικά}.get_value() %}</rule>
+  
+  <rule>True configures EvalTest.EvalBuiltinResult = {% ruleml.configuration.get_name() %}</rule>
+  
+  <eval_globals>SOME_VALUE = 12345</eval_globals>
+  
+<eval_globals>
+def append_stripped_seq_to_full_seq(stripped_seq, full_seq):
+    stripped_values = stripped_seq.get_value()
+    full_values = full_seq.get_value()
+    for sv in stripped_values:
+        full_values.append([sv[0], sv[1], '0.1', 'false'])
+    return full_values
+</eval_globals>
+<eval_globals file="scripts/test_eval.py"/>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/filename_rules.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>True configures FilenamejoinTest.Result1 = FilenamejoinTest.String1 filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result2 = "some/content/dir/somefile.csv" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result3 = "some/content/dir/" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result4 = "some\\content\\dir\\somefile.csv" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result5 = "some\\content\\dir\\" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result6 = "Z:\\\\some\\\\content\\\\dir\\\\somefile.csv" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result7 = "Z:\\\\some\\\\content\\\\dir\\\\" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result8 = "somedir" filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True configures FilenamejoinTest.Result9 = "somedir" filenamejoin "somefile.txt"</rule>
+  <rule>True configures FilenamejoinTest.Result10 = "somedir" filenamejoin "somefile.txt" + ';' + r'Z:\\some\\dir\\' filenamejoin FilenamejoinTest.File1.localPath</rule>
+  <rule>True and FilenamejoinTest.String1==r'Z:\\data\\sound.mp3' and True configures FilenamejoinTest.Result11 = "some" + "dir" filenamejoin "somefile.txt"</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/rules.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>imaker.imagetarget configures imakerapi.outputLocation = imaker.imagetarget</rule>
+  <rule>mms.imagesize == 'large' configures pd.ref1 = True and pd.ref2 = True</rule>
+  <rule>mms.imagesize == 'small' configures pd.ref1 = False and pd.ref2 = True</rule>
+  <rule>mms.imagesize == 'extrasmall' configures pd.ref1 = False and pd.ref2 = False</rule>
+  <rule>mms.imagesize == 'extralarge' configures pd.ref1 = True and pd.ref2 = False</rule>
+  <rule>imakerapi.outputLocationY == None configures imakerapi.outputLocationY = 'hello'</rule>
+  <rule>operations.minus == 5 configures operations.minus = operations.minus1 - operations.minus2</rule>
+  <rule>operations.minus1 == 25 configures operations.minus1 = operations.minus3 * operations.minus2</rule>
+  <rule>operations.minus4 == 10 configures operations.minus4 = operations.minus4 / operations.minus5</rule>
+  <rule>operations.minus6 == 5 configures operations.minus6 = operations.minus7 + operations.minus8</rule>
+  
+  <rule>True configures StringConcatenationTest.Result1 = "Test " + "test"</rule>
+  <rule>True configures StringConcatenationTest.Result2 = StringConcatenationTest.Value1 + " Literal 2"</rule>
+  <rule>True configures StringConcatenationTest.Result3 = "Literal 1 " + StringConcatenationTest.Value2</rule>
+  <rule>True configures StringConcatenationTest.Result4 = StringConcatenationTest.Value1 + StringConcatenationTest.Value2</rule>
+  <rule>True configures StringConcatenationTest.Result5 = StringConcatenationTest.Value1 + " &amp; " + StringConcatenationTest.Value2</rule>
+  <rule>True configures StringConcatenationTest.Result6 = StringConcatenationTest.Value1 + u" € カタカナ"</rule>
+  
+  <rule>True configures ударениÑ.ελληνικά = ударениÑ.ελληνικά + u" € カタカナ"</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/implml/scripts/test_eval.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+def do_something(param):
+    return param + 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/ruleproject/rules/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="ruleml_test_config" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <xi:include href="confml/testdata.confml" />
+<xi:include href="confml/filename_testdata.confml" />
+<xi:include href="confml/arithmetic.confml" />
+<xi:include href="confml/comparison_operators.confml" />
+<xi:include href="confml/eval.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_eval.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,108 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import re
+
+import __init__
+
+from ruleplugin import ruleml, relations
+from cone.public import api, exceptions
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class MockObject(object):
+    pass
+
+class MockFeature(object):
+    def __init__(self, ref, feature_values):
+        self.ref = ref
+        self.feature_values = feature_values
+    
+    def get_value(self):
+        return self.feature_values[self.ref]
+    
+    def set_value(self, value):
+        self.feature_values[self.ref] = value
+
+class MockConfigurationContext(object):
+    def __init__(self, feature_values):
+        self.data = MockObject()
+        default_view = MockObject()
+        default_view.get_feature = lambda ref: MockFeature(ref, feature_values)
+        self.data.get_default_view = lambda: default_view
+        self.ref_eval_callback = None
+
+class MockExpression(object):
+    def __init__(self, expression):
+        self.expression = repr(expression)
+
+class TestEvalExpression(unittest.TestCase):
+    def test_extract_refs(self):
+        ee = relations.EvalExpression(
+            None, MockExpression("'%05d 0x%08X %d' % (${Feature1.Setting1}.get_value(), ${Feature1.Setting2}.get_value(), ${Feature2.Setting1}.get_value())"))
+        self.assertEquals(sorted(ee.extract_refs()), sorted(["Feature1.Setting1", "Feature1.Setting2", "Feature2.Setting1"]))
+        
+        ee = relations.EvalExpression(None, MockExpression("'%05d 0x%08X %d' % (1, 2, 3)"))
+        self.assertEquals(ee.extract_refs(), [])
+        
+        ee = relations.EvalExpression(None, MockExpression(u"${ударениÑ.ελληνικά}"))
+        self.assertEquals(ee.extract_refs(), [u'ударениÑ.ελληνικά'])
+    
+    def test_execute(self):
+        feature_values = {
+            "Feature1.Setting1":  16,
+            "Feature1.Setting2":  32,
+            "Feature2.Setting1":  64,
+            u'ударениÑ.ελληνικά': 100,
+        }
+        context = MockConfigurationContext(feature_values)
+        
+        ee = relations.EvalExpression(None,
+            MockExpression("'%05d 0x%08X %d' % (@{Feature1.Setting1}.get_value(), @{Feature1.Setting2}.get_value(), @{Feature2.Setting1}.get_value())"))
+        self.assertEquals(ee.eval(context), "00016 0x00000020 64")
+        
+        ee = relations.EvalExpression(None, MockExpression("'%05d 0x%08X %d' % (1, 2, 3)"))
+        self.assertEquals(ee.eval(context), "00001 0x00000002 3")
+        
+        ee = relations.EvalExpression(None, MockExpression(u"'%d' % @{ударениÑ.ελληνικά}.get_value()"))
+        self.assertEquals(ee.eval(context), "100")
+
+class TestReplaceEvalBlocks(unittest.TestCase):
+    def test_replace_eval_blocks(self):
+        replace = ruleml.RuleImplReader2._replace_eval_blocks
+        
+        orig = """some.setting configures x = y"""
+        self.assertEquals(replace(orig), orig)
+        
+        orig = """some.setting configures x = {% do_something(@{Fea.Set}) %}"""
+        self.assertEquals(replace(orig), """some.setting configures x = __eval__ 'do_something(@{Fea.Set})'""")
+        
+        orig = """{% 'test' %}"""
+        self.assertEquals(replace(orig), '''__eval__ "'test'"''')
+        orig = """{%'test'%}"""
+        self.assertEquals(replace(orig), '''__eval__ "'test'"''')
+        
+        orig = """{% len(@{Fea.Set}.get_value()) %} == 3 configures x = {% do_something('test') %}"""
+        self.assertEquals(replace(orig), '''__eval__ 'len(@{Fea.Set}.get_value())' == 3 configures x = __eval__ "do_something('test')"''')
+        
+        orig = u"True configures X.Y = {% len(@{ударениÑ.ελληνικά}.get_value()) %}"
+        self.assertEquals(replace(orig), u"True configures X.Y = __eval__ %r" % u"len(@{ударениÑ.ελληνικά}.get_value())")
+        
+if __name__ == "__main__":
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_parseruleml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,97 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from ruleplugin import ruleml, relations
+from cone.public import api, exceptions, utils, plugin
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+ruleml_string = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+  <rule>imaker.imagetarget configures imakerapi.outputLocation = imaker.imagetarget</rule>
+  <rule>imaker.imagename configures imakerapi.outputLocation = imaker.imagename</rule>
+</ruleml>
+'''
+
+class TestParseRuleimpl(unittest.TestCase):    
+    def setUp(self):    relations.register()
+    def tearDown(self): relations.unregister()
+    
+    def test_parse_rules(self):
+        etree = ElementTree.fromstring(ruleml_string)
+        reader = ruleml.RuleImplReader2(None, None)
+        rules = reader.parse_rules(etree)
+        self.assertTrue(isinstance(rules[0],relations.ConfigureRelation))
+        self.assertTrue(isinstance(rules[1],relations.ConfigureRelation))
+        self.assertTrue(rules[0].has_ref('imaker.imagetarget'))
+        self.assertFalse(rules[0].has_ref('imakerapi.imagename'))
+        self.assertTrue(rules[0].has_ref('imakerapi.outputLocation'))
+
+
+class TestRulemlFromFile(unittest.TestCase):
+    def setUp(self):    pass
+    def tearDown(self): relations.unregister()
+    
+    def test_create_from_file(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        config = project.get_configuration('root.confml')
+        ruleimpl = plugin.ImplFactory.get_impls_from_file('implml/rules.ruleml', config)[0]
+        relation_container = ruleimpl.get_relation_container()
+        self.assertTrue(isinstance(relation_container, plugin.RelationContainer))
+        self.assertEquals(relation_container.get_relation_count(), 17)
+
+    def test_create_from_file_with_common_container(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        config = project.get_configuration('root.confml')
+        ruleimpl = plugin.ImplFactory.get_impls_from_file('implml/container_with_rules.ruleml', config)[0]
+        relation_container = ruleimpl.get_relation_container()
+        self.assertTrue(isinstance(relation_container, plugin.RelationContainer))
+        self.assertEquals(relation_container.get_relation_count(), 7)
+
+    def test_create_from_file_filename(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        config = project.get_configuration('root.confml')
+        ruleimpl = plugin.ImplFactory.get_impls_from_file('implml/filename_rules.ruleml', config)[0]
+        relation_container = ruleimpl.get_relation_container()
+        self.assertTrue(isinstance(relation_container, plugin.RelationContainer))
+        self.assertEquals(relation_container.get_relation_count(), 11)
+
+    def test_parse_eval(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        config = project.get_configuration('root.confml')
+        ruleimpl = plugin.ImplFactory.get_impls_from_file('implml/eval.ruleml', config)[0]
+        relation_container = ruleimpl.get_relation_container()
+        self.assertTrue(isinstance(relation_container, plugin.RelationContainer))
+        self.assertEquals(relation_container.get_relation_count(), 12)
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_empty_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,73 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import logging
+
+import __init__
+
+from cone.public import exceptions,plugin,api,container
+from cone.storage import filestorage
+from ruleplugin import ruleml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'rule')
+
+class TestRuleEmptyPlugin(unittest.TestCase):    
+    def setUp(self):
+        pass
+      
+    def tearDown(self):
+        pass
+        
+        
+    def test_rule_with_empty_value1(self):
+        return
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules'), "a" ))
+        config = project.get_configuration('root.confml')
+        implcontainer = plugin.get_impl_set(config)
+        implcontainer.generate()
+        lastconfig = config.get_last_configuration()
+        self.assertEquals(lastconfig.get_path(),ruleml.RuleImpl.AUTOCONFIGURATION_CONFML)
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_ref(),'outputLocation')
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_value(),'2')
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocationY').get_value(),'hello')
+        self.assertEquals(lastconfig.get_data('operations.minus').get_value(),'18')
+        self.assertEquals(lastconfig.get_data('operations.minus1').get_value(),'35')
+        self.assertEquals(lastconfig.get_data('operations.minus4').get_value(),'5')
+        project.close()
+    
+        
+    def test_rule_with_empty_value2(self):
+        return
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'rule/config_project/platforms/customsw'), "a" ))
+        config = project.get_configuration('root.confml')
+        implcontainer = plugin.get_impl_set(config)
+        implcontainer.generate()
+        lastconfig = config.get_last_configuration()
+        self.assertEquals(lastconfig.get_data('operations.minus').get_value(),'18')
+        self.assertEquals(lastconfig.get_data('operations.minus1').get_value(),'35')
+        self.assertEquals(lastconfig.get_data('operations.minus4').get_value(),'5')
+        self.assertEquals(lastconfig.get_data('operations.minus6').get_value(),'19')
+        self.assertEquals(lastconfig.get_data('operations.string1').get_value(),'HelloWorld')
+        project.close()
+        
+        
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,85 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import logging
+import __init__
+
+from cone.public import exceptions,plugin,api,container
+from cone.storage import filestorage
+from ruleplugin import ruleml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'ruleproject')
+
+class TestRulePlugin(unittest.TestCase):    
+    def setUp(self):
+        pass
+      
+    def tearDown(self):
+        pass
+
+class TestRulePluginOnFileStorage(unittest.TestCase):    
+    def test_get_impl_container(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        config = project.get_configuration('root.confml')
+        implcontainer = plugin.get_impl_set(config, 'ruleml$')
+        impl = implcontainer.get_implementations_by_file('implml/rules.ruleml')[0]
+        
+        self.assertEquals(None, impl.get_refs())
+        self.assertEquals([], impl.list_output_files())
+
+    def test_impl_container_execute_pre_rules(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules'), "a" ))
+        config = project.get_configuration('root.confml')
+        
+        implcontainer = plugin.get_impl_set(config, 'ruleml$')
+        ruleimpl = implcontainer.get_implementations_by_file('implml/container_with_rules.ruleml')[0]
+        context = plugin.GenerationContext()
+        context.phase = "pre"
+        ruleimpl.generate(context)
+        
+        lastconfig = config.get_last_configuration()
+        self.assertEquals(lastconfig.get_path(), plugin.AUTOCONFIG_CONFML)
+        self.assertEquals(lastconfig.list_all_datas(),['imakerapi', 
+                                                       'imakerapi.outputLocation', 
+                                                       'StringConcatenationTest', 
+                                                       'StringConcatenationTest.Result1', 
+                                                       'StringConcatenationTest.Result2'])
+        
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_ref(),'outputLocation')
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_value(),'2')
+        project.close()
+
+    def test_impl_container_execute_rules(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules'), "a" ))
+        config = project.get_configuration('root.confml')
+        
+        implcontainer = plugin.get_impl_set(config, 'ruleml$')
+        implcontainer.generate()
+        
+        lastconfig = config.get_last_configuration()
+        self.assertEquals(lastconfig.get_path(), plugin.AUTOCONFIG_CONFML)
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_ref(),'outputLocation')
+        self.assertEquals(lastconfig.get_data('imakerapi.outputLocation').get_value(),'2')
+        project.close()
+        
+        
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rule_plugin_errors.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,110 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import logging
+import __init__
+
+from cone.public import exceptions,plugin,api,container
+from cone.storage import filestorage
+from ruleplugin import ruleml
+from testautomation.base_testcase import BaseTestCase
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'errorruleproject')
+
+class TestErrorReporting(BaseTestCase):
+    def setUp(self):
+        pass
+      
+    def tearDown(self):
+        pass
+    
+    def _prepare_workdir(self, workdir):
+        workdir = os.path.join(ROOT_PATH, workdir)
+        self.recreate_dir(workdir)
+        return workdir
+
+    def _prepare_log(self, log_file, level=logging.DEBUG, formatter="%(levelname)s - %(name)s - %(message)s", logger='cone'):
+        FULL_PATH = os.path.join(ROOT_PATH, "temp", log_file)
+        self.remove_if_exists(FULL_PATH)
+        self.create_dir_for_file_path(FULL_PATH)
+        
+        handler = logging.FileHandler(FULL_PATH)
+        handler.setLevel(level)
+        frm = logging.Formatter(formatter)
+        handler.setFormatter(frm)
+        logger = logging.getLogger(logger)
+        logger.addHandler(handler)
+        
+        return [FULL_PATH, handler, logger]
+    
+    def _execute_rules(self, project_location):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH, project_location)))
+        config = project.get_configuration('root.confml')
+        
+        implcontainer = plugin.get_impl_set(config, r'\.ruleml$')
+        implcontainer.get_relation_container().execute()
+        lastconfig = config.get_last_configuration()
+        project.close()
+    
+    def test_terminal_expression_repr(self):
+        log_file, handler, logger = self._prepare_log('test1.log')
+        self._execute_rules('errorruleproject/test1')
+        logger.removeHandler(handler)
+        
+        self.assert_file_does_not_contain(log_file, "<cone.public.rules.TerminalExpression object at")
+
+    def test_invalid_python_code_eval(self):
+        log_file, handler, logger = self._prepare_log('test2.log')
+        self._execute_rules('errorruleproject/test2')
+        logger.removeHandler(handler)
+        self.assert_file_contains(log_file, "INFO - cone.ruleml - Set u'EvalTest2.StringResult' = None from '-> this is invalid python code'")
+        self.assert_file_contains(log_file, "WARNING - cone.ruleml - Invalid syntax in eval: -> this is invalid python code")
+        self.assert_file_contains(log_file, "ERROR - cone.ruleml_relation_container(implml/invalid_python_eval.ruleml) - '-> this is invalid python code'")
+
+    def test_invalid_python_code_eval_globals(self):
+        log_file, handler, logger = self._prepare_log('test3.log')
+        self._execute_rules('errorruleproject/test3')
+        logger.removeHandler(handler)
+        self.assert_file_contains(log_file, "WARNING - cone.ruleml(implml/invalid_python_eval.ruleml) - Cannot import eval file: implml/scripts/test_eval.py. Exception: invalid syntax (<string>, line 17)")
+        
+    def test_invalid_file_reference_in_eval_globals_file_attribute(self):
+        log_file, handler, logger = self._prepare_log('test4.log')
+        self._execute_rules('errorruleproject/test4')
+        logger.removeHandler(handler)
+        self.assert_file_contains(log_file, "WARNING - cone.ruleml(implml/invalid_python_eval.ruleml) - Cannot import eval file: implml/scripts/not_valid_filename.py. Exception: implml/scripts/not_valid_filename.py, [Errno 2] No such file or directory:")
+        self.assert_file_contains(log_file, '/implml/scripts/not_valid_filename.py')
+    
+    def test_runtime_error_when_running_an_eval_block_inside_rule(self):
+        log_file, handler, logger = self._prepare_log('test5.log')
+        self._execute_rules('errorruleproject/test5')
+        logger.removeHandler(handler)
+
+        self.assert_file_contains(log_file, "Execution failed for eval: 7/0 <type 'exceptions.ZeroDivisionError'>: integer division or modulo by zero")
+
+    def test_references_non_existent_settings(self):
+        log_file, handler, logger = self._prepare_log('test6.log')
+        self._execute_rules('errorruleproject/test6')
+        logger.removeHandler(handler)
+        #self.assert_file_contains(log_file, "Execution failed for eval: 7/0 <type 'exceptions.ZeroDivisionError'>: integer division or modulo by zero")
+
+    
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/ruleplugin/tests/unittest_rules.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,186 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import __init__
+        
+from ruleplugin import ruleml
+from cone.public import api, plugin
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestRuleExecutes(unittest.TestCase):
+    
+    def setUp(self):
+        self.project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,'ruleproject/rules')))
+        self.config = self.project.get_configuration('root.confml')
+    
+    def tearDown(self):
+        self.project.close()
+    
+    def _execute_rules(self, impl_filter):
+        implcontainer = plugin.get_impl_set(self.config, impl_filter)
+        context = plugin.GenerationContext()
+        implcontainer.generate(context)
+        return context.results
+    
+    def test_arithmetic_operations(self):
+        self._execute_rules(r'^implml/arithmetic\.ruleml$')
+        
+        # Values used in the ConfML (the calculations are duplicated here to make
+        # the tests more readable)
+        value1 = 5
+        value2 = 20
+        config = self.config
+        self.assert_setting_equals(config, 'Arithmetic.AdditionResult1', 2 + 6)
+        self.assert_setting_equals(config, 'Arithmetic.AdditionResult2', value1 + 6)
+        self.assert_setting_equals(config, 'Arithmetic.AdditionResult3', 2 + value2)
+        self.assert_setting_equals(config, 'Arithmetic.AdditionResult4', value1 + value2)
+        
+        self.assert_setting_equals(config, 'Arithmetic.SubtractionResult1', 2 - 6)
+        self.assert_setting_equals(config, 'Arithmetic.SubtractionResult2', value1 - 6)
+        self.assert_setting_equals(config, 'Arithmetic.SubtractionResult3', 2 - value2)
+        self.assert_setting_equals(config, 'Arithmetic.SubtractionResult4', value1 - value2)
+        
+        self.assert_setting_equals(config, 'Arithmetic.MultiplicationResult1', 2 * 6)
+        self.assert_setting_equals(config, 'Arithmetic.MultiplicationResult2', value1 * 6)
+        self.assert_setting_equals(config, 'Arithmetic.MultiplicationResult3', 2 * value2)
+        self.assert_setting_equals(config, 'Arithmetic.MultiplicationResult4', value1 * value2)
+        
+        self.assert_setting_equals(config, 'Arithmetic.DivisionResult1', 6 / 2)
+        self.assert_setting_equals(config, 'Arithmetic.DivisionResult2', value2 / 4)
+        self.assert_setting_equals(config, 'Arithmetic.DivisionResult3', 10 / value1)
+        self.assert_setting_equals(config, 'Arithmetic.DivisionResult4', value2 / value1)
+        
+        self.assert_setting_equals(config, 'Arithmetic.MixedResult1', (6 / 2 + 3 * 9) - 7)
+        self.assert_setting_equals(config, 'Arithmetic.MixedResult2', (6 / 2 + value1 * 9) - 7)
+        self.assert_setting_equals(config, 'Arithmetic.MixedResult3', (value2 / 2 + value1 * 9) - 7)
+        self.assert_setting_equals(config, 'Arithmetic.MixedResult4', (value2 / value1 + value1 * value1) - value2)
+        self.assert_setting_equals(config, 'Arithmetic.MixedResult5', 4 + 6 / 2 - 3 * 9 + 10 / 5 - 8)
+        
+        rvalue1 = float(value1)
+        rvalue2 = float(value2)
+        self.assert_setting_equals(config, 'Arithmetic.RealResult1', 5.0 / 2.0)
+        self.assert_setting_equals(config, 'Arithmetic.RealResult2', rvalue1 / 2.0)
+        self.assert_setting_equals(config, 'Arithmetic.RealResult3', 0.25 * rvalue2)
+        self.assert_setting_equals(config, 'Arithmetic.RealResult4', rvalue1 / 2.0 * rvalue2)
+#
+        self.assert_setting_equals(config, 'Arithmetic.RealCalcIntoIntResult', int(0.25 * rvalue1))
+        self.assert_setting_equals(config, 'Arithmetic.IntCalcIntoRealResult', float(3 * value1))
+    
+    def test_string_concatenation(self):
+        self._execute_rules(r'^implml/rules\.ruleml$')
+        
+        config = self.config
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result1', 'Test test')
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result2', 'String 1 Literal 2')
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result3', 'Literal 1 String 2')
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result4', 'String 1String 2')
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result5', 'String 1 & String 2')
+        self.assert_setting_equals(config, 'StringConcatenationTest.Result6', u'String 1 € カタカナ')
+        
+        self.assert_setting_equals(config, u'ударениÑ.ελληνικά', u'カタカナ € カタカナ')
+        
+    
+    def test_filenamejoin(self):
+        self._execute_rules(r'^implml/filename_rules\.ruleml$')
+        
+        config = self.config
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result1', r'Z:\\data\\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result2', r'some/content/dir/file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result3', r'some/content/dir/file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result4', r'some\content\dir\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result5', r'some\content\dir\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result6', r'Z:\\some\\content\\dir\\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result7', r'Z:\\some\\content\\dir\\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result8', r'somedir/file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result9', r'somedir/somefile.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result10', r'somedir/somefile.txt;Z:\\some\\dir\\file1.txt')
+        self.assert_setting_equals(config, 'FilenamejoinTest.Result11', r'somedir/somefile.txt')
+    
+    def test_comparison_operators(self):
+        self._execute_rules(r'^implml/comparison_operators\.ruleml$')
+        
+        for i in xrange(1, 8):
+            ref = 'CompOperTest.LiteralsResult%d' % i
+            self.assert_setting_equals(self.config, ref, True, "Setting %s is not True" % ref)
+        
+        for i in xrange(1, 8):
+            ref = 'CompOperTest.RefsResult%d' % i
+            self.assert_setting_equals(self.config, ref, True, "Setting %s is not True" % ref)
+    
+    def test_eval(self):
+        config = self.config
+        
+        self.assert_setting_equals(config, 'EvalTest.FullSequence',
+            [['Full 1', '10', '1.5', 'true'],
+             ['Full 2', '20', '2.5', 'false']])
+        
+        self._execute_rules(r'^implml/eval\.ruleml$')
+        
+        self.assert_setting_equals(config, 'EvalTest.StringLenResult', 8)
+        self.assert_setting_equals(config, 'EvalTest.EvalConstantResult', 12345)
+        self.assert_setting_equals(config, 'EvalTest.EvalFileImport', 12346)
+        self.assert_setting_equals(config, 'EvalTest.UnchangedValue', 0)
+        self.assert_setting_equals(config, 'EvalTest.UnicodeResult1', u'100€')
+        self.assert_setting_equals(config, 'EvalTest.UnicodeResult2', u'カタカナ')
+        self.assert_setting_equals(config, 'EvalTest.Bit0Result', False)
+        self.assert_setting_equals(config, 'EvalTest.Bit1Result', True)
+        self.assert_setting_equals(config, 'EvalTest.Bit2Result', False)
+        self.assert_setting_equals(config, 'EvalTest.Bit3Result', True)
+        self.assert_setting_equals(config, 'EvalTest.FullSequence',
+            [['Full 1', '10', '1.5', 'true'],
+             ['Full 2', '20', '2.5', 'false'],
+             ['Stripped 1', '1', '0.1', 'false'],
+             ['Stripped 2', '2', '0.1', 'false']])
+        self.assert_setting_equals(config, 'EvalTest.EvalBuiltinResult', 'ruleml_test_config')
+    
+    def assert_setting_equals(self, config, setting, expected_value, msg=None):
+        if msg == None:
+            self.assertEquals(config.get_default_view().get_feature(setting).get_value(), expected_value)
+        else:
+            self.assertEquals(config.get_default_view().get_feature(setting).get_value(), expected_value, msg)
+    
+    def test_rule_execution_results(self):
+        results = self._execute_rules(r'^implml/rules\.ruleml$')
+        
+        def r(index, input_refs, affected_refs):
+            return plugin.RelationExecutionResult(index         = index,
+                                                  source        = 'implml/rules.ruleml',
+                                                  input_refs    = input_refs,
+                                                  affected_refs = affected_refs)
+        expected = [
+            r(1,  ['imaker.imagetarget'],         ['imakerapi.outputLocation']),
+            r(6,  ['imakerapi.outputLocationY'],  ['imakerapi.outputLocationY']),
+            r(7,  ['operations.minus'],           ['operations.minus']),
+            r(8,  ['operations.minus1'],          ['operations.minus1']),
+            r(9,  ['operations.minus4'],          ['operations.minus4']),
+            r(10, ['operations.minus6'],          ['operations.minus6']),
+            r(11, [],                             ['StringConcatenationTest.Result1']),
+            r(12, [],                             ['StringConcatenationTest.Result2']),
+            r(13, [],                             ['StringConcatenationTest.Result3']),
+            r(14, [],                             ['StringConcatenationTest.Result4']),
+            r(15, [],                             ['StringConcatenationTest.Result5']),
+            r(16, [],                             ['StringConcatenationTest.Result6']),
+            r(17, [],                             [u'ударениÑ.ελληνικά']),
+        ]
+        
+        self.assertEquals(results, expected)
+            
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeRulePlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from ruleplugin import __version__
+
+setup(
+    name = "coneruleplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "ruleplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine rule plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",   # project home page, if any
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['ruleml_1 = ruleplugin.ruleml:RuleImplReader1',
+                                                 'ruleml_2 = ruleplugin.ruleml:RuleImplReader2']}
+)
Binary file configurationengine/source/plugins/common/ConeTemplatePlugin/Jinja2-2.1.1-py2.5-win32.egg has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from templatemlplugin import __version__
+
+setup(
+    name = "conetemplateplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "plugintemplate.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Configuration Tool Template plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['templateml = templatemlplugin.templatemlplugin:TemplatemlImplReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+__all__ = ['templatemlplugin']
+
+import pkg_resources 
+import sys,os
+
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/templatemlplugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,562 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Template plugin for ConE that handles templateml files. Utilizes Jinja template engine.
+'''
+
+import re
+import os
+import sys
+import logging
+import codecs
+import xml.parsers.expat
+from jinja2 import Environment, PackageLoader, FileSystemLoader, Template, DictLoader
+import traceback
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+try:
+    from cElementTree import ElementInclude
+except ImportError:
+    try:    
+        from elementtree import ElementInclude
+    except ImportError:
+        try:
+            from xml.etree import cElementInclude as ElementInclude
+        except ImportError:
+            from xml.etree import ElementInclude
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api 
+from cone.confml import persistentconfml
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TemplatemlImpl(plugin.ImplBase):
+    
+    context = None
+    
+    """
+    Implementation class of template plugin.
+    """
+    
+    IMPL_TYPE_ID = "templateml" 
+    
+    
+    def __init__(self,ref,configuration, reader=None):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.logger = logging.getLogger('cone.templateml(%s)' % self.ref)
+        self.errors = False
+        self.reader = reader
+        if self.reader and self.reader.tags:
+            self.set_tags(self.reader.tags)
+
+    def get_context(self):
+        if TemplatemlImpl.context == None:
+            TemplatemlImpl.context = self.create_dict()
+        
+        return TemplatemlImpl.context
+    
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+
+        self.create_output()
+        return 
+    
+    def create_output(self, layers=None):
+        generator = Generator(self.reader.outputs, self.reader.filters, self.get_context(), self.configuration)
+        generator.generate(self.output, self.ref)
+        return
+    
+    def get_refs(self):
+        refs = []
+        for output in self.reader.outputs:
+            template = output.template.template
+            refs.extend(self._extract_refs_from_template(template))
+        return refs
+    
+    @classmethod
+    def _extract_refs_from_template(cls, template_text):
+        refs = []
+        pattern = re.compile(r'feat_tree\.((?:\.?\w+)*)', re.UNICODE)
+        for m in re.finditer(pattern, template_text):
+            ref = m.group(1)
+            
+            # ref may now be e.g. 'MyFeature.MySetting._value', so
+            # remove the last part if it starts with an underscore 
+            index = ref.rfind('.')
+            if index != -1 and index < len(ref) and ref[index + 1] == '_':
+                ref = ref[:index]
+            
+            refs.append(ref)
+        return refs
+    
+    def has_ref(self, refs):
+        """
+        @returns True if the implementation uses the given ref as input value.
+        Otherwise return False.
+        """
+        
+        # Does not support template inheritance
+        
+        if not isinstance(refs, list):
+            refs = [refs] 
+        
+        for output in self.reader.outputs:
+            if re.search("feat_list.*", output.template.template) != None:
+                return True
+        
+        refs_in_templates = self.get_refs()
+            
+        for ref in refs:
+            if ref in refs_in_templates:
+                return True
+        return False
+    
+    
+    def list_output_files(self):
+        """ Return a list of output files as an array. """
+        result = []
+        for output in self.reader.outputs:
+            result.append(os.path.normpath(os.path.join(self.output, output.path, output.filename)))
+        return result
+    
+    def create_dict(self):
+        """
+        Creates dict from configuration that can be passed to template engine.
+        """
+        
+        context_dict = {}
+        
+        if self.configuration:
+            dview = self.configuration.get_default_view()
+            feat_list = []
+            feat_tree = {}
+            
+            def add_feature(feature, feature_dict):
+                fea_dict = FeatureDictProxy(feature)
+                feat_list.append(fea_dict)
+                feature_dict[feature.ref] = fea_dict
+                
+                # Recursively add sub-features
+                for sfeat in feature.list_features():
+                    add_feature(feature.get_feature(sfeat), fea_dict)
+            
+            for fea in dview.list_features():
+                add_feature(dview.get_feature(fea), feat_tree)
+                
+            context_dict['feat_list'] = feat_list
+            context_dict['feat_tree'] = feat_tree
+            context_dict['configuration'] = self.configuration
+
+        return context_dict
+
+def _expand_refs(text, config):
+    if config is not None:
+        return utils.expand_refs_by_default_view(text, config.get_default_view())
+    else:
+        return text
+
+def _read_relative_file(configuration, relative_path, file_path):
+    """
+    Read data from a file relative to the given other file path.
+    """
+    # Get the actual path (relative to the current file)
+    base_path = os.path.dirname(file_path)
+    tempfile_path = os.path.normpath(os.path.join(base_path, relative_path)).replace('\\', '/')
+    
+    # Read the file
+    resource = configuration.get_resource(tempfile_path)
+    try:        return resource.read()
+    finally:    resource.close()
+
+class TemplatemlImplReader(plugin.ReaderBase):
+    """
+    Parses a single templateml file
+    """ 
+    NAMESPACE = 'http://www.s60.com/xml/templateml/1'
+    FILE_EXTENSIONS = ['templateml']
+    
+    def __init__(self, resource_ref=None, configuration=None):
+        self.desc = None
+        self.namespaces = [self.NAMESPACE]
+        self.outputs = None
+        self.filters = None
+        self.tags = None
+        self.resource_ref = resource_ref
+        self.configuration = configuration
+        
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = TemplatemlImplReader(resource_ref, configuration)
+        reader.from_elementtree(etree)
+        return TemplatemlImpl(resource_ref, configuration, reader)
+    
+    def fromstring(self, xml_string):
+        etree = ElementTree.fromstring(xml_string)
+        self.from_elementtree(etree)
+    
+    def from_elementtree(self, etree):
+        ElementInclude.include(etree)
+        self.desc = self.parse_desc(etree)
+        self.outputs = self.parse_outputs(etree)
+        self.filters = self.parse_filters(etree)
+        self.tags = self.parse_tags(etree)
+         
+    def parse_desc(self,etree):
+        desc = ""
+        desc_elem = etree.find("{%s}desc" % self.namespaces[0])
+        if desc_elem != None:
+            desc = desc_elem.text
+        return desc
+
+    def parse_filters(self, etree):
+        filters = []
+        filter_elems = etree.findall("{%s}filter" % self.namespaces[0])
+        for filter_elem in filter_elems:
+            if filter_elem != None:
+                filter = Filter()
+                
+                if filter_elem.get('name') != None:
+                    name = filter_elem.get('name')
+                    if self.configuration != None:
+                        name = utils.expand_refs_by_default_view(name, self.configuration.get_default_view())
+                    filter.set_name(name)
+                if filter_elem.get('file') != None:
+                    file = filter_elem.get('file')
+                    if self.configuration != None:
+                        file = utils.expand_refs_by_default_view(file, self.configuration.get_default_view())
+                    filter.set_path(file)
+                if filter_elem.text != None:
+                    filter.set_code(filter_elem.text)
+                    if filter_elem.get('file') != None:
+                        logging.getLogger('cone.templateml').warning("In filter element file attribute and text defined. Using filter found from file attribute.")
+                filters.append(filter)
+        return filters
+    
+    def parse_tags(self, etree):
+        tags = {}
+        for tag in etree.getiterator("{%s}tag" % self.namespaces[0]):
+            tagname = tag.get('name','')
+            tagvalue = tag.get('value')
+            values = tags.get(tagname,[])
+            values.append(tagvalue)
+            tags[tagname] = values
+        return tags
+    
+    def parse_template(self, output_elem):
+        tempfile = TempFile()
+        template_elems = output_elem.findall("{%s}template" % self.namespaces[0])
+        
+        for template_elem in template_elems:
+            if template_elem.text != None:
+                tempfile.set_template(template_elem.text)
+            else:
+                for selem in template_elem:
+                    tempfile.set_template(selem.text)
+                    
+            if template_elem.get('file') != None:
+                file = template_elem.get('file')
+                if template_elem.text != None: 
+                    logging.getLogger('cone.templateml').warning("In template element file attribute and text defined. Using template found from file attribute.")
+                template_text = _read_relative_file(self.configuration, file, self.resource_ref)
+                tempfile.set_template(template_text)
+        return tempfile
+    
+    def parse_outputs(self, etree):
+        outputs = []
+        output_elems = etree.findall("{%s}output" % self.namespaces[0])
+        for output_elem in output_elems:
+            if output_elem != None:
+                outputfile = OutputFile()
+                if output_elem.get('encoding') != None:
+                    encoding = output_elem.get('encoding')
+                    # Check the encoding
+                    try:
+                        codecs.lookup(encoding)
+                    except LookupError:
+                        raise exceptions.ParseError("Invalid output encoding: %s" % encoding)
+                    
+                    if self.configuration != None:
+                        encoding = utils.expand_refs_by_default_view(encoding, self.configuration.get_default_view())
+                    outputfile.set_encoding(encoding)
+                if output_elem.get('file') != None:
+                    file = output_elem.get('file')
+                    
+                    if self.configuration != None:
+                        file = utils.expand_refs_by_default_view(file, self.configuration.get_default_view())
+                    outputfile.set_filename(file)
+                if output_elem.get('dir') != None:
+                    dir = output_elem.get('dir')
+                    if self.configuration != None:
+                        dir = utils.expand_refs_by_default_view(dir, self.configuration.get_default_view())
+                    outputfile.set_path(dir)
+                if output_elem.get('ref'):
+                    # Fetch the output value from a configuration reference
+                    fea = self.configuration.get_default_view().get_feature(output_elem.get('ref'))
+                    outputfile.set_filename(fea.value) 
+                if output_elem.get('bom'):
+                    outputfile.bom = output_elem.get('bom').lower() in ('1', 'true', 't', 'yes', 'y')
+                outputfile.set_template(self.parse_template(output_elem))
+                outputfile.set_filters(self.parse_filters(output_elem))
+                outputs.append(outputfile)
+        return outputs
+
+class Generator(object):
+    """
+    Class that generates
+    """
+    
+    def __init__(self, outputs, filters, context, configuration=None):
+        self.outputs = outputs
+        self.filters = filters
+        self.context = context
+        self.configuration = configuration
+    
+    def generate(self, output_path, ref):
+        """ 
+        Generates output based on templates 
+        """
+        if self.outputs != None:
+        
+            for output in self.outputs:
+                try:
+                    logging.getLogger('cone.templateml').debug(output)
+                    out_path = os.path.abspath(os.path.join(output_path, output.path))
+                    if out_path != '':
+                        if not os.path.exists(out_path):
+                            os.makedirs(out_path)
+                    
+                    out_file = open(os.path.join(out_path, output.filename), 'wb')
+                    
+                    if output.template.path:
+                        output.template.template = _read_relative_file(self.configuration, output.template.path, ref)
+                    
+                    dict_loader = DictLoader({'template': output.template.template})
+                    env = Environment(loader=dict_loader)
+
+                    # Common filters
+                    for filter in self.filters:
+                        
+                        if filter.path:
+                            filter.code = _read_relative_file(self.configuration, filter.path, ref)
+                        
+                        if not filter.code:
+                            logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
+                        else:
+                            env.filters[str(filter.name)] = eval(filter.code)
+                    
+                    # Output file specific filters
+                    for filter in output.filters:
+                        if filter.path:
+                           filter.code = _read_relative_file(self.configuration, filter.path, ref)
+                        
+                        if not filter.code:
+                            logging.getLogger('cone.templateml').warning("Skipping empty filter definition.")
+                        else:
+                            env.filters[str(filter.name)] = eval(filter.code)
+                    
+                    template = env.get_template('template')
+                    
+                    file_string = template.render(self.context)
+                    out_file.write(self._encode_data(file_string, output.encoding, output.bom))
+                    out_file.close()
+                    
+                except Exception, e:
+                    logging.getLogger('cone.templateml').error('Failed to generate template: %s %s\n%s' % (type(e), e, traceback.format_exc()) )
+        else:
+            logging.getLogger('cone.templateml').info('No (valid) templates found.')
+    
+    def _encode_data(self, data, encoding, write_bom):
+        """
+        Encode the given data using the given encoding and BOM definition.
+        @param data: The data to encode.
+        @param encoding: The encoding to use.
+        @param write_bom: True or False to define whether the BOM should be written
+            for Unicode encodings, None for default.
+        """
+        data = data.encode(encoding)
+        
+        # Check if we need to do special handling for BOM
+        if write_bom is not None:
+            BOM_MAPPING = {'utf-8'      : codecs.BOM_UTF8,
+                           'utf-16'     : codecs.BOM_UTF16,
+                           'utf-16-be'  : codecs.BOM_UTF16_BE,
+                           'utf-16-le'  : codecs.BOM_UTF16_LE}
+            
+            # Use the name from a CodecInfo object to account for
+            # aliases (e.g. U8 and UTF-8 both map to utf-8)
+            codec_info = codecs.lookup(encoding)
+            if codec_info.name in BOM_MAPPING:
+                # Add or remove as necessary
+                BOM = BOM_MAPPING[codec_info.name]
+                if write_bom == True and not data.startswith(BOM):
+                    data = BOM + data
+                elif write_bom == False and data.startswith(BOM):
+                    data = data[len(BOM):]
+        return data
+        
+
+class OutputFile(object):
+    def __init__(self):
+        self.filename = ''
+        self.path = ''
+        self.encoding = "utf-8"
+        self.template = TempFile()
+        self.filters = []
+        self.bom = None
+
+    def set_filename(self, filename):
+        self.filename = filename
+    
+    def set_path(self, path):
+        self.path = path
+        
+    def set_encoding(self, encoding):
+        self.encoding = encoding
+        
+    def set_template(self, template):
+        self.template = template
+
+    def add_filter(self, filter):
+        self.filters.append(filters)
+    
+    def set_filters(self, filters):
+        self.filters = filters
+    
+    def __eq__(self, other):
+        if (self.template == other.template and self.encoding == other.encoding and self.path == other.path and self.filename == other.filename and self.filters == other.filters):
+            return True
+        return False
+    
+    def __repr__(self):
+        return "OutputFile(filename=%r, path=%r, encoding=%r, template=%r, filters=%r" % (self.filename, self.path, self.encoding, self.template, self.filters)
+
+class TempFile(object):
+    def __init__(self):
+        self.template = ""
+        self.extensions = []
+        self.filters = []
+        self.path = ''
+    
+    def set_path(self, path):
+        self.path = path
+    
+    def set_template(self, template):
+        self.template = template
+        
+    def add_extension(self, extension):
+        self.extensions.append(extension)
+        
+    def add_filter(self, filter):
+        self.filters.append(filter)
+    
+    def add_filter2(self, name, code):
+        self.filters.append(Filter(name, code))
+        
+    def __eq__(self, other):
+        if self.template == other.template and self.filters == other.filters and self.extensions == other.extensions and self.path == other.path:
+            return True
+        return False
+        
+class Filter(object):
+    def __init__(self, name, code):
+        self.name = name
+        self.code = code
+        self.path = None
+    
+    def __init__(self):
+        self.name = None
+        self.code = None
+        self.path = None
+    
+    def set_path(self, path):
+        self.path = path
+    
+    def set_name(self, name):
+        self.name = name
+    
+    def set_code(self, code):
+        self.code = code
+    
+    def __eq__(self, other):
+        if self.name == other.name and self.code == other.code and self.path == other.path:
+            return True
+        return False
+
+class FeatureDictProxy(object):
+    """
+    Proxy class that behaves like a dictionary, but loads attributes from
+    the Feature object it proxies only when they are requested.
+    """
+    def __init__(self, feature):
+        self._feature = feature
+        self._children = {}
+    
+    def _get_dict(self):
+        result = {
+            '_name'        : self._feature.name,
+            '_namespace'   : self._feature.namespace,
+            '_value'       : self._feature.get_value(),
+            '_fqr'         : self._feature.fqr,
+            '_type'        : self._feature.type}
+        for ref, obj in self._children.iteritems():
+            result[ref] = obj
+        return result
+    
+    def items(self):
+        return self._get_dict().items()
+    
+    def iteritems(self):
+        return self._get_dict().iteritems()
+    
+    def __getitem__(self, name):
+        if name == '_name':         return self._feature.name        
+        elif name == '_namespace':  return self._feature.namespace
+        elif name == '_value':      return self._feature.get_value()
+        elif name == '_fqr':        return self._feature.fqr
+        elif name == '_type':       return self._feature.type
+        else:                       return self._children[name]
+    
+    def __setitem__(self, name, value):
+        self._children[name] = value
+    
+    def __len__(self):
+        return len(self._get_dict())
+    
+    def __eq__(self, other):
+        if not isinstance(other, dict):
+            return False
+        else:
+            return self._get_dict() == other
+    
+    def __ne__(self, other):
+        return not (self == other)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/create_dict_test/expected_list.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,317 @@
+[
+{
+    '_fqr': 'Feature1',
+    '_name': 'Feature 1',
+    '_namespace': '',
+    '_type': None,
+    '_value': None,
+    'BooleanSetting': {
+            '_fqr': 'Feature1.BooleanSetting',
+            '_name': 'Boolean setting',
+            '_namespace': 'Feature1',
+            '_type': 'boolean',
+            '_value': True,
+            },
+    'FolderSetting': {
+            '_fqr': 'Feature1.FolderSetting',
+            '_name': 'Folder setting',
+            '_namespace': 'Feature1',
+            '_type': 'folder',
+            '_value': None,
+            'localPath': {
+                    '_fqr': 'Feature1.FolderSetting.localPath',
+                    '_name': 'localPath',
+                    '_namespace': 'Feature1.FolderSetting',
+                    '_type': 'string',
+                    '_value': 'default_folder',
+                    },
+            'targetPath': {
+                    '_fqr': 'Feature1.FolderSetting.targetPath',
+                    '_name': 'targetPath',
+                    '_namespace': 'Feature1.FolderSetting',
+                    '_type': 'string',
+                    '_value': None,
+                    },
+            },
+    'IntSetting': {
+            '_fqr': 'Feature1.IntSetting',
+            '_name': 'Int setting',
+            '_namespace': 'Feature1',
+            '_type': 'int',
+            '_value': 10,
+            },
+    'SequenceSetting': {
+            '_fqr': 'Feature1.SequenceSetting',
+            '_name': 'Sequence setting',
+            '_namespace': 'Feature1',
+            '_type': 'sequence',
+            '_value': [[['seq/file1.txt', None], 'false', 'item 1']],
+            'BooleanSubSetting': {
+                    '_fqr': 'Feature1.SequenceSetting.BooleanSubSetting',
+                    '_name': 'Boolean sub-setting',
+                    '_namespace': 'Feature1.SequenceSetting',
+                    '_type': 'boolean',
+                    '_value': ['false'],
+                    },
+            'FileSubSetting': {
+                    '_fqr': 'Feature1.SequenceSetting.FileSubSetting',
+                    '_name': 'File sub-setting',
+                    '_namespace': 'Feature1.SequenceSetting',
+                    '_type': 'file',
+                    '_value': [['seq/file1.txt', None]],
+                    'localPath': {
+                            '_fqr': 'Feature1.SequenceSetting.FileSubSetting.localPath',
+                            '_name': 'localPath',
+                            '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                            '_type': 'string',
+                            '_value': ['seq/file1.txt'],
+                            },
+                    'targetPath': {
+                            '_fqr': 'Feature1.SequenceSetting.FileSubSetting.targetPath',
+                            '_name': 'targetPath',
+                            '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                            '_type': 'string',
+                            '_value': [None],
+                            },
+                    },
+            'StringSubSetting': {
+                    '_fqr': 'Feature1.SequenceSetting.StringSubSetting',
+                    '_name': 'String sub-setting',
+                    '_namespace': 'Feature1.SequenceSetting',
+                    '_type': 'string',
+                    '_value': ['item 1'],
+                    },
+            },
+    'StringSetting': {
+            '_fqr': 'Feature1.StringSetting',
+            '_name': 'String setting',
+            '_namespace': 'Feature1',
+            '_type': 'string',
+            '_value': 'default string',
+            },
+    },
+{
+    '_fqr': 'Feature1.FolderSetting',
+    '_name': 'Folder setting',
+    '_namespace': 'Feature1',
+    '_type': 'folder',
+    '_value': None,
+    'localPath': {
+            '_fqr': 'Feature1.FolderSetting.localPath',
+            '_name': 'localPath',
+            '_namespace': 'Feature1.FolderSetting',
+            '_type': 'string',
+            '_value': 'default_folder',
+            },
+    'targetPath': {
+            '_fqr': 'Feature1.FolderSetting.targetPath',
+            '_name': 'targetPath',
+            '_namespace': 'Feature1.FolderSetting',
+            '_type': 'string',
+            '_value': None,
+            },
+    },
+{
+    '_fqr': 'Feature1.FolderSetting.localPath',
+    '_name': 'localPath',
+    '_namespace': 'Feature1.FolderSetting',
+    '_type': 'string',
+    '_value': 'default_folder',
+    },
+{
+    '_fqr': 'Feature1.FolderSetting.targetPath',
+    '_name': 'targetPath',
+    '_namespace': 'Feature1.FolderSetting',
+    '_type': 'string',
+    '_value': None,
+    },
+{
+    '_fqr': 'Feature1.IntSetting',
+    '_name': 'Int setting',
+    '_namespace': 'Feature1',
+    '_type': 'int',
+    '_value': 10,
+    },
+{
+    '_fqr': 'Feature1.StringSetting',
+    '_name': 'String setting',
+    '_namespace': 'Feature1',
+    '_type': 'string',
+    '_value': 'default string',
+    },
+{
+    '_fqr': 'Feature1.BooleanSetting',
+    '_name': 'Boolean setting',
+    '_namespace': 'Feature1',
+    '_type': 'boolean',
+    '_value': True,
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting',
+    '_name': 'Sequence setting',
+    '_namespace': 'Feature1',
+    '_type': 'sequence',
+    '_value': [[['seq/file1.txt', None], 'false', 'item 1']],
+    'BooleanSubSetting': {
+            '_fqr': 'Feature1.SequenceSetting.BooleanSubSetting',
+            '_name': 'Boolean sub-setting',
+            '_namespace': 'Feature1.SequenceSetting',
+            '_type': 'boolean',
+            '_value': ['false'],
+            },
+    'FileSubSetting': {
+            '_fqr': 'Feature1.SequenceSetting.FileSubSetting',
+            '_name': 'File sub-setting',
+            '_namespace': 'Feature1.SequenceSetting',
+            '_type': 'file',
+            '_value': [['seq/file1.txt', None]],
+            'localPath': {
+                    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.localPath',
+                    '_name': 'localPath',
+                    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                    '_type': 'string',
+                    '_value': ['seq/file1.txt'],
+                    },
+            'targetPath': {
+                    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.targetPath',
+                    '_name': 'targetPath',
+                    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                    '_type': 'string',
+                    '_value': [None],
+                    },
+            },
+    'StringSubSetting': {
+            '_fqr': 'Feature1.SequenceSetting.StringSubSetting',
+            '_name': 'String sub-setting',
+            '_namespace': 'Feature1.SequenceSetting',
+            '_type': 'string',
+            '_value': ['item 1'],
+            },
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting.FileSubSetting',
+    '_name': 'File sub-setting',
+    '_namespace': 'Feature1.SequenceSetting',
+    '_type': 'file',
+    '_value': [['seq/file1.txt', None]],
+    'localPath': {
+            '_fqr': 'Feature1.SequenceSetting.FileSubSetting.localPath',
+            '_name': 'localPath',
+            '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+            '_type': 'string',
+            '_value': ['seq/file1.txt'],
+            },
+    'targetPath': {
+            '_fqr': 'Feature1.SequenceSetting.FileSubSetting.targetPath',
+            '_name': 'targetPath',
+            '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+            '_type': 'string',
+            '_value': [None],
+            },
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.localPath',
+    '_name': 'localPath',
+    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+    '_type': 'string',
+    '_value': ['seq/file1.txt'],
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.targetPath',
+    '_name': 'targetPath',
+    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+    '_type': 'string',
+    '_value': [None],
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting.BooleanSubSetting',
+    '_name': 'Boolean sub-setting',
+    '_namespace': 'Feature1.SequenceSetting',
+    '_type': 'boolean',
+    '_value': ['false'],
+    },
+{
+    '_fqr': 'Feature1.SequenceSetting.StringSubSetting',
+    '_name': 'String sub-setting',
+    '_namespace': 'Feature1.SequenceSetting',
+    '_type': 'string',
+    '_value': ['item 1'],
+    },
+{
+    '_fqr': 'Feature2',
+    '_name': 'Feature 2',
+    '_namespace': '',
+    '_type': None,
+    '_value': None,
+    'SequenceSetting': {
+            '_fqr': 'Feature2.SequenceSetting',
+            '_name': 'Sequence setting',
+            '_namespace': 'Feature2',
+            '_type': 'sequence',
+            '_value': [['1', 'seq1 2 item 1']],
+            'IntSubSetting': {
+                    '_fqr': 'Feature2.SequenceSetting.IntSubSetting',
+                    '_name': 'Int sub-setting',
+                    '_namespace': 'Feature2.SequenceSetting',
+                    '_type': 'int',
+                    '_value': ['1'],
+                    },
+            'StringSubSetting': {
+                    '_fqr': 'Feature2.SequenceSetting.StringSubSetting',
+                    '_name': 'String sub-setting',
+                    '_namespace': 'Feature2.SequenceSetting',
+                    '_type': 'string',
+                    '_value': ['seq1 2 item 1'],
+                    },
+            },
+    'StringSetting': {
+            '_fqr': 'Feature2.StringSetting',
+            '_name': 'String setting',
+            '_namespace': 'Feature2',
+            '_type': 'string',
+            '_value': 'feature 2 string',
+            },
+    },
+{
+    '_fqr': 'Feature2.StringSetting',
+    '_name': 'String setting',
+    '_namespace': 'Feature2',
+    '_type': 'string',
+    '_value': 'feature 2 string',
+    },
+{
+    '_fqr': 'Feature2.SequenceSetting',
+    '_name': 'Sequence setting',
+    '_namespace': 'Feature2',
+    '_type': 'sequence',
+    '_value': [['1', 'seq1 2 item 1']],
+    'IntSubSetting': {
+            '_fqr': 'Feature2.SequenceSetting.IntSubSetting',
+            '_name': 'Int sub-setting',
+            '_namespace': 'Feature2.SequenceSetting',
+            '_type': 'int',
+            '_value': ['1'],
+            },
+    'StringSubSetting': {
+            '_fqr': 'Feature2.SequenceSetting.StringSubSetting',
+            '_name': 'String sub-setting',
+            '_namespace': 'Feature2.SequenceSetting',
+            '_type': 'string',
+            '_value': ['seq1 2 item 1'],
+            },
+    },
+{
+    '_fqr': 'Feature2.SequenceSetting.IntSubSetting',
+    '_name': 'Int sub-setting',
+    '_namespace': 'Feature2.SequenceSetting',
+    '_type': 'int',
+    '_value': ['1'],
+    },
+{
+    '_fqr': 'Feature2.SequenceSetting.StringSubSetting',
+    '_name': 'String sub-setting',
+    '_namespace': 'Feature2.SequenceSetting',
+    '_type': 'string',
+    '_value': ['seq1 2 item 1'],
+    },
+]
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/create_dict_test/expected_tree.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,128 @@
+{
+    'Feature1': {
+            '_fqr': 'Feature1',
+            '_name': 'Feature 1',
+            '_namespace': '',
+            '_type': None,
+            '_value': None,
+            'BooleanSetting': {
+                    '_fqr': 'Feature1.BooleanSetting',
+                    '_name': 'Boolean setting',
+                    '_namespace': 'Feature1',
+                    '_type': 'boolean',
+                    '_value': True,
+                    },
+            'FolderSetting': {
+                    '_fqr': 'Feature1.FolderSetting',
+                    '_name': 'Folder setting',
+                    '_namespace': 'Feature1',
+                    '_type': 'folder',
+                    '_value': None,
+                    'localPath': {
+                            '_fqr': 'Feature1.FolderSetting.localPath',
+                            '_name': 'localPath',
+                            '_namespace': 'Feature1.FolderSetting',
+                            '_type': 'string',
+                            '_value': 'default_folder',
+                            },
+                    'targetPath': {
+                            '_fqr': 'Feature1.FolderSetting.targetPath',
+                            '_name': 'targetPath',
+                            '_namespace': 'Feature1.FolderSetting',
+                            '_type': 'string',
+                            '_value': None,
+                            },
+                    },
+            'IntSetting': {
+                    '_fqr': 'Feature1.IntSetting',
+                    '_name': 'Int setting',
+                    '_namespace': 'Feature1',
+                    '_type': 'int',
+                    '_value': 10,
+                    },
+            'SequenceSetting': {
+                    '_fqr': 'Feature1.SequenceSetting',
+                    '_name': 'Sequence setting',
+                    '_namespace': 'Feature1',
+                    '_type': 'sequence',
+                    '_value': [[['seq/file1.txt', None], 'false', 'item 1']],
+                    'BooleanSubSetting': {
+                            '_fqr': 'Feature1.SequenceSetting.BooleanSubSetting',
+                            '_name': 'Boolean sub-setting',
+                            '_namespace': 'Feature1.SequenceSetting',
+                            '_type': 'boolean',
+                            '_value': ['false'],
+                            },
+                    'FileSubSetting': {
+                            '_fqr': 'Feature1.SequenceSetting.FileSubSetting',
+                            '_name': 'File sub-setting',
+                            '_namespace': 'Feature1.SequenceSetting',
+                            '_type': 'file',
+                            '_value': [['seq/file1.txt', None]],
+                            'localPath': {
+                                    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.localPath',
+                                    '_name': 'localPath',
+                                    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                                    '_type': 'string',
+                                    '_value': ['seq/file1.txt'],
+                                    },
+                            'targetPath': {
+                                    '_fqr': 'Feature1.SequenceSetting.FileSubSetting.targetPath',
+                                    '_name': 'targetPath',
+                                    '_namespace': 'Feature1.SequenceSetting.FileSubSetting',
+                                    '_type': 'string',
+                                    '_value': [None],
+                                    },
+                            },
+                    'StringSubSetting': {
+                            '_fqr': 'Feature1.SequenceSetting.StringSubSetting',
+                            '_name': 'String sub-setting',
+                            '_namespace': 'Feature1.SequenceSetting',
+                            '_type': 'string',
+                            '_value': ['item 1'],
+                            },
+                    },
+            'StringSetting': {
+                    '_fqr': 'Feature1.StringSetting',
+                    '_name': 'String setting',
+                    '_namespace': 'Feature1',
+                    '_type': 'string',
+                    '_value': 'default string',
+                    },
+            },
+    'Feature2': {
+            '_fqr': 'Feature2',
+            '_name': 'Feature 2',
+            '_namespace': '',
+            '_type': None,
+            '_value': None,
+            'SequenceSetting': {
+                    '_fqr': 'Feature2.SequenceSetting',
+                    '_name': 'Sequence setting',
+                    '_namespace': 'Feature2',
+                    '_type': 'sequence',
+                    '_value': [['1', 'seq1 2 item 1']],
+                    'IntSubSetting': {
+                            '_fqr': 'Feature2.SequenceSetting.IntSubSetting',
+                            '_name': 'Int sub-setting',
+                            '_namespace': 'Feature2.SequenceSetting',
+                            '_type': 'int',
+                            '_value': ['1'],
+                            },
+                    'StringSubSetting': {
+                            '_fqr': 'Feature2.SequenceSetting.StringSubSetting',
+                            '_name': 'String sub-setting',
+                            '_namespace': 'Feature2.SequenceSetting',
+                            '_type': 'string',
+                            '_value': ['seq1 2 item 1'],
+                            },
+                    },
+            'StringSetting': {
+                    '_fqr': 'Feature2.StringSetting',
+                    '_name': 'String setting',
+                    '_namespace': 'Feature2',
+                    '_type': 'string',
+                    '_value': 'feature 2 string',
+                    },
+            },
+    }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1">
+    <desc>Feature with all setting types</desc>
+    <setting ref="FolderSetting" name="Folder setting" type="folder">
+      <desc>A folder setting</desc>
+    </setting>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="FileSetting" name="File setting" type="file">
+      <desc>A file setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <desc>A folder sub-setting</desc>
+      </setting>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <desc>A file sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+    
+    <setting ref="UnicodeValueSetting" name="String for unicode value test" type="string"/>
+  </feature>
+  <data>
+    <Feature1>
+      <FolderSetting>default_folder</FolderSetting>
+      <RealSetting>3.14</RealSetting>
+      <FileSetting>default_file.txt</FileSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>John Doe</StringSetting>
+	  <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <FolderSubSetting>seq/default_folder</FolderSubSetting>
+        <RealSubSetting>1.0</RealSubSetting>
+        <FileSubSetting>seq/default_file.txt</FileSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def1_folder</FolderSubSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <FileSubSetting>seq/def1_file.txt</FileSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def2_folder</FolderSubSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <FileSubSetting>seq/def2_file.txt</FileSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      
+      <UnicodeValueSetting>カタカナ</UnicodeValueSetting>
+    </Feature1>
+    
+  </data>
+</configuration>
Binary file configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/confml/output_define.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="output" name="Output">
+    <setting ref="filename" name="Output filename" type="string">
+    </setting>
+  </feature>
+  <data>
+    <output>
+      <filename>confmlref_filename.txt</filename>
+    </output>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/access_configuration.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+<output file="access_configuration.txt" encoding="UTF-8">
+<template>Configuration name: {{ configuration.get_path() }}
+{% for feature in configuration.get_default_view().get_features('**') %}
+{{ feature.fqr }}
+{% endfor %}
+</template>
+</output>
+</templateml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/external_tempfile.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <output file="test_ext_temp_file.txt" encoding="UTF-8" dir="output">
+       <template file="../../templates/template2.txt"/>
+    </output>
+    <filter name="test_filter" file="../../filters/filter.py"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file1.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test.txt" encoding="UTF-16">
+        <template>ABC kissa kävelee</template>
+    </output>
+
+    <output file="test2.txt" encoding="UTF-16" dir="output">
+       <template file="../../templates/template.txt"/>
+    </output>
+
+    <output file="test3.txt" encoding="UTF-8">
+       <template>ABCD kissa kävelee</template>
+    </output>
+    
+    <output file="test4.txt" encoding="UTF-16" dir="output">
+       <template file="../../templates/template.xml"/>
+    </output>
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/test_filter.filter"/>
+    
+    <output file="test5.txt" dir="some/test/path" encoding="UTF-8">
+       <template>ABCD kissa kävelee</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file2.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test.txt" encoding="UTF-8" dir="output">
+       <template file="../../templates/template.txt"/>
+    </output>
+ 
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/test_filter.filter"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file3.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1">
+    <desc>Description field text</desc>
+
+    <output file="test3.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1.StringSetting._value }}!'</template>
+    </output>
+ 
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/test_filter.filter"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file4.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test4a.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1.StringSetting._value }}!'</template>
+    </output>
+
+    <output file="test4b.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1.StringSetting._value }} again!'</template>
+    </output>
+
+    <output file="test4c.txt" encoding="UTF-8" dir="output">
+       <template>2+3={{ 2|test_filter(3) }}</template>
+    </output>
+
+    <output file="test4d.txt" encoding="UTF-8" dir="output">
+       <filter name="test_filter3" file="../../filters/test_filter3.filter"/>
+       <template>--{{ 3|test_filter3(2) }}</template>
+    </output>
+ 
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/test_filter.filter"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file5.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test5a.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1.StringSetting._value }}'</template>
+    </output>
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/filter.py"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/file6.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test6a.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1._name }} {{ feat_tree.Feature1.StringSetting._value }} {{ feat_tree.Feature1.SequenceSetting.RealSubSetting._value }}!'</template>
+    </output>
+
+    <output file="test6b.txt" encoding="UTF-8" dir="output">
+       <template>{% for feature in feat_list %}
+            {{ feature._fqr }}:{{ feature._value }}
+{% endfor %}</template>
+    </output>
+
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2" file="../../filters/filter.py"/>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="has_ref_template_test.txt" encoding="UTF-8">
+        <template>
+Features in list
+{% for feat in feat_list %}
+	Feature: {{feat._name}} value: {{feat._value}}
+{% endfor %}
+		</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test2.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="unicode_template_test.txt" encoding="UTF-8">
+        <template>
+Value of Feature1.UnicodeValueSetting: {{ feat_tree.Feature1.UnicodeValueSetting._value }}
+Value of Feature1.StringSetting1: {{ feat_tree.Feature1.StringSetting1._value }}
+Value of Feature2: {{ feat_tree.Feature2._value }}
+Value of Feature2.set1.sub1: {{ feat_tree.Feature2.set1.sub1._value }}
+Value of Feature2.set1.sub2: {{ feat_tree.Feature2.set1.sub2 }}
+</template>
+    </output>
+</templateml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test3.template	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+Value of Feature1.UnicodeValueSetting: {{ feat_tree.Feature1.UnicodeValueSetting._value }}
+Value of Feature1.StringSetting1: {{ feat_tree.Feature1.StringSetting1._value }}
+Value of Feature2: {{ feat_tree.Feature2._value }}
+Value of Feature2.set1.sub1: {{ feat_tree.Feature2.set1.sub1._value }}
+Value of Feature2.set1.sub2: {{ feat_tree.Feature2.set1.sub2 }}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/has_ref_template_test3.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="unicode_template_test.txt" encoding="UTF-8">
+        <template file="has_ref_template_test3.template"/>
+    </output>
+</templateml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/output_with_ref.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+<output ref="output.filename" encoding="UTF-8">
+<template>Configuration name: {{ configuration.get_path() }}
+</template>
+</output>
+</templateml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/unicode_template_test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="unicode_template_test.txt" encoding="UTF-8">
+        <template>{# -#}
+Value of Feature1.UnicodeValueSetting: {{ feat_tree.Feature1.UnicodeValueSetting._value }}
+Unicode from template: ελληνικά</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/implml/utf_bom_test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1">
+    
+    <!-- ISO-8859-15 is included to make sure that the BOM definitions do not affect it -->
+    
+    <output file="default.txt"><template>100€</template></output>
+    
+    <output file="utf8_default.txt"         encoding="UTF-8"><template>100€</template></output>
+    <output file="utf16be_default.txt"      encoding="UTF-16-BE"><template>100€</template></output>
+    <output file="utf16le_default.txt"      encoding="UTF-16-LE"><template>100€</template></output>
+    <output file="utf16_default.txt"        encoding="UTF-16"><template>100€</template></output>
+    <output file="iso_8859_15_default.txt"  encoding="ISO-8859-15"><template>100€</template></output>
+    
+    <output file="utf8_with_bom.txt"        encoding="UTF-8"        bom="true"><template>100€</template></output>
+    <output file="utf16be_with_bom.txt"     encoding="UTF-16-BE"    bom="true"><template>100€</template></output>
+    <output file="utf16le_with_bom.txt"     encoding="UTF-16-LE"    bom="true"><template>100€</template></output>
+    <output file="utf16_with_bom.txt"       encoding="UTF-16"       bom="true"><template>100€</template></output>
+    <output file="iso_8859_15_with_bom.txt" encoding="ISO-8859-15"  bom="true"><template>100€</template></output>
+    
+    <output file="utf8_no_bom.txt"          encoding="UTF-8"        bom="false"><template>100€</template></output>
+    <output file="utf16be_no_bom.txt"       encoding="UTF-16-BE"    bom="false"><template>100€</template></output>
+    <output file="utf16le_no_bom.txt"       encoding="UTF-16-LE"    bom="false"><template>100€</template></output>
+    <output file="utf16_no_bom.txt"         encoding="UTF-16"       bom="false"><template>100€</template></output>
+    <output file="iso_8859_15_no_bom.txt"   encoding="ISO-8859-15"  bom="false"><template>100€</template></output>
+    
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/feature1.confml#/"/>
+  <xi:include href="confml/feature2.confml#/"/>
+  <xi:include href="confml/output_define.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/assets/s60/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" version="1">
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="create_dict_test/root.confml#/"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/confml/test_features.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Test features" version="1">
+  <feature ref="Feature1" name="Feature 1">
+    <setting ref="FolderSetting" name="Folder setting" type="folder">
+      <localPath/>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+    
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <localPath/>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean"/>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+  </feature>
+  
+  <feature ref="Feature2" name="Feature 2">
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int"/>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <Feature1>
+      <FolderSetting><localPath>default_folder</localPath></FolderSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      
+      <SequenceSetting template="true">
+        <FileSubSetting><localPath>seq/default_file.txt</localPath></FileSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FileSubSetting><localPath>seq/file1.txt</localPath></FileSubSetting>
+        <StringSubSetting>item 1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+      </SequenceSetting>
+    </Feature1>
+    
+    <Feature2>
+      <StringSetting>feature 2 string</StringSetting>
+      
+      <SequenceSetting template="true">
+        <StringSubSetting>template</StringSubSetting>
+        <IntSubSetting>0</IntSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <StringSubSetting>seq1 2 item 1</StringSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+      </SequenceSetting>
+    </Feature2>
+
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/implml/test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="test6a.txt" encoding="UTF-8" dir="output">
+       <template>'Hello {{ feat_tree.Feature1._name }} {{ feat_tree.Feature1.StringSetting._value }} {{ feat_tree.Feature1.SequenceSetting.RealSubSetting._value }}!'</template>
+    </output>
+
+    <output file="test6b.txt" encoding="UTF-8" dir="output">
+       <template>{% for feature in feat_list %}
+            {{ feature._fqr }}:{{ feature._value }}
+{% endfor %}</template>
+    </output>
+
+    <filter name="test_filter">lambda a,b: a+b</filter>
+    <filter name="test_filter2"><xi:include href="project/filters/filter.py" parse="text"/></filter>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/create_dict_test/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="create_dict_test">
+  <xi:include href="confml/test_features.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+</configuration>
Binary file configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/product/root.confml has changed
Binary file configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/family/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/filter.filter	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+lambda a,b: a-b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/filter.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+lambda a,b: a-b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter.filter	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+lambda a,b: a-b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/filters/test_filter3.filter	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+lambda a,b: a*b
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/product.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="product" version="1">
+  <xi:include href="assets/s60/root.confml#/"/>
+  <xi:include href="family/root.confml#/"/>
+  <xi:include href="family/product/root.confml#/"/>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/root1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="Layer1/root.confml#/"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+include AABBCC
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+<tag name="fasdfa">include xml AABBCC</tag>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/project/templates/template2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+2+3={{ 2|test_filter(3) }}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/ConeTemplatePlugin/templatemlplugin/tests/unittest_templatemlplugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,675 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil, sys
+
+try:
+    from cElementTree import ElementTree, ElementInclude
+except ImportError:
+    try:    
+        from elementtree import ElementTree, ElementInclude
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__	
+from templatemlplugin import templatemlplugin
+from types import NoneType
+from testautomation.base_testcase import BaseTestCase
+from testautomation.utils import hex_to_bindata
+
+from cone.public import exceptions,plugin,api,utils
+from cone.storage import filestorage
+from cone.confml import implml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'project')
+
+TEMPML_DOC1 = "<?xml version=\"1.0\" encoding=\"ascii\"?> " \
+          "<templateml xmlns=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+            "<desc>Desc</desc>" \
+            "<output file=\"test.txt\" encoding=\"UTF-16\">" \
+                "<template extension=\"foo/foobar:MyClass\">ABCDF</template>" \
+             "</output>" \
+             "<filter name=\"test_filter\">lambda a,b: a+b</filter>" \
+          "</templateml>"
+          
+TEMPML_DOC2 = "<?xml version=\"1.0\" encoding=\"ascii\"?> " \
+          "<templateml xmlns=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+            "<desc>Desc</desc>" \
+            "<output file=\"test.txt\" encoding=\"UTF-16\">" \
+                "<template extension=\"foo/foobar:MyClass\"><xi:include href=\"project/templates/template.xml\" parse=\"xml\"/></template>" \
+             "</output>" \
+             "<filter name=\"test_filter\">lambda a,b: a+b</filter>" \
+          "</templateml>"
+
+TEMPML_DOC3 = "<?xml version=\"1.0\" encoding=\"ascii\"?> " \
+          "<templateml xmlns=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+            "<desc>Desc</desc>" \
+            "<output file=\"test.txt\" encoding=\"UTF-16\">" \
+                "<template extension=\"foo/foobar:MyClass\"><xi:include href=\"project/templates/template.xml\" parse=\"xml\"/></template>" \
+             "</output>" \
+             "<filter name=\"test_filter\">lambda a,b: a+b</filter>" \
+          "</templateml>"
+
+TEMPML_DOC4 = "<?xml version=\"1.0\" encoding=\"ascii\"?> " \
+          "<templateml xmlns=\"http://www.s60.com/xml/templateml/1\">" \
+            "<output file=\"test.txt\" encoding=\"ascii\">" \
+                "<template file=\"../../templates/template.xml\"/>" \
+             "</output>" \
+             "<filter name=\"test_filter\" file=\"../../filter/filter.py\"/>" \
+          "</templateml>"
+
+TEMPML1 = "<ns0:output encoding=\"ASCII\" file=\"test.txt\" xmlns:ns0=\"http://www.s60.com/xml/templateml/1\">" \
+          "<ns0:template extension=\"foo/foobar:MyClass\">ABCDF</ns0:template>" \
+          "</ns0:output>"
+
+TEMPML2 = "<ns0:output encoding=\"ASCII\" file=\"test.txt\" xmlns:ns0=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+          "<ns0:template extension=\"foo/foobar:MyClass\">" \
+          "include AABBCC" \
+          "</ns0:template>" \
+          "</ns0:output>"
+
+TEMPML3 = "<ns0:output encoding=\"ASCII\" file=\"test.txt\" xmlns:ns0=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+          "<ns0:template extension=\"foo/foobar:MyClass\">" \
+          "include AABBCC" \
+          "</ns0:template>" \
+          "<filter name=\"test_filter\">lambda a,b: a+b</filter>" \
+          "</ns0:output>"
+
+TEMPML4 = "<ns0:output encoding=\"ASCII\" file=\"test.txt\" xmlns:ns0=\"http://www.s60.com/xml/templateml/1\" xmlns:xi=\"http://www.w3.org/2001/XInclude\">" \
+          "<ns0:template file=\"../../templates/template.xml\"/>" \
+          "<filter name=\"test_filter\" file=\"../../filter/filter.py\"/>" \
+          "</ns0:output>"
+          
+          
+def impl_from_resource(resource_ref, configuration):
+    doc_root = plugin.ReaderBase._read_xml_doc_from_resource(resource_ref, configuration)
+    readers = { templateml.TemplatemlImplReader.NAMESPACE: templateml.TemplatemlImplReader }
+    ns = utils.xml.split_tag_namespace(doc_root.tag)[0]
+    if ns in readers:
+        return readers[ns].read_impl(resource_ref, configuration, doc_root)
+    else:
+        return None
+          
+class TestTemplatemlPlugin(BaseTestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = os.path.join(ROOT_PATH, 'output')
+        os.chdir(os.path.join(ROOT_PATH))
+
+    def tearDown(self):
+        os.chdir(self.curdir)
+    
+    def load_config(self, config):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        return p.get_configuration(config)
+    
+    def load_impl(self, resource_ref, config='root1.confml'):
+        configuration = self.load_config(config)
+        pattern = '^' + resource_ref.replace('.', r'\.') + '$'
+        impls = plugin.get_impl_set(configuration, pattern)
+        impls.output = self.output
+        impl_list = impls.get_implementations_by_file(resource_ref)
+        self.assertEquals(1, len(impl_list))
+        return impl_list[0]
+    
+    def test_parse_desc(self):
+        impl = self.load_impl('Layer1/implml/file1.templateml')
+        self.assertEqual("Description field text", impl.reader.desc)
+
+    def test_parse_output_with_file_ref(self):
+        impl = self.load_impl('Layer1/implml/output_with_ref.templateml')
+        self.assertEquals(impl.list_output_files(), [os.path.normpath('output/confmlref_filename.txt')])
+        
+    def test_parse_outputs(self):
+        impl = self.load_impl('Layer1/implml/file1.templateml')
+        outputs = []
+        output1 = templatemlplugin.OutputFile()
+        output1.set_encoding("UTF-16")
+        output1.set_filename("test.txt")
+        output1.set_path('')
+        temp1 = templatemlplugin.TempFile()
+        temp1.set_template(u'ABC kissa k\xe4velee')
+        output1.set_template(temp1)
+        outputs.append(output1)
+
+        output2 = templatemlplugin.OutputFile()
+        output2.set_encoding("UTF-16")
+        output2.set_filename("test2.txt")
+        output2.set_path("output")
+        temp2 = templatemlplugin.TempFile()
+        temp2.set_template('AABBCC')
+        output2.set_template(temp2)
+        outputs.append(output2)
+
+        output3 = templatemlplugin.OutputFile()
+        output3.set_encoding("UTF-8")
+        output3.set_filename("test3.txt")
+        output3.set_path('')
+        temp3 = templatemlplugin.TempFile()
+        temp3.set_template(u'ABC kissa k\xe4velee')
+        output3.set_template(temp3)
+
+        outputs.append(output3)
+        
+        self.assertNotEqual(impl.reader.outputs, None)
+        self.assertEqual(outputs[0].encoding, impl.reader.outputs[0].encoding)
+        self.assertEqual(outputs[0].filename, impl.reader.outputs[0].filename)
+        self.assertEqual(outputs[0].path, impl.reader.outputs[0].path)
+        self.assertEqual(outputs[0].template.template, impl.reader.outputs[0].template.template)
+        self.assertEqual(outputs[0].template.extensions, impl.reader.outputs[0].template.extensions)
+        self.assertEqual(outputs[0].template.filters, impl.reader.outputs[0].template.filters)
+        self.assertEqual(outputs[0].template, impl.reader.outputs[0].template)
+        self.assertEqual(outputs[0], impl.reader.outputs[0])
+
+        self.assertEqual(outputs[1].encoding, impl.reader.outputs[1].encoding)
+        self.assertEqual(outputs[1].filename, impl.reader.outputs[1].filename)
+        self.assertEqual(outputs[1].path, impl.reader.outputs[1].path)
+        #self.assertEqual(outputs[1].template.template, impl.reader.outputs[1].template.template)
+        self.assertEqual(outputs[1].template.extensions, impl.reader.outputs[1].template.extensions)
+        self.assertEqual(outputs[1].template.filters, impl.reader.outputs[1].template.filters)
+        #self.assertEqual(outputs[1].template, impl.reader.outputs[1].template)
+        #self.assertEqual(outputs[1], impl.reader.outputs[1])
+
+        self.assertEqual(outputs[2].encoding, impl.reader.outputs[2].encoding)
+        self.assertEqual(outputs[2].filename, impl.reader.outputs[2].filename)
+        self.assertEqual(outputs[2].path, impl.reader.outputs[2].path)
+        #self.assertEqual(outputs[2].template.template, impl.reader.outputs[2].template.template)
+        self.assertEqual(outputs[2].template.extensions, impl.reader.outputs[2].template.extensions)
+        self.assertEqual(outputs[2].template.filters, impl.reader.outputs[2].template.filters)
+        #self.assertEqual(outputs[2].template, impl.reader.outputs[2].template)
+
+        #self.assertEqual(outputs[2], impl.reader.outputs[2])
+
+    def test_parse_outputfile(self):
+        output1 = templatemlplugin.OutputFile()
+        output2 = templatemlplugin.OutputFile()
+        
+        self.assertEqual(output1, output2)
+        self.assertEqual(output1.encoding, output2.encoding)
+        self.assertEqual(output1.path, output2.path)
+        self.assertEqual(output1.filename, output2.filename)
+        
+        output1.set_encoding("utf-8")
+        output2.set_encoding("utf-8")
+        
+        self.assertEqual(output1, output2)# utf-8, utf-8
+        
+        output1.set_encoding("utf-16")
+        
+        self.assertNotEqual(output1, output2)#utf-16, utf-8
+        
+        output2.set_encoding("utf-16")
+        
+        self.assertEqual(output1, output2)#utf-16, utf-16
+
+    def test_parse_template(self):
+        reader = templatemlplugin.TemplatemlImplReader()
+        reader.fromstring(TEMPML_DOC1)
+        
+        temp1 = reader.parse_template(ElementTree.fromstring(TEMPML1))
+        temp2 = templatemlplugin.TempFile()
+        temp2.set_template("ABCDF")
+        
+        self.assertEqual(temp1.template, temp2.template)
+        self.assertEqual(temp1.extensions, temp2.extensions)
+        self.assertEqual(temp1.filters, temp2.filters)
+        self.assertEqual(temp1, temp2)
+
+    def test_parse_template_from_xinclude(self):
+        try:
+            reader = templatemlplugin.TemplatemlImplReader()
+            reader.fromstring(TEMPML_DOC2)
+            
+            temp1 = reader.parse_template(ElementTree.fromstring(TEMPML2))
+            temp2 = templatemlplugin.TempFile()
+            temp2.set_template("include AABBCC")
+        except exceptions.ParseError, e:
+            self.fail("Known bug: ticket #2007")
+        
+        self.assertEqual(temp1.template, temp2.template)
+        self.assertEqual(temp1.extensions, temp2.extensions)
+        self.assertEqual(temp1.filters, temp2.filters)
+        self.assertEqual(temp1, temp2)
+
+    def test_parse_template_filter(self):
+        try:
+            reader = templatemlplugin.TemplatemlImplReader()
+            reader.fromstring(TEMPML_DOC3)
+            filters1 = reader.filters
+            filter2 = templatemlplugin.Filter()
+            filter2.set_code("lambda a,b: a+b")
+            filter2.set_name("test_filter")
+        except exceptions.ParseError, e:
+            self.fail( "Known bug: ticket #2007")
+        self.assertEqual(filters1[0].name, filter2.name)
+        self.assertEqual(filters1[0].code, filter2.code)
+        self.assertEqual(filters1[0], filter2)
+        
+    def test_parse_template_filter(self):
+        class DummyConfiguration(object):
+            def get_resource(self, ref):
+                class DummyResource(object):
+                    def read(self): return ''
+                    def close(self): return None
+                return DummyResource()
+            def get_default_view(self): return None
+        reader = templatemlplugin.TemplatemlImplReader('foo/implml/bar.implml', DummyConfiguration())
+        reader.fromstring(TEMPML_DOC4)
+        
+        filters1 = reader.filters
+        filter2 = templatemlplugin.Filter()
+        filter2.set_code(None)
+        filter2.set_name("test_filter")
+        filter2.set_path("../../filter/filter.py")
+        temp1 = reader.parse_template(ElementTree.fromstring(TEMPML4))
+        temp2 = templatemlplugin.TempFile()
+        temp2.set_template('')
+        temp2.set_path('')
+
+        self.assertEqual(filters1[0].name, filter2.name)
+        self.assertEqual(filters1[0].code, filter2.code)
+        self.assertEqual(filters1[0].path, filter2.path)
+        self.assertEqual(filters1[0], filter2)
+        self.assertEqual(temp1.template, temp2.template)
+        self.assertEqual(temp1.extensions, temp2.extensions)
+        self.assertEqual(temp1.filters, temp2.filters)
+        self.assertEqual(temp1, temp2)
+        
+    def test_simple_generate_prj(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test.txt"))
+        
+        impl = self.load_impl('Layer1/implml/file2.templateml')
+        #impl.context = {'name' : 'some value'}
+        impl.generate()
+        
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test.txt")))
+        result_file = None
+        try:
+            result_file = open(os.path.normpath("output/output/test.txt"))
+            for line in result_file:
+                self.assertTrue(line == "include AABBCC")
+        finally:
+            if result_file != None: result_file.close()
+    
+    def test_simple_generate_prj3(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test3.txt"))
+        
+        impl = self.load_impl('Layer1/implml/file3.templateml')
+        impl.generate()
+        
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test3.txt")))
+        result_file = None
+        try:
+            result_file = open(os.path.normpath("output/output/test3.txt"))
+            for line in result_file:
+                self.assertTrue(line == "'Hello John Doe!'")
+        finally:
+            if result_file != None: result_file.close()
+
+    def test_simple_generate_prj4_with_filters(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test4a.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test4b.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test4c.txt"))
+        self.remove_if_exists(os.path.normpath("output/output/test4d.txt"))
+        
+        impl = self.load_impl('Layer1/implml/file4.templateml')
+        #impl.context = {'name' : 'John Doe'}
+        impl.generate()
+        
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test4a.txt")))
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test4b.txt")))
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test4c.txt")))
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test4d.txt")))
+        
+        result_file1 = None
+        result_file2 = None
+        result_file3 = None
+        result_file4 = None
+        
+        try:
+            result_file1 = open(os.path.normpath("output/output/test4a.txt"))
+            result_file2 = open(os.path.normpath("output/output/test4b.txt"))
+            result_file3 = open(os.path.normpath("output/output/test4c.txt"))
+            result_file4 = open(os.path.normpath("output/output/test4d.txt"))
+            
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "'Hello John Doe!'")
+            else:
+                self.fail("No result file found: output/output/test4a.txt")
+            
+            if result_file2 != None: 
+                for line in result_file2:
+                    self.assertTrue(line == "'Hello John Doe again!'")
+            else:
+                self.fail("No result file found: output/output/test4b.txt")
+            
+            if result_file3 != None:
+                for line in result_file3:
+                    self.assertTrue(line == "2+3=5")
+            else:
+                self.fail("No result file found: output/output/test4c.txt")
+
+            if result_file4 != None:
+                for line in result_file4:
+                    self.assertTrue(line == "--6")
+            else:
+                self.fail("No result file found: output/output/test4d.txt")
+                
+        finally:
+            if result_file1 != None: result_file1.close()
+            if result_file2 != None: result_file2.close()
+            if result_file3 != None: result_file3.close()
+            if result_file4 != None: result_file4.close()
+
+    def test_simple_generate_prj_extfiles_with_filters(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test_ext_temp_file.txt"))
+        
+        impl = self.load_impl('Layer1/implml/external_tempfile.templateml')
+        
+        impl.generate()
+        
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test_ext_temp_file.txt")))
+        
+        result_file1 = None
+        
+        try:
+            result_file1 = open(os.path.normpath("output/output/test_ext_temp_file.txt"))
+            lines = 0
+
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "2+3=-1")
+                    lines += 1
+            else:
+                self.fail("No result file found: output/output/test_ext_temp_file.txt")
+            
+            self.assertTrue(lines == 1, "Wrong number of lines generated.")
+            
+        finally:
+            if result_file1 != None: result_file1.close()
+
+    def test_generate_prj1(self):
+        
+        self.remove_if_exists(os.path.normpath("output/output/test5a.txt"))
+        
+        impl = self.load_impl('Layer1/implml/file5.templateml')
+        impl.generate()
+        self.assertTrue(os.path.exists(os.path.normpath("output/output/test5a.txt")))
+        
+        result_file1 = None
+        try:
+            result_file1 = open(os.path.normpath("output/output/test5a.txt"))
+            
+            if result_file1 != None: 
+                for line in result_file1:
+                    self.assertTrue(line == "'Hello John Doe'")
+            else:
+                self.fail("No result file found: output/output/test5a.txt")
+        finally:
+            if result_file1 != None: result_file1.close()
+
+    def test_generate_access_configuration(self):
+        
+        self.remove_if_exists(os.path.normpath("output/access_configuration.txt"))
+        
+        impl = self.load_impl('Layer1/implml/access_configuration.templateml')
+        impl.generate()
+        self.assertTrue(os.path.exists(os.path.normpath("output/access_configuration.txt")))
+        
+        result_file1 = None
+        try:
+            result_file1 = open(os.path.normpath("output/access_configuration.txt"))
+            data = result_file1.read() 
+            if result_file1 != None: 
+                self.assertTrue(data.startswith("Configuration name: root1.confml"))
+            else:
+                self.fail("No result file found: output/access_configuration.txt")
+        finally:
+            if result_file1 != None: result_file1.close()
+    
+    def test_create_context_dict1(self):
+        impl = self.load_impl('Layer1/implml/file6.templateml')
+        impl.context = impl.create_dict()
+        impl.generate()
+    
+    def test_list_output_files(self):
+        impl = self.load_impl('Layer1/implml/file1.templateml')
+        impl.set_output_root('outdir')
+        output_files = impl.list_output_files()
+        expected = map(lambda n: os.path.normpath(n), [
+            'outdir/test.txt',
+            'outdir/output/test2.txt',
+            'outdir/test3.txt',
+            'outdir/output/test4.txt',
+            'outdir/some/test/path/test5.txt',
+        ])
+        self.assertEquals(sorted(output_files), sorted(expected))
+    
+    def test_has_ref(self):
+        impl = self.load_impl('Layer1/implml/has_ref_template_test2.templateml')
+        self.assertEquals(impl.has_ref('Feature1.StringSetting_not_found'), False)
+        self.assertEquals(impl.has_ref('Feature1.StringSetting1'), True)
+        self.assertEquals(impl.has_ref('Feature2'), True)
+        self.assertEquals(impl.has_ref('Feature2.set1.sub1'), True)
+        self.assertEquals(impl.has_ref('Feature2.set1.sub2'), True)
+        self.assertEquals(impl.has_ref('Feature1.UnicodeValueSetting'), True)
+    
+    def test_has_ref_external_template(self):
+        impl = self.load_impl('Layer1/implml/has_ref_template_test3.templateml')
+        self.assertEquals(impl.has_ref('Feature1.StringSetting_not_found'), False)
+        self.assertEquals(impl.has_ref('Feature1.StringSetting1'), True)
+        self.assertEquals(impl.has_ref('Feature2'), True)
+        self.assertEquals(impl.has_ref('Feature2.set1.sub1'), True)
+        self.assertEquals(impl.has_ref('Feature2.set1.sub2'), True)
+        self.assertEquals(impl.has_ref('Feature1.UnicodeValueSetting'), True)
+
+    def test_has_ref_with_featree(self):
+        impl = self.load_impl('Layer1/implml/has_ref_template_test.templateml')
+        self.assertEquals(impl.has_ref('Feature1.StringSetting'), True)
+        self.assertEquals(impl.has_ref('Feature2.StringSetting'), True)
+    
+    def test_unicode_in_template_and_value(self):
+        OUTPUT_DIR = os.path.join(ROOT_PATH, 'output', 'unicode_test')
+        self.remove_if_exists(OUTPUT_DIR)
+        
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('root1.confml')
+        impls = plugin.get_impl_set(config,'unicode_template_test\.templateml$')
+        impls.output = OUTPUT_DIR
+        impls.generate()
+        self.assert_exists_and_contains_something(os.path.join(OUTPUT_DIR, "unicode_template_test.txt"))
+        
+        # Check that the output exists and contains expected lines
+        f = open(os.path.join(OUTPUT_DIR, "unicode_template_test.txt"), "rb")
+        try:        data = f.read().decode('utf-8')
+        finally:    f.close()
+        self.assertTrue(data.find(u'Value of Feature1.UnicodeValueSetting: カタカナ') != -1)
+        self.assertTrue(data.find(u'Unicode from template: ελληνικά') != -1)
+    
+    def test_create_context_dict_and_list(self):
+        config = self.load_config('create_dict_test.confml')
+        impls = plugin.get_impl_set(config, r'^create_dict_test/implml/test\.templateml$')
+        self.assertEquals(1, len(impls))
+        impl = iter(impls).next()
+        context = impl.create_dict()
+        feat_tree = context['feat_tree']
+        feat_list = context['feat_list']
+        self.assertEqual(context['configuration'], config)
+        
+        # Check the created dictionary
+        expected_tree_file = os.path.join(ROOT_PATH, 'create_dict_test', 'expected_tree.txt')
+        expected_tree = eval(self.read_data_from_file(expected_tree_file).replace('\r', ''))
+        if feat_tree != expected_tree:
+            dir = os.path.join(ROOT_PATH, "temp", "create_dict_test", "tree")
+            self.create_dir(dir)
+            filename = os.path.join(dir, "expected.txt")
+            self.write_data_to_file(filename, self.feature_tree_to_str(expected_tree))
+            filename = os.path.join(dir, "actual.txt")
+            self.write_data_to_file(filename, self.feature_tree_to_str(feat_tree))
+            self.fail("Feature tree is not what was expected, see the files in '%s'" % dir)
+        
+        # Check the created list
+        expected_list_file = os.path.join(ROOT_PATH, 'create_dict_test', 'expected_list.txt')
+        expected_list = eval(self.read_data_from_file(expected_list_file).replace('\r', ''))
+        if feat_list != expected_list:
+            dir = os.path.join(ROOT_PATH, "temp", "create_dict_test", "list")
+            self.create_dir(dir)
+            filename = os.path.join(dir, "expected.txt")
+            self.write_data_to_file(filename, self.feature_list_to_str(expected_list))
+            filename = os.path.join(dir, "actual.txt")
+            self.write_data_to_file(filename, self.feature_list_to_str(feat_list))
+            self.fail("Feature tree is not what was expected, see the files in '%s'" % dir)
+    
+    def feature_tree_to_str(self, d, indent_amount=0):
+        """
+        Pretty-print a feature tree dictionary into a string.
+        """
+        INDENT_AMOUNT = 4
+        indent = indent_amount * ' '
+        temp = ['{']
+        if len(d) > 0: temp.append('\n')
+        
+        indent += (INDENT_AMOUNT + indent_amount) * ' '
+        
+        # Function for sorting the dict contents so that keys starting with
+        # '_' are first
+        def key_func(key_and_value):
+            key = key_and_value[0]
+            if key.startswith('_'): return '\x00' + key
+            else:                   return key
+        
+        for key, value in sorted(d.items(), key=key_func):
+            temp.append(indent)
+            if isinstance(value, dict):
+                temp.append("%r: %s," % (key, self.feature_tree_to_str(value, indent_amount + INDENT_AMOUNT)))
+            else:
+                temp.append("%r: %r," % (key, value))
+            temp.append('\n')
+            
+        if len(d) > 0: temp.append(indent)
+        temp.append('}')
+        return ''.join(temp)
+    
+    def feature_list_to_str(self, lst):
+        """
+        Pretty-print a feature list into a string.
+        """
+        temp = ['[\n']
+        for item in lst:
+            if isinstance(item, dict):  temp.append(self.feature_tree_to_str(item))
+            else:                       temp.append(repr(item))
+            temp.append(',\n')
+        temp.append(']')
+        return ''.join(temp)
+    
+    
+    def test_utf_bom_support(self):
+        OUTPUT_DIR = os.path.join(ROOT_PATH, 'temp/utf_bom_test')
+        self.recreate_dir(OUTPUT_DIR)
+        impl = self.load_impl('Layer1/implml/utf_bom_test.templateml')
+        impl.set_output_root(OUTPUT_DIR)
+        impl.generate()
+        
+        def check(file, contents):
+            FILE = os.path.join(OUTPUT_DIR, file)
+            self.assert_file_content_equals(FILE, contents)
+        
+        h = hex_to_bindata
+        
+        # The all-around default should be UTF-8 without BOM
+        check('default.txt',           h('31 30 30 E282AC'))
+        
+        check('iso_8859_15_default.txt',    h('31 30 30 A4'))
+        check('utf8_default.txt',           h('31 30 30 E282AC'))
+        check('utf16be_default.txt',        h('0031 0030 0030 20AC'))
+        check('utf16le_default.txt',        h('3100 3000 3000 AC20'))
+
+        check('iso_8859_15_no_bom.txt',     h('31 30 30 A4'))
+        check('utf8_no_bom.txt',            h('31 30 30 E282AC'))
+        check('utf16be_no_bom.txt',         h('0031 0030 0030 20AC'))
+        check('utf16le_no_bom.txt',         h('3100 3000 3000 AC20'))
+        
+        check('iso_8859_15_with_bom.txt',   h('31 30 30 A4'))
+        check('utf8_with_bom.txt',          h('EFBBBF 31 30 30 E282AC'))
+        check('utf16be_with_bom.txt',       h('FEFF 0031 0030 0030 20AC'))
+        check('utf16le_with_bom.txt',       h('FFFE 3100 3000 3000 AC20'))
+        
+        if sys.byteorder == 'little':
+            check('utf16_default.txt',  h('FFFE 3100 3000 3000 AC20'))
+            check('utf16_no_bom.txt',   h('3100 3000 3000 AC20'))
+            check('utf16_with_bom.txt', h('FFFE 3100 3000 3000 AC20'))
+        else:
+            check('utf16_default.txt',  h('FEFF 0031 0030 0030 20AC'))
+            check('utf16_no_bom.txt',   h('0031 0030 0030 20AC'))
+            check('utf16_with_bom.txt', h('FEFF 0031 0030 0030 20AC'))
+    
+    def test_invalid_encoding(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+          <templateml xmlns=\"http://www.s60.com/xml/templateml/1\">
+            <output file="test.txt" encoding="foocode">foo</output>
+          </templateml>"""
+        reader = templatemlplugin.TemplatemlImplReader()
+        self.assertRaises(exceptions.ParseError, reader.fromstring, DATA)
+    
+
+class TestExtractRefsFromTemplate(unittest.TestCase):
+    def test_extract_refs_from_template(self):
+        def t(data, expected_refs):
+            actual_refs = templatemlplugin.TemplatemlImpl._extract_refs_from_template(data)
+            self.assertEquals(expected_refs, actual_refs)
+        
+        t("some text {{ feat_tree.Foo }} more text",
+          ['Foo'])
+        t("some text {{ feat_tree.Foo.Bar }} more text",
+          ['Foo.Bar'])
+        t("some text {{feat_tree.Foo.Bar}} more text",
+          ['Foo.Bar'])
+        t("some text {{ feat_tree.Foo.Bar.Baz }} more text",
+          ['Foo.Bar.Baz'])
+        t("some text {{ feat_tree.Foo.Bar.Baz._value }} more text",
+          ['Foo.Bar.Baz'])
+        t(u"some text {{ feat_tree.ударениÑ.ελληνικά }} more text",
+          [u'ударениÑ.ελληνικά'])
+        t(u"some text {{ feat_tree.ударениÑ.ελληνικά._value }} more text",
+          [u'ударениÑ.ελληνικά'])
+        t("some text {{ feat_tree.MyFeature.MySetting|some_filter }} more text",
+          ['MyFeature.MySetting'])
+        t(u"some text {{ feat_tree.MyFeature.MySetting|some_filter }} more text",
+          ['MyFeature.MySetting'])
+        t("some text {{ feat_tree.MyFeature.MySetting | some_filter }} more text",
+          ['MyFeature.MySetting'])
+        t("some text {{ feat_tree.MyFeature.MySetting._value|some_filter }} more text",
+          ['MyFeature.MySetting'])
+        t("some text {{ feat_tree.Xyz.Zyx._type }} more {{feat_tree.Xyz.Zyx._type}} text",
+          ['Xyz.Zyx', 'Xyz.Zyx'])
+        t("some text {% for x in feat_tree.MyFeature.MySetting._value|sort %} more text",
+          ['MyFeature.MySetting'])
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/dep-eggs/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+This directory contains all library dependencies needed by any of the plug-ins as egg files.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../..'))
+assert os.path.split(PLUGIN_SOURCE_ROOT)[1] == 'plugins'
+
+# Import plugin_utils from the plug-in sources root
+if PLUGIN_SOURCE_ROOT not in sys.path: sys.path.append(PLUGIN_SOURCE_ROOT)
+import plugin_utils
+
+# Run integration test initialization
+plugin_utils.integration_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/files_from_copy_list/file3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/overlay_folder/overlay.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+overlay
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/expected/content/unicode_template_test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+Value of Feature1.StringSetting: カタカナ カタカナ <&> (from rule: カタカナ)
+Unicode from template: ελληνικά
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>test_project</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.tools.variant.confml.core.ConfMLLayerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.nokia.s60ct.build.CenRepBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.tools.variant.confml.core.ConfMLLayerNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/basic_setting_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
Binary file configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/empty_sequence.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/file_folder_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Time types test">
+  <confml:feature ref="FileFolderTest" name="File &amp; folder types test">
+    <confml:desc>Feature with file and folder setting types</confml:desc>
+    <confml:setting ref="FolderSetting" name="Folder setting" type="folder">
+      <confml:desc>A folder setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting ref="FileSetting" name="File setting" type="file">
+      <confml:desc>A file setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:FileFolderTest>
+      <confml:FolderSetting>
+        <confml:localPath>default_folder</confml:localPath>
+        <confml:targetPath>default_target_folder/</confml:targetPath>
+      </confml:FolderSetting>
+      <confml:FileSetting>
+        <confml:localPath>default_file.txt</confml:localPath>
+        <confml:targetPath>default_target_folder/default_file_renamed.txt</confml:targetPath>
+      </confml:FileSetting>
+    </confml:FileFolderTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/confml/sequence_setting_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="SequenceSettingTest" name="Sequence setting test">
+    <confml:desc>Feature with a sequence setting (ConfML v2.0)</confml:desc>
+    <confml:setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <confml:desc>A sequence setting</confml:desc>
+      <confml:setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <confml:desc>A folder sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <confml:desc>A real sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <confml:desc>A file sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <confml:desc>An int sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <confml:desc>A string sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <confml:desc>A boolean sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <confml:desc>A selection sub-setting</confml:desc>
+        <confml:option name="Op0" value="0"/>
+        <confml:option name="Op1" value="1"/>
+        <confml:option name="Op2" value="2"/>
+        <confml:option name="Op3" value="3"/>
+        <confml:option name="Op4" value="4"/>
+      </confml:setting>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:SequenceSettingTest>
+      <confml:SequenceSetting template="true">
+        <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.0</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>1</confml:IntSubSetting>
+        <confml:StringSubSetting>template</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>0</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def1_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.25</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def1_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>128</confml:IntSubSetting>
+        <confml:StringSubSetting>def1</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def2_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def2_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>def2</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+    </confml:SequenceSettingTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/base/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Base layer">
+  <xi:include href="confml/feature1.confml"/>
+  <xi:include href="confml/feature2.confml"/>
+  <xi:include href="confml/file_folder_test.confml"/>
+  <xi:include href="confml/basic_setting_types_test.confml"/>
+  <xi:include href="confml/sequence_setting_test.confml"/>
+  <xi:include href="confml/empty_sequence.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/confml/custom.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2"
+ name="Custom configuration settings">
+  <confml:feature ref="CustomConfSettings" name="Custom configuration settings">
+    <confml:desc>Settings for configuring the base layer's settings via rules and other implementation files on this layer</confml:desc>
+    
+    <confml:setting ref="ConfigureBitmask" name="Configure bitmask" type="boolean">
+      <confml:desc>Sets whether the feature BitmaskTest is configured with pre-defined values</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="FileCopyList" name="File copy list" type="sequence">
+      <confml:desc>Sequence for listing files to be copied</confml:desc>
+      <confml:setting ref="File" name="File to copy" type="file">
+        <confml:desc>The file to copy</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+    </confml:setting>
+    
+    <confml:setting ref="BmpAnimationFolder" name="BMP animation images folder" type="folder">
+      <confml:desc>The folder used for generating an .mbm file</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SvgAnimationFolder" name="SVG animation images folder" type="folder">
+      <confml:desc>The folder used for generating a .mif file</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFile" name="Sound file" type="file">
+      <confml:desc>Sound file.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFolder" name="Sound folder (for copying sound file to)" type="folder">
+      <confml:desc>Sound folder.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFileName" name="Sound file name (for copying sound file to)" type="string"/>
+    
+    <confml:setting ref="ThemeFolder" name="Theme folder" type="folder">
+      <confml:desc>Folder containing themes</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="Theme1File" name="Theme 1 file" type="file">
+      <confml:desc>TPF file for theme 1</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="Theme2File" name="Theme 2 file" type="file">
+      <confml:desc>TPF file for theme 2</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+  </confml:feature>
+  
+  <confml:data>
+    <confml:CustomConfSettings>
+      <confml:ConfigureBitmask>false</confml:ConfigureBitmask>
+      
+      <confml:FileCopyList template="true">
+        <confml:File><confml:localPath></confml:localPath></confml:File>
+      </confml:FileCopyList>
+      
+      <confml:BmpAnimationFolder><confml:localPath></confml:localPath></confml:BmpAnimationFolder>
+      <confml:SvgAnimationFolder><confml:localPath></confml:localPath></confml:SvgAnimationFolder>
+      <confml:SoundFile><confml:localPath></confml:localPath></confml:SoundFile>
+      <confml:SoundFolder><confml:localPath></confml:localPath></confml:SoundFolder>
+      <confml:SoundFileName>default.mp3</confml:SoundFileName>
+      <confml:ThemeFolder><confml:localPath></confml:localPath></confml:ThemeFolder>
+      <confml:Theme1File><confml:localPath></confml:localPath></confml:Theme1File>
+      <confml:Theme2File><confml:localPath></confml:localPath></confml:Theme2File>
+      
+    </confml:CustomConfSettings>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/confml/view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+  <confml:view name="Test view">
+    <confml:desc>Testing view</confml:desc>
+    <confml:group name="ConfML v1.0 settings">
+      <confml:setting ref="Feature1/RealSetting"/>
+      <confml:setting ref="Feature1/IntSetting"/>
+      <confml:setting ref="Feature1/StringSetting"/>
+      <confml:setting ref="Feature1/BooleanSetting"/>
+      <confml:setting ref="Feature1/SelectionSetting"/>
+      <confml:setting ref="Feature1/SequenceSetting"/>
+      <confml:setting ref="Feature2/SequenceSetting"/>
+      <confml:setting ref="StringToIntSequenceFeature/SequenceSetting"/>
+      <confml:setting ref="NameIdMappingTest/StringToInt"/>
+    </confml:group>
+    <confml:group name="ConfML v2.0 settings">
+      <confml:setting ref="BasicSettingTypesTest/RealSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/IntSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/StringSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/BooleanSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/SelectionSetting"/>
+      <confml:setting ref="FileFolderTest/FolderSetting"/>
+      <confml:setting ref="FileFolderTest/FileSetting"/>
+      <confml:setting ref="SequenceSettingTest/SequenceSetting"/>
+    </confml:group>
+    <confml:group name="Custom ConfML settings">
+      <confml:setting ref="CustomConfSettings/*"/>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/content/overlay/overlay_folder/overlay.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+overlay
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/overlay.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input dir="overlay">
+    <exclude pattern='.svn'/>
+  </input>
+  <output dir="content"/>
+</content>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/sequence_files.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input>
+    <include files="${CustomConfSettings.FileCopyList.File.localPath}"/>
+  </input> 
+  <output dir="content\files_from_copy_list\" flatten="true" />
+</content>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/unicode_rule_test.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>True configures Feature1.StringSetting = Feature1.StringSetting + " " + BasicSettingTypesTest.StringSetting + u" (from rule: カタカナ)"</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/implml/unicode_template_test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <desc>Description field text</desc>
+
+    <output file="unicode_template_test.txt" dir="content" encoding="UTF-8">
+        <template>{# -#}
+Value of Feature1.StringSetting: {{ feat_tree.Feature1.StringSetting._value }}
+Unicode from template: ελληνικά</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/custom/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Custom configuration layer">
+  <xi:include href="confml/custom.confml"/>
+  <xi:include href="confml/view.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:IntSetting>555</confml:IntSetting>
+      <confml:StringSetting>カタカナ &lt;&amp;></confml:StringSetting>
+    </confml:BasicSettingTypesTest>
+    <confml:CustomConfSettings>
+      <confml:FileCopyList extensionPolicy="replace"><confml:File><confml:localPath>file1.txt</confml:localPath></confml:File></confml:FileCopyList>
+      <confml:FileCopyList><confml:File><confml:localPath>file2.txt</confml:localPath></confml:File></confml:FileCopyList>
+      <confml:FileCopyList><confml:File><confml:localPath>file3.txt</confml:localPath></confml:File></confml:FileCopyList>
+    </confml:CustomConfSettings>
+    
+      <confml:SequenceSettingTest>
+        <confml:SequenceSetting extensionPolicy="replace">
+          <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+          <confml:RealSubSetting>10.10</confml:RealSubSetting>
+          <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+          <confml:IntSubSetting>120</confml:IntSubSetting>
+          <confml:StringSubSetting>&lt;&amp;カタカナ&gt;</confml:StringSubSetting>
+          <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+          <confml:SelectionSubSetting>2</confml:SelectionSubSetting>
+        </confml:SequenceSetting>
+      </confml:SequenceSettingTest>
+      
+      <confml:Feature1>
+      <confml:StringSetting>カタカナ</confml:StringSetting>
+      <confml:SequenceSetting extensionPolicy="append">
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>test</confml:StringSubSetting>
+        <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      </confml:Feature1>
+
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/content/file3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/data/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Data layer">
+  <xi:include href="confml/data.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/testdata/generate/project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="base/root.confml"/>
+  <xi:include href="custom/root.confml"/>
+  <xi:include href="data/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/integration-test/unittest_generate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,87 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Lasse Salo
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import zip_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action='generate'):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+        assert os.path.split(SOURCE_ROOT)[1] == 'source'
+        cmd = 'python "%s" %s' % (os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts/cone_tool.py')), action)
+        return cmd
+
+class TestCommonGenerateAllImplsOnLastLayer(BaseTestCase):
+    
+    def _prepare_workdir(self, workdir):
+        workdir = os.path.join(ROOT_PATH, workdir)
+        self.recreate_dir(workdir)
+        
+        # Any needed extra preparation can be done here
+        
+        return workdir
+    
+    def test_generate_all_impls_on_last_layer_on_file_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll1', project_dir)
+    
+    def test_generate_all_impls_on_last_layer_on_zip_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        project_zip = os.path.join(ROOT_PATH, "temp/generation_test_project.zip")
+        self.remove_if_exists(project_zip)
+        zip_dir.zip_dir(project_dir, project_zip, [zip_dir.SVN_IGNORE_PATTERN])
+        self.assert_exists_and_contains_something(project_zip)
+        
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll2', project_zip)
+    
+    def _run_test_generate_all_impls_on_last_layer(self, workdir, project):
+        # Create a temp workdir and go there to run the test
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir(workdir)
+        os.chdir(workdir)
+        
+        try:
+            cmd = '%s -p "%s" --output output --layer -1 --add-setting-file imaker_variantdir.cfg' % (get_cmd(), project)
+            self.run_command(cmd)
+            
+            EXPECTED_DIR = os.path.join(ROOT_PATH, "testdata/generate/expected")
+            self.assert_dir_contents_equal('output', EXPECTED_DIR, ['.svn'])
+        finally:
+            os.chdir(orig_workdir)
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/common/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, re, unittest
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+if __name__ == "__main__":
+    # Collect a list of plug-in source paths and plug-in module names
+    paths_and_modnames = plugin_utils.find_plugin_sources(ROOT_PATH)
+    # Create a test suite from them
+    suite = plugin_utils.collect_suite_from_source_list(paths_and_modnames)
+    # Run the suite
+    unittest.TextTestRunner(verbosity=2).run(suite)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,54 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+"""
+ExampleML implementation, for use as a template when creating new plug-ins.
+
+The example implementation language simply writes text data into output files
+using the specified encoding. The text data may contain ConfML setting references
+of the form ${SomeFeature.SomeSetting}.
+"""
+
+import os
+import sys
+import logging
+
+from cone.public import plugin
+
+class ExamplemlImpl(plugin.ImplBase):
+    IMPL_TYPE_ID = 'exampleml'
+
+    def __init__(self, resource_ref, configuration, output_objects):
+        plugin.ImplBase.__init__(self, resource_ref, configuration)
+        self.logger = logging.getLogger('cone.exampleml(%s)' % resource_ref)
+        self.output_objects = output_objects
+        
+    def generate(self, context=None):
+        for output in self.output_objects:
+            self.logger.debug("Generating '%s'" % output.get_output_file(self.output, self.configuration))
+            output.write_to_file(self.output, self.configuration)
+    
+    def list_output_files(self):
+        files = []
+        for output in self.output_objects:
+            files.append(output.get_output_file(self.output, self.configuration))
+        return files
+
+    def get_refs(self):
+        refs = []
+        for output in self.output_objects:
+            refs.extend(output.get_refs())
+        return refs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,83 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os
+import sys
+import logging
+
+from cone.public import utils
+
+class Output(object):
+    """
+    Class representing an ExampleML output element.
+    """
+    
+    def __init__(self, file, encoding, text):
+        self.file = file
+        self.encoding = encoding
+        self.text = text
+    
+    def get_refs(self):
+        """
+        Return a list of all ConfML refs used in this output object.
+        """
+        return utils.extract_delimited_tokens(self.text)
+    
+    def get_output_file(self, output_dir, config):
+        """
+        Return the path of the output file specified by this output object.
+        """
+        # Expand ConfML references
+        file = utils.expand_refs_by_default_view(self.file, config.get_default_view())
+        return os.path.normpath(os.path.join(output_dir, file))
+    
+    def write_to_file(self, output_dir, config):
+        """
+        Write the text file specified by this output object to the
+        given output directory.
+        """
+        # Get the actual output path and encoding
+        file_path = self.get_output_file(output_dir, config)
+        encoding = utils.expand_refs_by_default_view(self.encoding, config.get_default_view())
+        
+        # Generate the binary data to write
+        text = utils.expand_refs_by_default_view(self.text, config.get_default_view())
+        data = text.encode(encoding)
+        
+        # Make sure that the output directory exists
+        dir = os.path.dirname(file_path)
+        if dir != '' and not os.path.exists(dir):
+            os.makedirs(dir)
+        
+        # Write the file.
+        f = open(file_path, "wb")
+        try:        f.write(data)
+        finally:    f.close()
+    
+    def __eq__(self, other):
+        if type(self) is type(other):
+            for varname in ('file', 'encoding', 'text'):
+                if getattr(self, varname) != getattr(other, varname):
+                    return False
+            return True
+        else:
+            return False
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __repr__(self):
+        return "Output(file=%r, encoding=%r, text=%r)" % (self.file, self.encoding, self.text)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/exampleml_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,49 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+from cone.public import exceptions, plugin
+import exampleml_impl
+import exampleml_model
+
+class ExamplemlReader(plugin.ReaderBase):
+    NAMESPACE = 'http://www.example.org/xml/exampleml/1'
+    FILE_EXTENSIONS = ['exampleml']
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = ExamplemlReader()
+        outputs = reader._read_outputs(etree)
+        return exampleml_impl.ExamplemlImpl(resource_ref, configuration, outputs)
+    
+    def _read_outputs(self, elem):
+        """
+        Read output objects from the given XML element.
+        """
+        result = []
+        for subelem in elem.findall("{%s}output" % self.NAMESPACE):
+            result.append(self._read_output_elem(subelem))
+        return result
+    
+    def _read_output_elem(self, elem):
+        """
+        Read an <output> element into an Output object.
+        """
+        file = elem.get('file')
+        if file is None:
+            raise exceptions.ParseError("Element <output> does not have the mandatory 'file' attribute")
+        return exampleml_model.Output(file     = file,
+                                      encoding = elem.get('encoding', 'UTF-8'),
+                                      text     = elem.text or '')
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest1_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Multitest impl 1 output 1
\ No newline at end of file
Binary file configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest1_2.txt has changed
Binary file configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest2_1.txt has changed
Binary file configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/multitest2_2.txt has changed
Binary file configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/some/dir/out1.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/some/dir2/out2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Test 1 output 2 €
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/gen_expected/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Value from ConfML: ελληνικά (unicode test), <&> (special char test)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="TestFeature" version="1">
+  <feature ref="TestFeature" name="Settings for testing">
+    <setting ref="Value1" type="string"/>
+  
+    <setting ref="Output1File" type="string"/>
+    <setting ref="Output1Encoding" type="string"/>
+    
+    <setting ref="Output2Dir" type="string"/>
+    <setting ref="Output2Filename" type="string"/>
+  </feature>
+  <data>
+    <TestFeature>
+      <Value1>ελληνικά (unicode test), &lt;&amp;> (special char test)</Value1>
+    
+      <Output1File>some/dir/out1.txt</Output1File>
+      <Output1Encoding>UTF-16-LE</Output1Encoding>
+      
+      <Output2Dir>some/dir2</Output2Dir>
+      <Output2Filename>out2.txt</Output2Filename>
+    </TestFeature>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/implml/multitest.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <!-- Testing that multiple implementations in a single file works correctly -->
+    
+    <test1 xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="multitest1_1.txt" encoding="UTF-8">Multitest impl 1 output 1</output>
+        <output file="multitest1_2.txt" encoding="UTF-16-LE">Multitest impl 1 output 2</output>
+    </test1>
+    
+    <!-- Also test that special characters and unicode characters outside the ASCII range work -->
+    <test2 xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="multitest2_1.txt" encoding="UTF-16-BE">Unicode test: ελληνικά</output>
+        <output file="multitest2_2.txt" encoding="UTF-16-LE">Special char test: &lt;&amp;></output>
+    </test2>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/implml/test.exampleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<exampleml xmlns="http://www.example.org/xml/exampleml/1">
+    <output file="test.txt">Value from ConfML: ${TestFeature.Value1}</output>
+    <output file="${TestFeature.Output1File}" encoding="${TestFeature.Output1Encoding}">Test test</output>
+    <output file="${TestFeature.Output2Dir}/${TestFeature.Output2Filename}" encoding="windows-1252">Test 1 output 2 €</output>
+</exampleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/Layer/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/test.confml#/"/>
+</confml:configuration>
Binary file configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/project/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_generation.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from testautomation.base_testcase import BaseTestCase
+from cone.public import exceptions, plugin, api, container
+
+from examplemlplugin import exampleml_reader
+
+def abspath(path):
+    return os.path.normpath(os.path.join(ROOT_PATH, path))
+
+class TestExamplemlGeneration(BaseTestCase):
+
+    def test_generate_from_project(self):
+        project_dir     = abspath('project')
+        config          = 'root.confml'
+        output_dir      = abspath('temp/output')
+        expected_dir    = abspath('gen_expected')
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration(config)
+        impls = plugin.get_impl_set(config)
+        impls.output = output_dir
+        impls.generate()
+        
+        self.assert_dir_contents_equal(output_dir, expected_dir, ['.svn'])
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from cone.public import plugin, api
+from examplemlplugin.exampleml_reader import ExamplemlReader
+from examplemlplugin.exampleml_model import Output
+
+class TestExamplemlImpl(unittest.TestCase):
+
+    def setUp(self):
+        project_dir = os.path.join(ROOT_PATH, 'project')
+        self.project = api.Project(api.Storage.open(project_dir))
+        self.config = self.project.get_configuration('root.confml')
+    
+    def get_impl(self, ref, index):
+        impl_list = plugin.ImplFactory.get_impls_from_file(ref, self.config)
+        return impl_list[index]
+    
+    def test_has_ref(self):
+        impl = self.get_impl('Layer/implml/test.exampleml', 0)
+        self.assertTrue(impl.has_ref(['TestFeature.Value1']))
+        self.assertFalse(impl.has_ref(['TestFeature.Foo']))
+        self.assertFalse(impl.has_ref(['Foo.Bar']))
+    
+    def test_list_output_files(self):
+        def oj( p2): # oj = output_join
+            return os.path.normpath(os.path.join('output', p2))
+        
+        impl = self.get_impl('Layer/implml/test.exampleml', 0)
+        self.assertEquals(impl.list_output_files(), [oj('test.txt'),
+                                                     oj('some/dir/out1.txt'),
+                                                     oj('some/dir2/out2.txt')])
+        
+        impl = self.get_impl('Layer/implml/multitest.implml', 0)
+        self.assertEquals(impl[0].list_output_files(), [oj('multitest1_1.txt'),
+                                                     oj('multitest1_2.txt')])
+        
+        impl = self.get_impl('Layer/implml/multitest.implml', 0)
+        self.assertEquals(impl[1].list_output_files(), [oj('multitest2_1.txt'),
+                                                     oj('multitest2_2.txt')])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/examplemlplugin/tests/unittest_exampleml_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+from cone.public import exceptions, plugin, api
+
+from examplemlplugin.exampleml_reader import ExamplemlReader
+from examplemlplugin.exampleml_model import Output
+
+class TestExamplemlReader(unittest.TestCase):
+    
+    NAMESPACE = ExamplemlReader.NAMESPACE
+    
+    def setUp(self):
+        self.reader = ExamplemlReader()
+    
+    def assert_read_output_equals(self, data, expected):
+        etree = ElementTree.fromstring(data)
+        output = self.reader._read_output_elem(etree)
+        self.assertEquals(expected, output)
+    
+    def test_read_output(self):
+        data = """<output file="test1.txt" encoding="UTF-16">Test</output>"""
+        self.assert_read_output_equals(data, Output('test1.txt', 'UTF-16', 'Test'))
+        
+        data = """<output file="test2.txt">Test</output>"""
+        self.assert_read_output_equals(data, Output('test2.txt', 'UTF-8', 'Test'))
+        
+        data = """<output file="test3.txt"/>"""
+        self.assert_read_output_equals(data, Output('test3.txt', 'UTF-8', ''))
+        
+        data = """<output/>"""
+        self.assertRaises(exceptions.ParseError, self.reader._read_output_elem, ElementTree.fromstring(data))
+    
+    def test_read_outputs(self):
+        data = """<?xml version="1.0" encoding="UTF-8"?>
+                <printml xmlns="%s">
+                    <output file="test1.txt" encoding="UTF-16-LE">Test 1</output>
+                    <output file="test2.txt">Test 2</output>
+                    <output file="test3.txt"/>
+                </printml>""" % self.NAMESPACE
+        outputs = self.reader._read_outputs(ElementTree.fromstring(data))
+        self.assertEquals(outputs,
+                          [Output('test1.txt', 'UTF-16-LE', 'Test 1'),
+                           Output('test2.txt', 'UTF-8', 'Test 2'),
+                           Output('test3.txt', 'UTF-8', '')])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/ConeExamplePlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,47 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from examplemlplugin import __version__
+
+setup(
+    name = "coneexamplemlplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "examplemlplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "<author>",
+    author_email = "authors.email@example.com",
+    description = "Configuration Engine ExampleML plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = True,
+    
+    # Entry point info.
+    # Plug-ins can register ImplML reader classes by adding entry points
+    # pointing to reader classes under 'cone.plugins.implmlreaders'
+    entry_points = {
+        'cone.plugins.implmlreaders': [
+            'exampleml = examplemlplugin.exampleml_reader:ExamplemlReader',
+             # More readers (e.g. different versions of the same ImplML)
+             # could also be registered:
+             #'exampleml_v2 = examplemlplugin.exampleml_reader:ExamplemlReader2',
+        ]
+    }
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/dep-eggs/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+This directory contains all library dependencies needed by any of the plug-ins as egg files.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,39 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../..'))
+assert os.path.split(PLUGIN_SOURCE_ROOT)[1] == 'plugins'
+
+# Import plugin_utils from the plug-in sources root
+if PLUGIN_SOURCE_ROOT not in sys.path: sys.path.append(PLUGIN_SOURCE_ROOT)
+import plugin_utils
+
+# Run integration test initialization
+plugin_utils.integration_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/export_standalone.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os
+from testautomation.copy_dir import copy_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+def export_standalone(target_path):
+    """
+    Export any needed extra data for standalone tests.
+    @param target_path: The path where the standalone tests are being exported.
+    """
+    # For example, one could copy test data from a plug-in into the target directory:
+    #dirs_to_copy = ['test_project_', 'test_project_2']
+    #for dir in dirs_to_copy:
+    #    copy_dir(source_dir             = os.path.join(ROOT_PATH, '../ConeExamplePlugin/examplemlplugin/tests', dir),
+    #             target_dir             = os.path.join(target_path, 'testdata/generate/test_projects', dir),
+    #             dir_ignore_functions   = [lambda d: d == '.svn'])
+    pass
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest1_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Multitest impl 1 output 1
\ No newline at end of file
Binary file configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest1_2.txt has changed
Binary file configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest2_1.txt has changed
Binary file configurationengine/source/plugins/example/integration-test/testdata/generate/expected/multitest2_2.txt has changed
Binary file configurationengine/source/plugins/example/integration-test/testdata/generate/expected/some/dir/out1.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/expected/some/dir2/out2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Test 1 output 2 €
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/expected/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Value from ConfML: ελληνικά (unicode test), <&> (special char test)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="TestFeature" version="1">
+  <feature ref="TestFeature" name="Settings for testing">
+    <setting ref="Value1" type="string"/>
+  
+    <setting ref="Output1File" type="string"/>
+    <setting ref="Output1Encoding" type="string"/>
+    
+    <setting ref="Output2Dir" type="string"/>
+    <setting ref="Output2Filename" type="string"/>
+  </feature>
+  <data>
+    <TestFeature>
+      <Value1>ελληνικά (unicode test), &lt;&amp;> (special char test)</Value1>
+    
+      <Output1File>some/dir/out1.txt</Output1File>
+      <Output1Encoding>UTF-16-LE</Output1Encoding>
+      
+      <Output2Dir>some/dir2</Output2Dir>
+      <Output2Filename>out2.txt</Output2Filename>
+    </TestFeature>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/implml/multitest.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <!-- Testing that multiple implementations in a single file works correctly -->
+    
+    <test1 xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="multitest1_1.txt" encoding="UTF-8">Multitest impl 1 output 1</output>
+        <output file="multitest1_2.txt" encoding="UTF-16-LE">Multitest impl 1 output 2</output>
+    </test1>
+    
+    <!-- Also test that special characters and unicode characters outside the ASCII range work -->
+    <test2 xmlns="http://www.example.org/xml/exampleml/1">
+        <output file="multitest2_1.txt" encoding="UTF-16-BE">Unicode test: ελληνικά</output>
+        <output file="multitest2_2.txt" encoding="UTF-16-LE">Special char test: &lt;&amp;></output>
+    </test2>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/implml/test.exampleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<exampleml xmlns="http://www.example.org/xml/exampleml/1">
+    <output file="test.txt">Value from ConfML: ${TestFeature.Value1}</output>
+    <output file="${TestFeature.Output1File}" encoding="${TestFeature.Output1Encoding}">Test test</output>
+    <output file="${TestFeature.Output2Dir}/${TestFeature.Output2Filename}" encoding="windows-1252">Test 1 output 2 €</output>
+</exampleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/testdata/generate/project/Layer/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/test.confml#/"/>
+</confml:configuration>
Binary file configurationengine/source/plugins/example/integration-test/testdata/generate/project/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/integration-test/unittest_generate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,85 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import zip_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action='generate'):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+        assert os.path.split(SOURCE_ROOT)[1] == 'source'
+        cmd = 'python "%s" %s' % (os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts/cone_tool.py')), action)
+        return cmd
+
+class TestExampleGenerate(BaseTestCase):
+    
+    def _prepare_workdir(self, workdir):
+        workdir = os.path.join(ROOT_PATH, workdir)
+        self.recreate_dir(workdir)
+        
+        # Any needed extra preparation can be done here
+        
+        return workdir
+    
+    def test_generate_on_file_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        self._run_test_generate('temp/gen1', project_dir)
+    
+    def test_generate_on_zip_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        project_zip = os.path.join(ROOT_PATH, "temp/generation_test_project.zip")
+        self.remove_if_exists(project_zip)
+        zip_dir.zip_dir(project_dir, project_zip, [zip_dir.SVN_IGNORE_PATTERN])
+        self.assert_exists_and_contains_something(project_zip)
+        
+        self._run_test_generate('temp/gen2', project_zip)
+    
+    def _run_test_generate(self, workdir, project):
+        # Create a temp workdir and go there to run the test
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir(workdir)
+        os.chdir(workdir)
+        
+        try:
+            cmd = '%s -p "%s" --output output --add-setting-file imaker_variantdir.cfg' % (get_cmd(), project)
+            self.run_command(cmd)
+            
+            EXPECTED_DIR = os.path.join(ROOT_PATH, "testdata/generate/expected")
+            self.assert_dir_contents_equal('output', EXPECTED_DIR, ['.svn'])
+        finally:
+            os.chdir(orig_workdir)
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/example/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, re, unittest
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+if __name__ == "__main__":
+    # Collect a list of plug-in source paths and plug-in module names
+    paths_and_modnames = plugin_utils.find_plugin_sources(ROOT_PATH)
+    # Create a test suite from them
+    suite = plugin_utils.collect_suite_from_source_list(paths_and_modnames)
+    # Run the suite
+    unittest.TextTestRunner(verbosity=2).run(suite)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/nose_unittests.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+[nosetests]
+verbosity=3
+include=unittest
+with-xunit=1
+xunit-file=cone-unittests.xml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/plugin_utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,317 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest, re
+import build_egg_info
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Path to the source/ directory
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '..'))
+assert os.path.split(SOURCE_ROOT)[1] == 'source'
+
+# Path to the source/plugins directory
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'plugins'))
+assert os.path.isdir(PLUGIN_SOURCE_ROOT)
+
+def plugin_test_init(root_path, plugin_source_relative_path='../..'):
+    """
+    Initialize things so that plug-in unit tests can be run.
+    
+    @param root_path: Path of the __init__.py file calling this function. 
+    @param plugin_source_relative_path: Path to the plug-in's source root relative
+        to root_path. Usually this should be '../..', since this function is intended
+        to be called from a plug-in's tests/__init__.py file.
+    
+    """
+    # Add paths so that the unit tests work
+    # -------------------------------------
+    extra_paths = [
+        # For module 'cone'
+        SOURCE_ROOT,
+        
+        # For module 'testautomation'
+        os.path.join(SOURCE_ROOT, 'testautomation'),
+        
+        # For the plug-in module.
+        # Since the method is expected to be called from e.g.
+        # source/plugins/ConeSomePlugin/someplugin/tests/__init__.py, this will then be
+        # source/plugins/ConeSomePlugin, in which case the module 'someplugin' can be
+        # imported
+        os.path.join(root_path, plugin_source_relative_path)
+    ]
+    for p in extra_paths:
+        p = os.path.normpath(p)
+        if p not in sys.path: sys.path.append(p)
+    
+    # Generate egg-info for the plug-in.
+    # The egg-info needs to be up-to-date, or the plug-in framework will not be able
+    # to find the plug-in's ImplML reader classes
+    plugin_path = os.path.normpath(os.path.join(root_path, plugin_source_relative_path))
+    assert 'setup.py' in os.listdir(plugin_path), "Path '%s' does not contain 'setup.py" % plugin_path
+    build_egg_info.generate_egg_info(plugin_path)
+
+def integration_test_init(root_path):
+    """
+    Initialize things so that integration tests can be run.
+    
+    This function is intended to be called from a sub-package's integration-test/__init__.py file.
+    @param root_path: Path of the __init__.py file calling this function.
+    """
+    # Add paths so that the unit tests work
+    # -------------------------------------
+    extra_paths = [
+        # For module 'cone' (may be needed in some tests for e.g. asserts)
+        SOURCE_ROOT,
+        
+        # For module 'testautomation'
+        os.path.join(SOURCE_ROOT, 'testautomation'),
+    ]
+    for p in extra_paths:
+        p = os.path.normpath(p)
+        if p not in sys.path: sys.path.append(p)
+    
+    # Collect plug-in source paths (common + current)
+    temp = []
+    temp += [path for path, _ in find_plugin_sources(os.path.join(PLUGIN_SOURCE_ROOT, 'common'))]
+    temp += [path for path, _ in find_plugin_sources(os.path.normpath(os.path.join(root_path, '..')))]
+    plugin_paths = []
+    for p in temp:
+        if p not in plugin_paths: plugin_paths.append(p)
+    
+    # Add things to PYTHONPATH so that running cone_tool.py works
+    paths = []
+    paths.append(SOURCE_ROOT) # For module 'cone'
+    paths.extend(plugin_paths)
+    os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ';' + ';'.join(paths)
+    
+    # Generate egg-info for the plug-ins.
+    # The egg-info needs to be up-to-date, or the plug-in framework will not be able
+    # to find the plug-in's ImplML reader classes
+    for p in plugin_paths:
+        assert 'setup.py' in os.listdir(p), "Path '%s' does not contain 'setup.py" % p
+        build_egg_info.generate_egg_info(p)
+
+def init_all():
+    """
+    Add all plug-ins to sys.path and PYTHONPATH so that running all
+    plug-in unit tests and integration tests work.
+    """
+    # Find all plug-in source directories
+    plugin_paths = []
+    temp = find_all_plugin_sources(os.path.join(PLUGIN_SOURCE_ROOT))
+    for package_name, sources in temp.iteritems():
+        for path, modname in sources:
+            plugin_paths.append(path)
+    
+    # Add paths so that the unit tests work
+    # -------------------------------------
+    extra_paths = [
+        # For module 'cone' (may be needed in some tests for e.g. asserts)
+        SOURCE_ROOT,
+        
+        # For module 'testautomation'
+        os.path.join(SOURCE_ROOT, 'testautomation'),
+    ] + plugin_paths
+    for p in extra_paths:
+        p = os.path.normpath(p)
+        if p not in sys.path: sys.path.append(p)
+    
+    # Add things to PYTHONPATH so that running cone_tool.py works
+    paths = []
+    paths.append(SOURCE_ROOT) # For module 'cone'
+    paths.extend(plugin_paths)
+    os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ';' + ';'.join(paths)
+    
+    # Generate egg-info for the plug-ins.
+    # The egg-info needs to be up-to-date, or the plug-in framework will not be able
+    # to find the plug-in's ImplML reader classes
+    for p in plugin_paths:
+        assert 'setup.py' in os.listdir(p), "Path '%s' does not contain 'setup.py" % p
+        build_egg_info.generate_egg_info(p)
+
+def collect_test_suite_from_dir(root_path):
+    """
+    Return a test suite containing all tests in 'unittest_*.py' files under the given directory.
+    """
+    # Find all unittest_*.py files in the folder
+    test_modules = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(root_path))
+    # Strip .py endings
+    test_modules = map(lambda name: name[:-3], test_modules)
+    
+    # Add the root path as the first one in sys.path, so that
+    # __import__() checks that first when attempting to import a module 
+    sys.path.insert(0, root_path)
+    
+    try:
+        suite = unittest.TestSuite()
+        for test_module in test_modules:
+            # Load the test module dynamically and add it to the test suite
+            module = __import__(test_module)
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        # Remove root_path from sys.path
+        del sys.path[0]
+
+def collect_suite_from_source_list(paths_and_modnames):
+    suite = unittest.TestSuite()
+    
+    # Add the source paths to sys.path
+    for path, modname in paths_and_modnames:
+        if path not in sys.path:
+            sys.path.append(path)
+    
+    # Import the tests in a separate loop, because otherwise the ImplML reader classes
+    # could be loaded before all plug-ins are in sys.path
+    for path, modname in paths_and_modnames:
+        try:
+            m = __import__(modname + '.tests')
+            suite.addTests(m.tests.collect_suite())
+        except ImportError:
+            print "Tests for '%s' not added, no 'tests' module found" % path
+    
+    return suite
+
+def get_plugin_module_name(plugin_src_path):
+    """
+    Return the name of the plug-in's module under given plug-in source path.
+    
+    >>> get_tests_module('source/plugins/common/ConeContentPlugin')
+    'contentplugin'
+    >>> get_tests_module('foo')
+    None
+    """
+    if not os.path.isdir(plugin_src_path):
+        return None
+    
+    for name in os.listdir(plugin_src_path):
+        path = os.path.join(plugin_src_path, name)
+        if os.path.isdir(path) and '__init__.py' in os.listdir(path):
+            return name
+    return None
+
+def find_plugin_sources(subpackage_root_path):
+    """
+    Return ConE plug-in source directories from the given path.
+    
+    All sub-directories in subpackage_root_path of the form Cone*Plugin/ containing
+    a sub-directory that is a python module are returned.
+    
+    @param path: The directory from where to find the entries.
+    @return: A list of tuples, each containing (<source_dir>, <module_name>).
+    """
+    pattern = re.compile(r'^Cone.*Plugin$')
+    
+    # Collect a list of plug-in source paths and plug-in module names
+    result = []
+    for name in os.listdir(subpackage_root_path):
+        path = os.path.join(subpackage_root_path, name)
+        if pattern.match(name) is not None:
+            modname = get_plugin_module_name(path)
+            if modname is not None:
+                result.append((path, modname))
+    return result
+
+def find_all_plugin_sources(plugins_root_path):
+    """
+    Return all ConE plug-in source directories from the plugins/ root
+    directory.
+    @return: A dictionary containing the output of find_plugin_sources() by
+        plug-in sub-packages.
+    >>> find_all_plugin_sources('C:/work/cone-trunk/source/plugins')
+    {'common': [('C:/work/cone-trunk/source/plugins/common/ConeContentPlugin', 'contentplugin'),
+                ('C:/work/cone-trunk/source/plugins/common/ConeTemplatePlugin', 'templatemlplugin')],
+     'example': [('C:/work/cone-trunk/source/plugins/example/ConeExamplePlugin', 'examplemlplugin')]}
+    """
+    result = {}
+    for name in os.listdir(plugins_root_path):
+        path = os.path.join(plugins_root_path, name)
+        if os.path.isdir(path):
+            sources = find_plugin_sources(path)
+            if sources: result[name] = sources
+    return result
+
+def find_plugin_package_subpaths(subpath, package_name=None):
+    """
+    Return a list of plug-in package sub-paths based on the given plug-in package name.
+    
+    The returned list always contains the sub-path for common plug-ins, and
+    additionally for an extra plug-in package based on the given package name.
+    
+    This function can be used to find specifically named files or directories
+    under the plug-in paths. E.g. find all 'integration-test' directories:
+    
+    >>> find_plugin_package_subpaths('integration-test', 'symbian')
+    [('common',  'C:\\cone\\trunk\\sources\\plugins\\common\\integration-test'),
+     ('symbian', 'C:\\cone\\trunk\\sources\\plugins\\symbian\\integration-test')]
+    
+    @param package_name: Name of the extra plug-in package. Can be None, '',
+        'common' or an existing plug-in package.
+    @return: List of tuples (package_name, subpath).
+    
+    @raise ValueError: The given package_name was invalid.
+    """
+    result = []
+    
+    def add(package_name):
+        package_dir = os.path.join(PLUGIN_SOURCE_ROOT, package_name)
+        
+        if not os.path.exists(package_dir):
+            raise ValueError("Invalid plug-in package name: '%s'" % package_name)
+        
+        path = os.path.normpath(os.path.join(package_dir, subpath))
+        if os.path.exists(path):
+            result.append((package_name, path))
+    
+    add('common')
+    if package_name not in (None, '', 'common'):
+        add(package_name)
+    
+    return result
+    
+
+def find_plugin_sources_by_package(package_name=None):
+    """
+    Return a list of plug-in source paths based on the given plug-in package name.
+    
+    The returned list always contains sources of common plug-ins, and
+    additionally extra plug-in sources based on the given package name.
+    
+    @param package_name: Name of the extra plug-in package. Can be None, '',
+        'common' or an existing plug-in package.
+    @raise ValueError: The given package_name was invalid.
+    """
+    result = []
+    
+    # Find all plug-in sources
+    sources = find_all_plugin_sources(PLUGIN_SOURCE_ROOT)
+    
+    # Always return common plug-ins
+    if 'common' in sources:
+        for path, modname in sources['common']:
+            result.append(path)
+    
+    # Return extra plug-ins if necessary
+    if package_name not in (None, '', 'common'):
+        if package_name not in sources:
+            raise ValueError("Invalid plug-in package name: '%s'" % package_name)
+        else:
+            for path, modname in sources[package_name]:
+                result.append(path)
+    
+    return result
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+This directory contains ConE plug-in packages.
+
+Each package is a sub-directory here, and plugin_utils.py contains utility
+functions for dealing with e.g. running plug-in tests.
+
+For more information see the ConE documentation.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, re, unittest
+import plugin_utils
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+if __name__ == "__main__":
+    # Collect a list of plug-in source paths and plug-in module names
+    sources = plugin_utils.find_all_plugin_sources(ROOT_PATH)
+    
+    # Flatten the source list
+    flattened_sources = []
+    for subpackage_name, paths_and_modnames in sources.iteritems():
+        flattened_sources.extend(paths_and_modnames)
+    
+    # Create a test suite from them
+    suite = plugin_utils.collect_suite_from_source_list(flattened_sources)
+    
+    # Run the suite
+    unittest.TextTestRunner(verbosity=2).run(suite)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
+import pkg_resources 
+import sys,os
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_comparator.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,324 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import logging
+from cone.public import plugin
+from crml_model import *
+
+class CrmlComparator(object):
+    def __init__(self, resource_ref, repo):
+        self.logger = logging.getLogger('cone.crml.comparator(%s)' % resource_ref)
+        self.resource_ref = resource_ref
+        self.repo = repo
+    
+    @classmethod
+    def get_flat_comparison_id(cls, repo):
+        """
+        Return the flat comparison ID for the given repository.
+        """
+        return cls._num_to_str(repo.uid_value)
+    
+    @classmethod
+    def get_flat_comparison_extra_data(cls, repo):
+        return {'repo': repo}
+    
+    @classmethod
+    def _num_to_str(cls, number):
+        if isinstance(number, basestring):
+            try:
+                number = long(number, 10)
+            except ValueError:
+                number = long(number, 16)
+        return "0x%08X" % number
+    
+    def flat_compare(self, target_resource_ref, target_repo):
+        """
+        Compare two CRML repository models.
+        @return: A plugin.FlatComparisonResult object.
+        """
+        source_repo = self.repo
+        
+        result = plugin.FlatComparisonResult()
+        
+        source_repo_uid = self._num_to_str(source_repo.uid_value)
+        target_repo_uid = self._num_to_str(target_repo.uid_value)
+        
+        if source_repo_uid != target_repo_uid:
+            raise RuntimeError("Comparing CRML implementations instances that don't have the same repository UID (%r vs. %r)" % (source_repo_uid, target_repo_uid))
+        
+        # Default field contents for new entries
+        default_field_content = {
+            'data'      : {}}
+        
+        Entry = plugin.FlatComparisonResultEntry
+        
+        if self.resource_ref != target_resource_ref:
+            result.modified.append(Entry(value_id       = 'file',
+                                         source_value   = self.resource_ref,
+                                         target_value   = target_resource_ref,
+                                         data           = {'source_repo': source_repo,
+                                                           'target_repo': target_repo}))
+        
+        # Compare repository attributes
+        # -----------------------------
+        repo_mods = self._flat_compare_object_attrs(
+            key_id      = None,
+            source_obj  = source_repo,
+            target_obj  = target_repo,
+            varnames    = ('uid_name', 'owner', 'backup', 'rfs', 'access'))
+        content = default_field_content.copy()
+        content['data'] = {'source_repo': source_repo,
+                           'target_repo': target_repo}
+        self._fill_in_entry_fields(repo_mods, content)
+        result.modified.extend(repo_mods)
+        
+        source_data = self._get_flat_comparison_data(source_repo)
+        target_data = self._get_flat_comparison_data(target_repo)
+        
+        # Find entries only in source
+        # ---------------------------
+        for id, crml_key in source_data.iteritems():
+            if id not in target_data:
+                data = {'repo': source_repo,
+                        'key':  crml_key}
+                result.only_in_source.append(Entry(sub_id=id, data=data))
+        
+        # Find entries only in target
+        # ---------------------------
+        for id, crml_key in target_data.iteritems():
+            if id not in source_data:
+                data = {'repo': source_repo,
+                        'key':  crml_key}
+                result.only_in_target.append(Entry(sub_id=id, data=data))
+        
+        # Find differing entries
+        # ----------------------
+        for id, source_key in source_data.iteritems():
+            if id not in target_data: continue
+            target_key = target_data[id]
+            if source_key == target_key: continue
+            
+            # Get the comparison result for the key
+            comp_result = self._get_flat_key_comparison_result(id, source_key, target_key)
+            
+            # Fill in the missing fields of the result entries
+            content = default_field_content.copy()
+            content['data'] = {'repo'   : source_repo,
+                               'key'    : source_key}
+            self._fill_in_entry_fields(comp_result.only_in_source, content)
+            
+            content = default_field_content.copy()
+            content['data'] = {'repo'   : target_repo,
+                               'key'    : target_key}
+            self._fill_in_entry_fields(comp_result.only_in_target,  content)
+            
+            content = default_field_content.copy()
+            content['data'] = {'source_repo'    : source_repo,
+                               'target_repo'    : target_repo,
+                               'source_key'     : source_key,
+                               'target_key'     : target_key}
+            self._fill_in_entry_fields(comp_result.modified, content)
+            
+            result.extend(comp_result)
+        
+        return result
+    
+    def _fill_in_entry_fields(self, entry_list, field_contents):
+        for entry in entry_list:
+            for varname, value in field_contents.iteritems():
+                if getattr(entry, varname) is None:
+                    setattr(entry, varname, value)
+    
+    def _get_flat_comparison_data(self, repository):
+        """
+        Return a dictionary containing all keys in the repository.
+        
+        The dictionary will have the CRML key UIDs as the dictionary keys and
+        the CRML key objects as the values.
+        """
+        data = {}
+        for key in repository.keys:
+            if isinstance(key, (CrmlSimpleKey, CrmlBitmaskKey)):
+                id = self._num_to_str(key.int)
+            elif isinstance(key, CrmlKeyRange):
+                id = self._num_to_str(key.first_int) + '-' + self._num_to_str(key.last_int)
+            data[id] = key
+        return data
+    
+    def _get_flat_key_comparison_result(self, key_id, source_key, target_key):
+        """
+        Return a flat comparison result for a source and target CRML key pair.
+        
+        @param key_id: The ID of the key, e.g. '0x00000001' for a simple key or
+            '0x00001000-0x00001FFF' for a key range.
+        @param source_key: The source key object.
+        @param target_key: The target key object.
+        @return: A plugin.FlatComparisonResult object.
+        """
+        result = plugin.FlatComparisonResult()
+        
+        if type(source_key) == type(target_key):
+            comp_funcs = {CrmlSimpleKey:   self._flat_compare_simple_keys,
+                          CrmlBitmaskKey:  self._flat_compare_bitmask_keys,
+                          CrmlKeyRange:    self._flat_compare_key_ranges}
+            func = comp_funcs[type(source_key)]
+            result.extend(func(key_id, source_key, target_key))
+        else:
+            # Perform base key comparison
+            result.modified.extend(self._flat_compare_base_keys(key_id, source_key, target_key))
+            
+            # Add an entry for key type change
+            type_ids = {CrmlSimpleKey:  'simple_key',
+                        CrmlBitmaskKey: 'bitmask_key',
+                        CrmlKeyRange:   'key_range'}
+            entry = plugin.FlatComparisonResultEntry(
+                sub_id       = key_id,
+                value_id     = 'key_type',
+                source_value = type_ids[type(source_key)],
+                target_value = type_ids[type(target_key)])
+            result.modified.append(entry)
+        
+        return result
+    
+    def _flat_compare_object_attrs(self, key_id, source_obj, target_obj, varnames):
+        result = []
+        for varname in varnames:
+            sval = getattr(source_obj, varname)
+            tval = getattr(target_obj, varname)
+            
+            if sval != tval:
+                if isinstance(sval, CrmlAccess):
+                    result.extend(self._flat_compare_object_attrs(
+                          key_id, sval, tval,
+                          ('cap_rd', 'cap_wr', 'sid_rd', 'sid_wr')))
+                else:
+                    entry = plugin.FlatComparisonResultEntry(
+                        sub_id       = key_id,
+                        value_id     = varname,
+                        source_value = sval,
+                        target_value = tval)
+                    result.append(entry)
+        return result
+    
+    def _flat_compare_base_keys(self, key_id, source_key, target_key, extra_varnames=[]):
+        varnames = ['name', 'backup', 'read_only', 'access']
+        varnames.extend(extra_varnames)
+        return self._flat_compare_object_attrs(key_id, source_key, target_key, varnames)
+    
+    def _flat_compare_simple_keys(self, key_id, source_key, target_key):
+        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
+                                           extra_varnames=['ref', 'type'])
+        return plugin.FlatComparisonResult(modified=mod)
+    
+    def _flat_compare_bitmask_keys(self, key_id, source_key, target_key):
+        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
+                                           extra_varnames=['type'])
+        only_in_source = []
+        only_in_target = []
+        
+        def get_bits_dict(key):
+            bits = {}
+            for bit in key.bits:
+                bits[bit.index] = bit
+            return bits
+        
+        src_bits = get_bits_dict(source_key)
+        tgt_bits = get_bits_dict(target_key)
+        
+        # Find bits only in source
+        # ------------------------
+        for index in src_bits.iterkeys():
+            if index not in tgt_bits:
+                entry = plugin.FlatComparisonResultEntry(
+                    sub_id = "%s (bit %s)" % (key_id, index))
+                only_in_source.append(entry)
+        
+        # Find bits only in target
+        # ------------------------
+        for index in tgt_bits.iterkeys():
+            if index not in src_bits:
+                entry = plugin.FlatComparisonResultEntry(
+                    sub_id = "%s (bit %s)" % (key_id, index))
+                only_in_target.append(entry)
+        
+        # Find modified bits
+        # ------------------
+        for index, src_bit in src_bits.iteritems():
+            if index not in tgt_bits: continue
+            tgt_bit = tgt_bits[index]
+            
+            mod.extend(self._flat_compare_object_attrs(
+                key_id      = "%s (bit %s)" % (key_id, index),
+                source_obj  = src_bit,
+                target_obj  = tgt_bit,
+                varnames    = ('ref', 'invert')))
+        
+        return plugin.FlatComparisonResult(modified         = mod,
+                                           only_in_source   = only_in_source,
+                                           only_in_target   = only_in_target)
+    
+    def _flat_compare_key_ranges(self, key_id, source_key, target_key):
+        mod = self._flat_compare_base_keys(key_id, source_key, target_key,
+                                           extra_varnames=['ref', 'index_bits', 'first_index'])
+        only_in_source = []
+        only_in_target = []
+        
+        # Use hexadecimal format for index bits
+        for entry in mod:
+            if entry.value_id == 'index_bits':
+                entry.source_value = self._num_to_str(entry.source_value)
+                entry.target_value = self._num_to_str(entry.target_value)
+        
+        def get_subkeys_dict(key):
+            subkeys = {}
+            for sk in key.subkeys:
+                subkeys[sk.int] = sk
+            return subkeys
+        
+        src_subkeys = get_subkeys_dict(source_key)
+        tgt_subkeys = get_subkeys_dict(target_key)
+        
+        # Find sub-keys only in source
+        # ----------------------------
+        for uid in src_subkeys.iterkeys():
+            if uid not in tgt_subkeys:
+                entry = plugin.FlatComparisonResultEntry(
+                    sub_id = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)))
+                only_in_source.append(entry)
+        
+        # Find sub-keys only in target
+        # ----------------------------
+        for uid in tgt_subkeys.iterkeys():
+            if uid not in src_subkeys:
+                entry = plugin.FlatComparisonResultEntry(
+                    sub_id = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)))
+                only_in_target.append(entry)
+        
+        # Find modified bits
+        # ------------------
+        for uid, src_subkey in src_subkeys.iteritems():
+            if uid not in tgt_subkeys: continue
+            tgt_subkey = tgt_subkeys[uid]
+            
+            mod.extend(self._flat_compare_object_attrs(
+                key_id      = "%s (sub-key %s)" % (key_id, self._num_to_str(uid)),
+                source_obj  = src_subkey,
+                target_obj  = tgt_subkey,
+                varnames    = ('ref', 'type', 'name')))
+        
+        return plugin.FlatComparisonResult(modified         = mod,
+                                           only_in_source   = only_in_source,
+                                           only_in_target   = only_in_target)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,148 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os
+import sys
+import logging
+
+from cone.public import exceptions, plugin, utils, api
+import crml_writer, crml_comparator
+from crml_model import *
+
+class CrmlImpl(plugin.ImplBase):
+    IMPL_TYPE_ID = 'crml'
+    
+    RFS_RECORDS_LIST_VARNAME = 'crml_cenrep_rfs_records_list'
+    RFS_TXT_GENERATED_VARNAME = 'crml_cenrep_rfs_txt_generated'
+
+    def __init__(self, resource_ref, configuration, repository):
+        plugin.ImplBase.__init__(self, resource_ref, configuration)
+        self.resource_ref = resource_ref
+        self.configuration = configuration
+        self.logger = logging.getLogger('cone.crml(%s)' % self.resource_ref)
+        self.repository = repository
+        
+    def generate(self, context=None):
+        # Quick fix 
+        if context:
+            self.generation_context = context
+        file_path = self._get_cenrep_txt_file_path()
+        self.logger.debug("Generating file '%s'..." % file_path)
+        
+        # Generate CenRep text data and write it to the output file
+        writer = crml_writer.CrmlTxtWriter(self.configuration, self.logger)
+        data = writer.get_cenrep_txt_data(self.repository).encode('UTF-16')
+        self._write_to_file(file_path, data)
+        
+        
+        # Collect the record for cenrep_rfs.txt generation in post_generate()
+        if self.generation_context is not None:
+            rfs_record = writer.get_cenrep_rfs_record(self.repository)
+            if rfs_record:
+                # Add the record to the dictionary
+                data_dict = self.generation_context.impl_data_dict
+                VARNAME = self.RFS_RECORDS_LIST_VARNAME
+                if VARNAME not in data_dict:
+                    data_dict[VARNAME] = []
+                data_dict[VARNAME].append(rfs_record)
+    
+    def post_generate(self, context=None):
+        # Quick fix 
+        if context:
+            self.generation_context = context
+        if self._is_cenrep_rfs_txt_to_be_generated():
+            # Generate CenRep RFS text file if not already generated
+            data_dict = self.generation_context.impl_data_dict
+            if self.RFS_TXT_GENERATED_VARNAME not in data_dict:
+                rfs_records = data_dict.get(self.RFS_RECORDS_LIST_VARNAME, [])
+                
+                file_path = self._get_cenrep_rfs_txt_file_path()
+                writer = crml_writer.CrmlTxtWriter(self.configuration, self.logger)
+                data = writer.get_cenrep_rfs_txt_data(rfs_records).encode('UTF-16')
+                self._write_to_file(file_path, data)
+            
+                data_dict[self.RFS_TXT_GENERATED_VARNAME] = True
+
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        files = [self._get_cenrep_txt_file_path()]
+        if self._is_cenrep_rfs_txt_to_be_generated():
+            files.append(self._get_cenrep_rfs_txt_file_path())
+        return files
+
+    def get_refs(self):
+        if self.repository is None:
+            return []
+        else:
+            return self.repository.get_refs()
+    
+    def get_flat_comparison_id(self):
+        return crml_comparator.CrmlComparator.get_flat_comparison_id(self.repository)
+    
+    def get_flat_comparison_extra_data(self):
+        return crml_comparator.CrmlComparator.get_flat_comparison_extra_data(self.repository)
+    
+    @classmethod
+    def get_flat_comparison_impl_type_id(cls):
+        return 'crml'
+    
+    def flat_compare(self, other):
+        comparator = crml_comparator.CrmlComparator(self.resource_ref, self.repository)
+        return comparator.flat_compare(other.resource_ref, other.repository)
+    
+    def _get_cenrep_txt_file_path(self):
+        """
+        Return the full path to the CenRep text file generated by this implementation
+        """
+        uid = self.repository.uid_value
+        if uid.startswith('0x'):    uid = uid[2:]
+        return os.path.normpath(os.path.join(self.output, uid + '.txt'))
+    
+    def _get_cenrep_rfs_txt_file_path(self):
+        """
+        Return the full path to the CenRep RFS text file
+        """
+        # cenrep_rfs.txt goes to a different place than the rest of
+        # the CenRep files, so temporarily override plugin_output
+        # for that purpose
+        orig_pluginoutput = self.plugin_output
+        self.plugin_output = 'private/100059C9'
+        rfs_txt_path = os.path.normpath(os.path.join(self.output, 'cenrep_rfs.txt'))
+        self.plugin_output = orig_pluginoutput
+        return rfs_txt_path
+    
+    def _is_cenrep_rfs_txt_to_be_generated(self):
+        """
+        Return whether the CenRep RFS text file is to be generated.
+        """
+        if self.generation_context is None:
+            return False
+        
+        targets = self.generation_context.tags.get('target', [])
+        return 'core' in targets or 'rofs2' in targets
+    
+    def _write_to_file(self, file_path, data):
+        # Create directories for the file if necessary
+        file_dir = os.path.dirname(file_path)
+        if file_dir != '' and not os.path.exists(file_dir):
+            os.makedirs(file_dir)
+        
+        # Write data
+        f = open(file_path, "wb")
+        try:        f.write(data)
+        finally:    f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,222 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+class _CrmlObjectBase(object):
+    """
+    Common utility base class for all CRML objects for implementing
+    operations like repr(), copy() etc.
+    """
+    
+    # Variable names used in simple object equality comparison
+    SIMPLE_EQ_VARNAMES = []
+
+    def __repr__(self):
+        return "%s(**%r)" % (self.__class__.__name__, vars(self))
+    
+    def __get_filtered_dict(self, source_dict, allowed_keys):
+        result = {}
+        for key in allowed_keys:
+            if key in source_dict:
+                result[key] = source_dict[key]
+        return result
+    
+    def __eq__(self, other):
+        # 1. Compare type
+        if type(self) is not type(other):
+            return False
+        
+        # 2. Compare all members that can be simply compared using ==
+        varnames = self.__class__.SIMPLE_EQ_VARNAMES
+        dict_self   = self.__get_filtered_dict(vars(self), varnames)
+        dict_other  = self.__get_filtered_dict(vars(other), varnames)
+        if dict_self != dict_other:
+            return False
+        
+        # 3. Do any extra comparing
+        if not self._do_extra_eq_handling(other):
+            return False
+        
+        return True
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def _do_extra_eq_handling(self, other):
+        """
+        If sub-classes need to do any extra handling in __eq__(), they
+        should implement this method and do it here.
+        @return: True if self is equal to other, False if not.
+        """
+        return True
+    
+    def copy(self):
+        """
+        Return a deep copy of this object.
+        """
+        new_obj = self.__class__(**vars(self))
+        self._do_extra_copy_handling(new_obj)
+        return new_obj
+    
+    def _do_extra_copy_handling(self, new_object):
+        """
+        If sub-classes need to do any extra handling in copy(), they
+        should implement this method and do it here.
+        @param new_object: The new copied object, a shallow copy at this point.
+        """
+        return
+
+class CrmlAccess(_CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['cap_rd', 'cap_wr', 'sid_rd', 'sid_wr']
+
+    def __init__(self, **kwargs):
+        self.cap_rd = kwargs.get('cap_rd')
+        self.cap_wr = kwargs.get('cap_wr')
+        self.sid_rd = kwargs.get('sid_rd')
+        self.sid_wr = kwargs.get('sid_wr')
+
+
+class CrmlRepository(_CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['uid_value', 'uid_name', 'owner', 'backup', 'rfs', 'access', 'keys', 'version']
+    
+    def __init__(self, **kwargs):
+        self.uid_value  = kwargs.get('uid_value')
+        self.uid_name   = kwargs.get('uid_name')
+        self.owner      = kwargs.get('owner')
+        self.backup     = kwargs.get('backup', False)
+        self.rfs        = kwargs.get('rfs', False)
+        self.access     = kwargs.get('access', CrmlAccess())
+        self.keys       = kwargs.get('keys', [])
+        self.version    = kwargs.get('version', '1')
+
+    def _do_extra_copy_handling(self, new_object):
+        new_keys = []
+        for key in new_object.keys:
+            new_keys.append(key.copy())
+        new_object.keys = new_keys
+        
+        self.access = new_object.access.copy()
+    
+    def get_refs(self):
+        result = []
+        for key in self.keys:
+            result.extend(key.get_refs())
+        return result
+
+class CrmlKeyBase(object):
+    def __init__(self, **kwargs):
+        self.ref        = kwargs.get('ref')
+        self.name       = kwargs.get('name')
+        self.backup     = kwargs.get('backup', False)
+        self.read_only  = kwargs.get('read_only', False)
+        self.access     = kwargs.get('access', CrmlAccess())
+
+class CrmlSimpleKey(CrmlKeyBase, _CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['ref', 'name', 'int', 'type', 'backup', 'read_only', 'access']
+    
+    def __init__(self, **kwargs):
+        CrmlKeyBase.__init__(self, **kwargs)
+        try:
+            self.ref    = kwargs['ref']
+            self.int    = kwargs['int']
+            self.type   = kwargs.get('type', 'int')
+        except KeyError, e:
+            raise ValueError("Mandatory argument '%s' not given!" % e.message)
+    
+    def _do_extra_copy_handling(self, new_object):
+        self.access = new_object.access.copy()
+    
+    def get_refs(self):
+        return [self.ref]
+
+class CrmlBitmaskKey(CrmlKeyBase, _CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['int', 'type', 'backup', 'read_only', 'access', 'name', 'bits']
+    
+    def __init__(self, **kwargs):
+        CrmlKeyBase.__init__(self, **kwargs)
+        try:
+            self.int    = kwargs['int']
+            self.type   = kwargs.get('type', 'int')
+            self.bits   = kwargs.get('bits', [])
+        except KeyError, e:
+            raise ValueError("Mandatory argument '%s' not given!" % e.message)
+    
+    def _do_extra_copy_handling(self, new_object):
+        new_bits = []
+        for bit in new_object.bits:
+            new_bits.append(bit.copy())
+        new_object.bits = new_bits
+        
+        self.access = new_object.access.copy()
+    
+    def get_refs(self):
+        return [bit.ref for bit in self.bits]
+
+class CrmlBit(_CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['ref', 'index', 'invert']
+    
+    def __init__(self, **kwargs):
+        try:
+            self.ref    = kwargs['ref']
+            self.index  = kwargs['index']
+            self.invert = kwargs.get('invert', False)
+        except KeyError, e:
+            raise ValueError("Mandatory argument '%s' not given!" % e.message)
+
+class CrmlKeyRange(CrmlKeyBase, _CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['ref', 'name', 'first_int', 'last_int', 'first_index', 'index_bits', 'count_int', 'backup', 'read_only', 'access', 'subkeys']
+    
+    def __init__(self, **kwargs):
+        CrmlKeyBase.__init__(self, **kwargs)
+        try:
+            self.first_int      = kwargs['first_int']
+            self.last_int       = kwargs['last_int']
+            self.first_index    = kwargs.get('first_index', 0)
+            self.index_bits     = kwargs.get('index_bits')
+            self.count_int      = kwargs.get('count_int')
+            self.subkeys        = kwargs.get('subkeys', [])
+        except KeyError, e:
+            raise ValueError("Mandatory argument '%s' not given!" % e.message)
+    
+    def _do_extra_copy_handling(self, new_object):
+        new_subkeys = []
+        for subkey in new_object.subkeys:
+            new_subkeys.append(subkey.copy())
+        new_object.subkeys = new_subkeys
+        
+        self.access = new_object.access.copy()
+    
+    def get_refs(self):
+        if self.ref is not None:
+            refs = [self.ref]
+            for sk in self.subkeys:
+                refs.append(self.ref + '.' + sk.ref)
+            return refs
+        else:
+            return []
+            
+
+class CrmlKeyRangeSubKey(_CrmlObjectBase):
+    SIMPLE_EQ_VARNAMES = ['ref', 'name', 'type', 'int']
+
+    def __init__(self, **kwargs):
+        try:
+            self.ref    = kwargs['ref']
+            self.type   = kwargs['type']
+            self.int    = kwargs['int']
+            self.name   = kwargs.get('name')
+        except KeyError, e:
+            raise ValueError("Mandatory argument '%s' not given!" % e.message)
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,206 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+from cone.public import exceptions, plugin
+import crml_impl
+from crml_model import *
+
+
+def get_required_attr(elem, attrname):
+    """
+    Get a required attribute from an XML element or raise an exception.
+    """
+    attr = elem.get(attrname)
+    if attr is None:
+        raise exceptions.ParseError("<%s> element does not have the required '%s' attribute!" % (elem.tag, attrname))
+    return attr
+
+def convert_num(string):
+    """
+    Convert the given string into a number.
+    
+    - The number can be in decimal or hexadecimal format.
+    - If None is passed, None is also returned.
+    """
+    if string in ('', None):
+        return None
+    try:
+        return long(string)
+    except ValueError:
+        return long(string, 16)
+
+class CrmlReader(plugin.ReaderBase):
+    NAMESPACE = 'http://www.s60.com/xml/cenrep/1'
+    FILE_EXTENSIONS = ['crml']
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = CrmlReader()
+        repository = reader.read_repository(etree)
+        return crml_impl.CrmlImpl(resource_ref, configuration, repository)
+    
+    def read_repository(self, elem):
+        """
+        Read a CrmlRepository object from the given XML element.
+        """
+        # Read repository attributes
+        repo = CrmlRepository(
+            uid_value = elem.get('uidValue'),
+            uid_name  = elem.get('uidName'),
+            owner     = elem.get('owner'),
+            version   = elem.get('initialisationFileVersion', '1'),
+            access    = self.read_access(elem))
+        if elem.get('backup') == 'true':    repo.backup = True
+        if elem.get('rfs') == 'true':       repo.rfs = True
+        
+        # Read all keys
+        for sub_elem in elem:
+            key_obj = self.read_key(sub_elem)
+            
+            if key_obj is not None:
+                # Read-only keys have always cap_wr=AlwaysFail.
+                # the isinstance() check is for CT2 output compatibility
+                if not isinstance(key_obj, CrmlKeyRange):
+                    if key_obj.read_only:
+                        key_obj.access.cap_wr = 'AlwaysFail'
+                        key_obj.access.sid_wr = None
+                
+                repo.keys.append(key_obj)
+        
+        if repo.access == CrmlAccess(cap_rd='AlwaysPass') and len(repo.keys) == 0:
+            repo.access.cap_rd = None
+        
+        return repo
+    
+    def read_access(self, elem):
+        """
+        Read a CrmlAccess object from the given XML element.
+        @param elem: The element from which to parse an access definition. Should be any
+            element that can contain an access definition (i.e. 'repository', 'key', or 'keyRange').
+        """
+        access = CrmlAccess()
+        read_cap_found = False
+        write_cap_found = False
+        for access_elem in elem.findall('{%s}access' % self.NAMESPACE):
+            type = access_elem.get('type')
+            if type == 'R' and not read_cap_found:
+                access.cap_rd = access_elem.get('capabilities')
+                access.sid_rd = access_elem.get('sid')
+                read_cap_found = True
+            elif type == 'W' and not write_cap_found:
+                access.cap_wr = access_elem.get('capabilities')
+                access.sid_wr = access_elem.get('sid')
+                write_cap_found = True
+        
+        return access
+    
+    def read_common_key_attrs(self, key_elem, key_obj):
+        """
+        Read common attributes into an object of class CrmlKeyBase from an XML element.
+        """
+        if not isinstance(key_obj, CrmlKeyBase):
+            raise ValueError("Expected object of type %s" % CrmlKeyBase.__name__)
+        
+        if key_elem.get('readOnly') == 'true':  key_obj.read_only = True
+        if key_elem.get('backup') == 'true':    key_obj.backup = True
+        key_obj.access = self.read_access(key_elem)
+        key_obj.name = key_elem.get('name')
+    
+    def read_key(self, key_elem):
+        key_obj = None
+        if key_elem.tag == '{%s}key' % self.NAMESPACE:
+            # Determine whether the key is a normal key or a bitmask key
+            # based on the presence of <bit> elements
+            tags = [e.tag for e in key_elem]
+            if '{%s}bit' % self.NAMESPACE in tags:
+                key_obj = self.read_bitmask_key(key_elem)
+            else:
+                key_obj = self.read_simple_key(key_elem)
+        elif key_elem.tag == '{%s}keyRange' % self.NAMESPACE:
+            key_obj = self.read_key_range(key_elem)
+        
+        return key_obj
+    
+    def read_simple_key(self, key_elem):
+        """
+        Read a CrmlSimpleKey object from the given XML element.
+        """
+        expected_tag = '{%s}key' % self.NAMESPACE
+        if key_elem.tag != expected_tag:
+            raise RuntimeError("Incorrect XML element passed to read_simple_key(): %s, expected %s" % (key_elem.tag, expected_tag))
+        
+        key = CrmlSimpleKey(
+            ref  = get_required_attr(key_elem, 'ref').replace('/', '.'),
+            int  = get_required_attr(key_elem, 'int'),
+            type = key_elem.get('type', 'int'))
+        self.read_common_key_attrs(key_elem, key)
+        
+        return key
+    
+    def read_bitmask_key(self, key_elem):
+        """
+        Read a CrmlBitmaskKey object from the given XML element.
+        """
+        expected_tag = '{%s}key' % self.NAMESPACE
+        if key_elem.tag != expected_tag:
+            raise RuntimeError("Incorrect XML element passed to read_bitmask_key(): %s, expected %s" % (key_elem.tag, expected_tag))
+        
+        # Read attributes
+        key = CrmlBitmaskKey(
+            int  = get_required_attr(key_elem, 'int'),
+            type = key_elem.get('type', 'int'))
+        self.read_common_key_attrs(key_elem, key)
+        
+        # Read bits
+        for bit_elem in key_elem.findall('{%s}bit' % self.NAMESPACE):
+            ref = get_required_attr(bit_elem, 'ref').replace('/', '.')
+            if bit_elem.get('value') == 'false':    invert = True
+            else:                                   invert = False
+            index = int(bit_elem.text.strip())
+            
+            key.bits.append(CrmlBit(ref=ref, index=index, type=type, invert=invert))
+        
+        return key
+    
+    def read_key_range(self, key_range_elem):
+        """
+        Read a CrmlKeyRange object from the given XML element.
+        """
+        expected_tag = '{%s}keyRange' % self.NAMESPACE
+        if key_range_elem.tag != expected_tag:
+            raise RuntimeError("Incorrect XML element passed to read_key_range(): %s, expected %s" % (key_range_elem.tag, expected_tag))
+        
+        # Read attributes
+        ref = key_range_elem.get('ref')
+        if ref is not None: ref = ref.replace('/', '.')
+        key_range = CrmlKeyRange(
+            ref         = ref,
+            first_int   = get_required_attr(key_range_elem, "firstInt"),
+            last_int    = get_required_attr(key_range_elem, "lastInt"),
+            count_int   = key_range_elem.get('countInt'),
+            first_index = convert_num(key_range_elem.get('firstIndex', '0')),
+            index_bits  = convert_num(key_range_elem.get('indexBits')))
+        self.read_common_key_attrs(key_range_elem, key_range)
+        
+        # Read sub-keys
+        for subkey_elem in key_range_elem.findall('{%s}key' % self.NAMESPACE):
+            ref = get_required_attr(subkey_elem, 'ref').replace('/', '.')
+            int = get_required_attr(subkey_elem, 'int')
+            name = subkey_elem.get('name')
+            type = subkey_elem.get('type', 'int')
+            key_range.subkeys.append(CrmlKeyRangeSubKey(ref=ref, int=int, name=name, type=type))
+        
+        return key_range
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/crml_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,574 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+import re
+from cone.public import exceptions
+import crml_reader
+from crml_model import *
+
+class CenRepEntry(object):
+    """
+    Class representing an entry in a CenRep text file.
+    """
+    def __init__(self, **kwargs):
+        self.int            = kwargs.get('int')
+        self.crml_type      = kwargs.get('crml_type')
+        self.confml_type    = kwargs.get('confml_type')
+        self.value          = kwargs.get('value')
+        self.orig_value     = kwargs.get('orig_value')
+        self.access         = kwargs.get('access')
+        self.backup         = kwargs.get('backup', False)
+    
+    @property
+    def metadata(self):
+        return _get_metadata(self.backup)
+    
+    def __lt__(self, other):
+        return crml_reader.convert_num(self.int) < crml_reader.convert_num(other.int)
+
+class CenRepRfsRecord(object):
+    """
+    Class representing an entry in the CenRep RFS text file.
+    """
+    def __init__(self, repo_uid, key_uids=None):
+        self.repo_uid = repo_uid
+        self.key_uids = key_uids or []
+    
+    def __eq__(self, other):
+        if type(self) == type(other):   return self.repo_uid == other.repo_uid
+        else:                           return False
+    
+    def __ne__(self, other):
+        return not (self == other)
+    
+    def __lt__(self, other):
+        return  self.repo_uid < other.repo_uid
+    
+    def __repr__(self):
+        return "CenRepRfsRecord(repo_uid=%s, key_uids=%r)" % (self.repo_uid, self.key_uids)
+        
+
+class CrmlTxtWriter(object):
+    """
+    Writer class for generating CenRep .txt files based on a CRML model.
+    """
+    
+    def __init__(self, configuration, log):
+        self.configuration = configuration
+        self.log = log
+    
+    def get_cenrep_txt_data(self, repository):
+        """
+        Return the text data for the CenRep txt generated based on the given
+        CRML repository model.
+        @return: Text data for the CenRep text file.
+        """
+        data = []
+        
+        # Generate header lines 
+        data.extend(self.get_header_lines(repository))
+        
+        self._check_repository_attrs(repository)
+        
+        # Generate CenRep entries for all keys
+        cenrep_entries = []
+        for key in repository.keys:
+            cenrep_entries.extend(self.get_cenrep_entries(key))
+        
+        # Generate entry lines based on the entries
+        cenrep_entries.sort()
+        for entry in cenrep_entries:
+            data.append(self.get_cenrep_entry_line(entry))
+        
+        data.append('')
+        
+        # Remove Nones from the line list
+        data = filter(lambda val: val is not None, data)
+        
+        return '\r\n'.join(data)
+    
+    def get_cenrep_rfs_txt_data(self, rfs_records):
+        """
+        Return the text data for the CenRep RFS txt generated based on the given
+        CenRep RFS record list.
+        """
+        data = []
+        
+        # Make a distinct and sorted array of the records
+        records = []
+        for r in rfs_records:
+            if r not in records: records.append(r)
+        records.sort()
+        
+        for record in records:
+            repo_uid = record.repo_uid
+            
+            # Add padding zeros to the UID
+            if len(repo_uid) < 8:
+                repo_uid = (8 - (len(repo_uid) % 8)) * '0' + repo_uid
+            temp = "CR %s" % repo_uid
+            if record.key_uids:
+                temp += " %s" % ' '.join(record.key_uids)
+            data.append(temp)
+        
+        return '\r\n'.join(data)
+    
+    def get_cenrep_rfs_record(self, repository):
+        """
+        Return the RFS record for the given CRML repository.
+        
+        @return: A CenRepRfsRecord object if the repository should be listed
+            in cenrep_rfs.txt, None if not.
+        """
+        # Get the UID as a hex value without the leading 0x
+        repo_uid = _translate_key_uid(repository.uid_value)[2:]
+        
+        # Check if the whole repository has RFS=true
+        if repository.rfs:
+            return CenRepRfsRecord(repo_uid)
+        
+        # Collect the UIDs of the keys that should be listed
+        rfs_key_uids = []
+        for key in repository.keys:
+            if self._key_is_rfs(key) and key.int:
+                # Get the UID as a hex value without the leading 0x
+                uid = _translate_key_uid(key.int)[2:]
+                rfs_key_uids.append(uid)
+                    
+        if rfs_key_uids:
+            return CenRepRfsRecord(repo_uid, rfs_key_uids)
+        else:
+            return None
+    
+    def _key_is_rfs(self, key):
+        """
+        @return: True if the key UID should be listed in cenrep_rfs.txt
+        """
+        if isinstance(key, CrmlSimpleKey):
+            return bool(self._get_rfs_value(key.ref))
+        elif isinstance(key, CrmlBitmaskKey):
+            for bit in key.bits:
+                if self._get_rfs_value(bit.ref):
+                    return True
+        else:
+            return False
+    
+    def _get_rfs_value(self, ref):
+        """
+        @return: The RFS value for the given setting, or None if not available.
+        """
+        if ref is None: return
+        
+        try:
+            feature = self._get_feature(ref)
+        except exceptions.NotFound:
+            # Feature not found in the configuration
+            return None
+        
+        return feature.get_value(attr='rfs')
+    
+    def get_header_lines(self, repository):
+        """
+        Return a list of lines to be written in the header section of the CenRep text file.
+        """
+        data = ['cenrep',
+                'version %s' % repository.version]
+        
+        if repository.owner:
+            data.append('[owner]')
+            data.append(repository.owner)
+        
+        data.append('[defaultmeta]')
+        data.append(' %d' % _get_metadata(repository.backup))
+        for key in repository.keys:
+            data.append(self.get_defaultmeta_line(key))
+        
+        data.append('[platsec]')
+        acc_text = self.get_access_line(repository.access)
+        if acc_text: acc_text = ' ' + acc_text
+        data.append(acc_text)
+        for key in repository.keys:
+                data.append(self.get_platsec_line(key, repository))
+        
+        
+        data.append('[Main]')
+        return data
+    
+    def get_cenrep_entries(self, key):
+        """
+        Generate CenRep entries based on the given CRML key object.
+        @return: A list of CenRepEntry objects.
+        """
+        if isinstance(key, CrmlSimpleKey):
+            feature = self._get_feature(key.ref)
+            entry = CenRepEntry(int          = key.int,
+                                crml_type    = key.type,
+                                confml_type  = feature.get_type(),
+                                value        = feature.get_value(),
+                                orig_value   = feature.get_original_value(),
+                                backup       = key.backup,
+                                access       = key.access)
+            return [entry]
+        elif isinstance(key, CrmlBitmaskKey):
+            return self.get_bitmask_key_cenrep_entries(key)
+        elif isinstance(key, CrmlKeyRange):
+            return self.get_key_range_cenrep_entries(key)
+        else:
+            raise TypeError("Unsupported CRML key object type %s" % type(key))
+    
+    def get_key_range_cenrep_entries(self, key_range):
+        """
+        Generate CenRep entries based on the given CrmlKeyRange object.
+        @return: A list of CenRepEntry objects.
+        """
+        entries = []
+        count = 0
+        
+        # Generate the countInt entry if necessary
+        if key_range.count_int is not None and key_range.ref is not None:
+            try:
+                feature = self._get_feature(key_range.ref)
+                
+                # For CT2 output compatibility
+                if feature.get_type() != 'sequence':
+                    return []
+                
+                values = feature.get_value()
+            except exceptions.NotFound:
+                values = []
+            
+            count = len(values)
+                
+            entry = CenRepEntry(int         = key_range.count_int,
+                                crml_type   = 'int',
+                                confml_type = 'int',
+                                value       = count,
+                                backup      = key_range.backup,
+                                access      = key_range.access)
+            entries.append(entry)
+        
+        # Generate entries based on the sequence values
+        for subkey in key_range.subkeys:
+            full_ref = "%s.%s"% (key_range.ref, subkey.ref)
+            
+            try:
+                feature = self._get_feature(full_ref)
+                values = feature.get_value()
+                confml_type = feature.get_type()
+                backup = key_range.backup
+            except exceptions.NotFound:
+                # For CT2 output compatibility
+                values = ['null' for i in xrange(count)]
+                confml_type = None
+                backup = False
+                
+            for i, value in enumerate(values):
+                # Calculate the index of the entry
+                index = self.get_index(crml_reader.convert_num(key_range.first_int),
+                                       crml_reader.convert_num(key_range.first_index),
+                                       crml_reader.convert_num(key_range.index_bits),
+                                       i,
+                                       crml_reader.convert_num(subkey.int))
+                
+                entry = CenRepEntry(int         = "0x%x" % index,
+                                    crml_type   = subkey.type,
+                                    confml_type = confml_type,
+                                    value       = value,
+                                    orig_value  = value,
+                                    backup      = backup,
+                                    access      = key_range.access)
+                entries.append(entry)
+        
+        return entries
+    
+    def get_bitmask_key_cenrep_entries(self, key):
+        """
+        Generate CenRep entries based on the given CrmlBitmaskKey object.
+        @return: A list of CenRepEntry objects.
+        """
+        # Calculate the value based on the bit values
+        # -------------------------------------------
+        value = 0
+        for bit in key.bits:
+            feature = self._get_feature(bit.ref)
+            bit_value = feature.get_value()
+            if bit.invert:  bit_value = not bit_value
+            if bit_value:   value |= 1 << (bit.index - 1)
+        
+        # Generate the textual representation of the bitmask value.
+        # This is done at this point because in get_cenrep_entry_line()
+        # we don't know anymore if the key was a bitmask key or a
+        # simple key.
+        # -------------------------------------------------------------
+        if key.type == 'binary':
+            orig_value = "%X" % value
+            # Add padding zeroes so that the number of digits
+            # is divisible by 8 (done manually since the length
+            # of a binary bitmask is unbounded).
+            padding_zeroes = (8 - len(orig_value) % 8) * '0' 
+            # 4 is a special case for CT2 output compatibility
+            if len(orig_value) != 4:
+                orig_value = padding_zeroes + orig_value
+        else:
+            orig_value = str(value)
+        
+        entry = CenRepEntry(int         = key.int,
+                            crml_type   = key.type,
+                            confml_type = 'int',
+                            value       = value,
+                            orig_value  = orig_value,
+                            backup      = key.backup,
+                            access      = key.access)
+        return [entry]
+    
+    def get_defaultmeta_line(self, key):
+        """
+        Return the defaultmeta section line for the given CRML key object.
+        """
+        if not isinstance(key, CrmlKeyRange): return None
+        
+        return "%s %s %d" % (key.first_int,
+                             key.last_int,
+                             _get_metadata(key.backup))
+    
+    def get_platsec_line(self, key, repository):
+        """
+        Return the platsec section line for the given CRML key object.
+        """
+        if not isinstance(key, CrmlKeyRange): return None
+        
+        # In a key range platsec entry something must be present, so if
+        # the access object is empty, use cap_rd and cap_wr from the repository's
+        # global access definition
+        access = key.access.copy()
+        is_empty = True
+        for attrname in ('sid_rd', 'cap_rd', 'sid_wr', 'cap_wr'):
+            if getattr(access, attrname) not in ('', None):
+                is_empty = False
+        if is_empty:
+            access.cap_rd = repository.access.cap_rd
+            access.cap_wr = repository.access.cap_wr
+        
+        acc_text = self.get_access_line(access)
+        if acc_text: acc_text = ' ' + acc_text
+        
+        return "%s %s%s" % (key.first_int,
+                             key.last_int,
+                             acc_text)
+        
+    
+    def get_cenrep_entry_line(self, entry):
+        """
+        Return the text line for a CenRepEntry object.
+        """
+        value = None
+        if entry.crml_type in ('string', 'string8'):
+            if entry.confml_type is None:
+                pass
+            else:
+                if entry.orig_value is None:
+                    value = '""'
+                else:
+                    value = '"%s"' % entry.orig_value
+        elif entry.crml_type == 'int':
+            if entry.confml_type == 'boolean':
+                if entry.value: value = '1'
+                else:           value = '0'
+            else:
+                value = entry.orig_value
+        elif entry.crml_type == 'real':
+            value = entry.orig_value or ''
+        elif entry.crml_type == 'binary':
+            # Empty binary values are denoted by a single dash
+            value = entry.orig_value or '-'
+            
+            if value != '-':
+                # Make sure that the number of digits is divisible by two
+                if len(value) % 2 != 0:
+                    value = '0' + value
+        
+        if value is None:
+            value = unicode(entry.value)
+        
+        self._check_value(entry, value)
+        
+        acc_text = self.get_access_line(entry.access)
+        if acc_text: acc_text = ' ' + acc_text
+        
+        return '%s %s %s %d%s' % (_translate_key_uid(entry.int),
+                                  entry.crml_type,
+                                  value,
+                                  entry.metadata,
+                                  acc_text)
+    def _check_value(self, entry, value):
+        """
+        Check that the given value is valid for the given CenRep entry,
+        and log a warning if it is not.
+        """
+        if entry.crml_type == 'int':
+            # Check if the value is a string, since it may already
+            # be an integer
+            if not isinstance(value, basestring):
+                return
+            
+            try:
+                value = value.strip()
+                if value.lower().startswith('0x'):
+                    long(value, 16)
+                else:
+                    long(value)
+            except ValueError:
+                self.log.warn("Key %s: Invalid integer value '%s'" % (entry.int, value))
+        elif entry.crml_type == 'real':
+            try:
+                float(value)
+            except ValueError:
+                self.log.warn("Key %s: Invalid real value '%s'" % (entry.int, value))
+        elif entry.crml_type == 'binary':
+            if value != '-' and re.match(r'^(0[xX])?[0-9a-fA-F]+$', value) is None:
+                self.log.warn("Key %s: Invalid binary value '%s'" % (entry.int, value))
+    
+    def _check_repository_attrs(self, repository):
+        """
+        Check that the attributes of the given repository are valid and
+        log warnings if not.
+        """
+        if repository.owner is not None:
+            owner = repository.owner.strip()
+            # An empty owner UID is OK, it doesn't generate anything
+            # invalid into the output
+            if owner != '':
+                try:
+                    if owner.lower().startswith('0x'):
+                        long(owner, 16)
+                    else:
+                        long(owner)
+                except ValueError:
+                    self.log.warn("Invalid owner UID '%s'" % owner)
+    
+    def get_access_line(self, access):
+        """
+        Generate a line containing access information based on a CrmlAccess object.
+        """
+        # Write the access information in a specific order, because it
+        # won't work otherwise
+        var_order = ['sid_rd', 'cap_rd', 'sid_wr', 'cap_wr']
+        data = []
+        for varname in var_order:
+            val = getattr(access, varname)
+            if val not in ('', None):
+                # Using _translate_capability_string() on all, since a SID should
+                # not contain anything that could be messed up by the function
+                data.append('%s=%s' % (varname, _translate_capability_string(val)))
+        
+        return ' '.join(data)
+    
+    def _get_feature(self, ref):
+        return self.configuration.get_default_view().get_feature(ref)
+    
+    @classmethod
+    def get_index(cls,firstInt,firstIndex,indexBits,seqIndex, subIndex):
+        """
+        @param firstIndex: The first value available in the keyrange 
+        @param lastInt: The last value available in the keyrange 
+        @param indexBits: The index bits or mask for sequence index
+        @param seqIndex: The sequence index
+        @param subIndex: The sequence sub element index
+        @return: an numeric value for the encoded index
+        """
+        rangeshift = cls.get_range_shift(indexBits)
+        return (((seqIndex+firstIndex) << rangeshift) + firstInt) + subIndex
+
+    @classmethod
+    def get_seqid(cls,firstInt,firstIndex,indexBits,cenrepkey):
+        """
+        @param firstIndex: The first value available in the keyrange 
+        @param lastInt: The last value available in the keyrange 
+        @param indexBits: The index bits or mask for sequence index
+        @param cenrepkey: Crml key id
+        @return: an numeric value for the encoded index
+        """
+        rangeshift = cls.get_range_shift(indexBits)
+        return (((cenrepkey & indexBits) -firstInt) >> rangeshift)-firstIndex
+
+    @classmethod
+    def get_subseqid(cls,firstInt,firstIndex,indexBits,cenrepkey):
+        """
+        @param firstIndex: The first value available in the keyrange 
+        @param lastInt: The last value available in the keyrange 
+        @param indexBits: The index bits or mask for sequence index
+        @param cenrepkey: Crml key id
+        @return: an numeric value for the encoded index
+        """
+        range = cls.get_range(indexBits)
+        return (cenrepkey - firstInt) & range
+
+    @classmethod
+    def get_range_shift(cls,indexBits):
+        """ Get the bit left to the """
+        seqrange = cls.get_range(indexBits)
+        shiftamount = 0
+        for i in range(0,32):
+            if (seqrange >> i)  == 0:
+                shiftamount = i
+                break
+        return shiftamount
+
+    @classmethod
+    def get_range(cls,indexBits):
+        """ Get the bit left to the """
+        indexshift = 0 
+        for i in range(0,32):
+            if (indexBits >> i)  == 0:
+                indexshift = i
+                break
+        return ((0x1 << indexshift) - indexBits)-1
+
+
+# =============================================================================
+# Utility functions
+# =============================================================================
+
+def _get_metadata(backup):
+    metadata = 0
+    if backup: metadata |= 0x1000000
+    return metadata
+        
+def _translate_key_uid(uid):
+    """Translate a key UID given in CRML so that it matches the output of CT2."""
+    if uid.lower().startswith("0x"):
+        prefix = uid[:2]
+        temp = uid[2:]
+        if int(temp, 16) == 0:  return prefix + "0"
+        else:                   return prefix + uid[2:].lstrip('0')
+    else:
+        if int(uid) == 0:       return "0"
+        else:                   return uid.lstrip('0')
+
+def _translate_capability_string(cap_str):
+    """
+    Translate a capability string so that it is
+    suitable for writing to a CenRep txt file.
+    """
+    cap_str = cap_str.replace('AlwaysPass', 'alwayspass').replace('AlwaysFail', 'alwaysfail')
+    
+    # The capability string can be a list separated either by
+    # whitespace or commas
+    if ',' in cap_str:  caps = cap_str.split(',')
+    else:               caps = cap_str.split()
+    
+    # The output must always be comma-separated
+    return ','.join(caps)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+SCRIPTS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../../..', "scripts"))
+assert os.path.exists(SCRIPTS_ROOT)
+os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ';' + SCRIPTS_ROOT + ';' + PLUGINS_ROOT
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/centrepconv_txt_to_cre.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,205 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#   Helper script for running CentRepConv.exe to convert .txt files to
+#   .cre files. The script is given a drive where an S60 environment is
+#   substed and it handles all necessary input/output file moving and
+#   command running to do the conversion.
+#   
+#   The .txt files for which the conversion fails are reported at the end
+#   of the conversion.
+#
+
+import sys, os, subprocess, shutil, re
+import logging
+from optparse import OptionParser, OptionGroup
+
+log = logging.getLogger()
+
+# Paths to the temporary directories on the environment level
+TEMP_INPUT_DIR = r'\epoc32\WINSCW\C\cenrepconv_temp\input'
+TEMP_OUTPUT_DIR = r'\epoc32\WINSCW\C\cenrepconv_temp\output'
+
+# The same temporary directories in the form the emulator sees them
+TEMP_INPUT_DIR_EMULATOR = r'C:\cenrepconv_temp\input'
+TEMP_OUTPUT_DIR_EMULATOR = r'C:\cenrepconv_temp\output'
+
+def recreate_dir(dir):
+    if os.path.exists(dir):
+        shutil.rmtree(dir)
+    os.makedirs(dir)
+
+def find_cenrep_txt_files(dir):
+    """
+    Find all CenRep txt files in the given directory.
+    @return: List of absolute paths to the files.
+    """
+    pattern = re.compile(r'^[a-fA-F0-9]{8}\.txt$')
+    dir = os.path.abspath(dir)
+    
+    result = []
+    for root, dirs, files in os.walk(dir):
+        for file in files:
+            if pattern.match(file) is not None:
+                result.append(os.path.join(root, file))
+    return result
+
+def convert_txt_to_cre(file_path, output_dir):
+    """
+    Convert a CenRep .txt file into a .cre file using CentRepConv.exe.
+    @param file_path: Path to the .txt file.
+    @param output_dir: Directory where the resulting .cre file will be copied.
+        If None, the output file will not be copied anywhere.
+    @return: True if conversion was OK and the corresponding .cre file was
+        created, False if not.
+    """
+    output_dir = os.path.abspath(output_dir)
+    file_path = os.path.abspath(file_path)
+    filename = os.path.basename(file_path)
+    filename_out = filename[:-4] + '.cre'
+    
+    # Copy the input file into place
+    temp_input_file = os.path.join(TEMP_INPUT_DIR, filename)
+    shutil.copy2(file_path, temp_input_file)
+    
+    # Run the conversion
+    cmd = r'\epoc32\release\WINSCW\udeb\centrepconv.exe -dNoGui -dtextshell -Mconsole -- -o %s %s' \
+        % (os.path.join(TEMP_OUTPUT_DIR_EMULATOR, filename_out), os.path.join(TEMP_INPUT_DIR_EMULATOR, filename))
+    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+    out, err = p.communicate()
+    if p.returncode != 0:
+        log.debug("Failed to execute command: %s" % cmd)
+        log.debug("Command output:\n%s", out)
+        return False
+    
+    temp_output_file = os.path.join(TEMP_OUTPUT_DIR, filename_out)
+    if not os.path.exists(temp_output_file):
+        log.debug("Expected output file '%s' does not exist" % temp_output_file)
+        return False
+    
+    # Copy to output if necessary
+    if output_dir:
+        if not os.path.exists(output_dir):
+            os.makedirs(output_dir)
+        output_file = os.path.join(output_dir, os.path.basename(temp_output_file))
+        log.debug("Copying output file to '%s'" % output_file)
+        shutil.copy2(temp_output_file, output_file)
+    
+    log.debug("Removing temp output file '%s'" % temp_output_file)
+    os.remove(temp_output_file)
+    return True
+
+def main():
+    parser = OptionParser()
+    
+    parser.add_option("--env-drive",
+                      help="Specifies the drive where the S60 environment containing CentRepConv.exe is located. Note that the drive needs to be writable, since input/output files need to be moved there in order to make the conversion work. Example: 'X:'",
+                      metavar="DRIVE")
+    
+    parser.add_option("--input-file",
+                      help="Specifies a single CenRep .txt file to convert.",
+                      metavar="FILE")
+    
+    parser.add_option("--input-dir",
+                      help="Specifies a directory containing the CenRep .txt files to convert. Only CenRep .txt files converted.",
+                      metavar="FILE")
+    
+    parser.add_option("--output",
+                      help="The directory where the resulting .cre files are generated",
+                      metavar="DIR")
+    
+    parser.add_option("--validate",
+                      action="store_true",
+                      help="Don't copy output files to --output, only check if a .cre file is generated for each .txt file.",
+                      default=False)
+    
+    parser.add_option("-v", "--verbose",
+                      action="store_true",
+                      help="Show debug information",
+                      default=False)
+    
+    (options, args) = parser.parse_args()
+    
+    if not options.env_drive:
+        parser.error("--env-drive must be specified")
+    if re.match('^[A-Za-z]:$', options.env_drive) is None:
+        parser.error("Invalid --env-drive '%s', should be e.g. 'X:'" % options.env_drive)
+    if not os.path.exists(options.env_drive):
+        parser.error("Specified --env-drive '%s' does not exist" % options.env_drive)
+    
+    if not options.input_file and not options.input_dir:
+        parser.error("--input-file or --input-dir must be specified")
+    if options.input_file and options.input_dir:
+        parser.error("Only one for --input-file and --input-dir may be specified")
+    if options.input_file and not os.path.isfile(options.input_file):
+        parser.error("Specified --input-file does not exist or is not a file")
+    if options.input_dir and not os.path.isdir(options.input_dir):
+        parser.error("Specified --input-dir does not exist or is not a directory")
+    
+    if not options.output and not options.validate:
+        parser.error("Either --output or --validate must be specified")
+    
+    if options.verbose: log_level = logging.DEBUG
+    else:               log_level = logging.INFO
+    logging.basicConfig(format="%(levelname)-8s: %(message)s", stream=sys.stdout, level=log_level)
+    
+    if options.output:  output_dir = os.path.abspath(options.output)
+    else:               output_dir = None
+    
+    # Find input files
+    log.info("Determining input files")
+    if options.input_file:
+        input_files = [os.path.abspath(options.input_file)]
+    else:
+        input_files = find_cenrep_txt_files(options.input_dir)
+    log.info("%d input file(s)" % len(input_files))
+    
+    if len(input_files) == 0:
+        log.info("No input files")
+        return
+    
+    log.debug("Changing working directory to '%s'" % options.env_drive)
+    os.chdir(options.env_drive)
+    
+    log.debug("Creating/cleaning temporary output directory '%s'" % TEMP_OUTPUT_DIR)
+    recreate_dir(TEMP_OUTPUT_DIR)
+    log.debug("Creating/cleaning temporary input directory '%s'" % TEMP_INPUT_DIR)
+    recreate_dir(TEMP_INPUT_DIR)
+    
+    log.info("Running conversion")
+    failed_files = []
+    PROGRESS_STEP_PERCENTAGE = 5.0
+    ratio = 100.0 / float(len(input_files))
+    last_percentage = 0
+    for i, file in enumerate(input_files):
+        percentage = ratio * float(i)
+        if percentage - last_percentage > PROGRESS_STEP_PERCENTAGE:
+            log.info("%d%%" % percentage)
+            last_percentage = percentage
+        
+        log.debug("Converting '%s'" % file)
+        ok = convert_txt_to_cre(file, output_dir)
+        if not ok:
+            log.debug("Conversion of '%s' failed" % file)
+            failed_files.append(file)
+    
+    if failed_files:
+        print "Conversion failed for %d file(s)" % len(failed_files)
+        prefix = os.path.commonprefix(failed_files)
+        print "Common prefix: %s" % prefix
+        for file in failed_files:
+            print file[len(prefix):]
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000001_simple_keys.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="SimpleKeys" uidValue="0x00000001">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="int" ref="SimpleKeys/Setting1" name="Setting 1"/>
+  <key int="0x00000002" type="int" ref="SimpleKeys/Setting2" name="Setting 2" backup="true"/>
+  <key int="0x00000003" type="int" ref="SimpleKeys/Setting3" name="Setting 3" readOnly="true"/>
+  <key int="0x00000004" type="int" ref="SimpleKeys/Setting4" name="Setting 4" readOnly="false"/>
+  <key int="0x00000005" type="int" ref="SimpleKeys/Setting5" name="Setting 5" readOnly="true"/>
+  <key int="0x00000006" type="int" ref="SimpleKeys/Setting6" name="Setting 6"/>
+  <key int="0x00000007" type="int" ref="SimpleKeys/Setting7" name="Setting 7"/>
+  <key int="0x00000008" type="int" ref="SimpleKeys/Setting8" name="Setting 8">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+  </key>
+  <key int="0x00000009" type="int" ref="SimpleKeys/Setting9" name="Setting 9">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <key int="0x10000001" type="int" ref="SimpleKeys/RemovedSetting" name="Removed setting"/>
+  <key int="0x10000002" type="int" ref="SimpleKeys/RemovedReadOnlySetting"  readOnly="true" name="Removed read-only setting"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000002_bitmask_keys.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskKeys" uidValue="0x00000002">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="int" name="Bitmask 1">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+    
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2">2</bit>
+    <bit ref="BitmaskKeys/Bit3">3</bit>
+    
+    <bit ref="BitmaskKeys/RemovedBit">4</bit>
+  </key>
+  
+  <key int="0x10000001" type="int" name="Removed bitmask">
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2">2</bit>
+  </key>
+  
+  <key int="0x00000003" type="int" readOnly="true" name="Modified read-only bitmask">
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2">2</bit>
+    <bit ref="BitmaskKeys/Bit3">3</bit>
+    
+    <bit ref="BitmaskKeys/RemovedBit">4</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000003_key_ranges.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="KeyRanges" uidValue="0x00000003">
+
+  <keyRange ref="KeyRanges/Seq1" name="Sequence 1"
+    firstInt="0x1001" lastInt="0x1fff" indexBits="0x0ff0" firstIndex="1" countInt="0x1000" backup="true">
+    <access type="R" capabilities="ReadDeviceData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2" name="Sub-setting 2" int="0x0002" type="int"/>
+    
+    <key ref="RemovedSubSetting" name="Removed sub-setting" int="0x0004" type="int"/>
+  </keyRange>
+  
+  <keyRange name="Range 2" firstInt="0x00002000" lastInt="0x00002FFF" backup="true" readOnly="true"/>
+  <keyRange name="Range 3" firstInt="0x00003000" lastInt="0x00003FFF" backup="true" readOnly="false"/>
+  
+  <keyRange ref="KeyRanges/RemovedSeq" name="Removed range"
+    firstInt="0x10001001" lastInt="0x10001fff" indexBits="0x0ff0" firstIndex="1" countInt="0x10001000">
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2" name="Sub-setting 2" int="0x0002" type="int"/>
+  </keyRange>
+  
+  <keyRange ref="KeyRanges/ReadOnlySeq" name="Read-only sequence"
+    firstInt="0x3001" lastInt="0x3fff" indexBits="0x0ff0" firstIndex="1" countInt="0x3000" readOnly="true">
+    <access type="R" capabilities="ReadDeviceData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2" name="Sub-setting 2" int="0x0002" type="int"/>
+    
+    <key ref="RemovedSubSetting" name="Removed sub-setting" int="0x0004" type="int"/>
+  </keyRange>
+  
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000004_key_type_changed.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="KeyTypeChanged" uidValue="0x00000004">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="int" ref="Foo/Bar" name="Simple key to bitmask key"/>
+  <key int="0x00000002" type="int" name="Bitmask key to simple key">
+    <bit ref="Foo/Bit1">1</bit>
+  </key>
+  <key int="0x00000003" type="int" name="Bitmask key to simple key (other attrs changed also)" backup="true" readOnly="true">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+    <bit ref="Foo/Bit1">1</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000005_repo_attrs_changed.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RepoAttrsChanged" uidValue="0x00000005" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDeviceData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/00000006_renamed_repo.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RenamedRepo" uidValue="0x00000006" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDeviceData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/10000001_removed_repo.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RemovedRepo" uidValue="0x10000001" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDevideData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/30000000_duplicate_repo1_proj1.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="DuplicateRepo1" uidValue="0x30000000" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDevideData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/implml/30000000_duplicate_repo2_proj1.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="DuplicateRepo2" uidValue="0x30000000">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="int" ref="SimpleKeys/Setting1" name="Setting 1"/>
+  <key int="0x00000002" type="int" ref="SimpleKeys/Setting2" name="Setting 2" backup="true"/>
+  <key int="0x00000003" type="int" ref="SimpleKeys/Setting3" name="Setting 3" readOnly="true"/>
+  <key int="0x00000004" type="int" ref="SimpleKeys/Setting4" name="Setting 4" readOnly="false"/>
+  <key int="0x00000005" type="int" ref="SimpleKeys/Setting5" name="Setting 5" readOnly="true"/>
+  <key int="0x00000006" type="int" ref="SimpleKeys/Setting6" name="Setting 6"/>
+  <key int="0x00000007" type="int" ref="SimpleKeys/Setting7" name="Setting 7"/>
+  <key int="0x00000008" type="int" ref="SimpleKeys/Setting8" name="Setting 8">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+  </key>
+  <key int="0x00000009" type="int" ref="SimpleKeys/Setting9" name="Setting 9">
+    <access type="R" capabilities="ReadDeviceData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteDeviceData" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <key int="0x10000001" type="int" ref="SimpleKeys/RemovedSetting" name="Removed setting"/>
+  <key int="0x10000002" type="int" ref="SimpleKeys/RemovedReadOnlySetting"  readOnly="true" name="Removed read-only setting"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+</confml:configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_1/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000001_simple_keys.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="SimpleKeys" uidValue="0x00000001">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="real" ref="SimpleKeys/Setting1" name="Setting 1"/>
+  <key int="0x00000002" type="int" ref="SimpleKeys/Setting2" name="Setting 2" backup="false"/>
+  <key int="0x00000003" type="int" ref="SimpleKeys/Setting3" name="Setting 3" readOnly="false"/>
+  <key int="0x00000004" type="int" ref="SimpleKeys/Setting4" name="Setting 4" readOnly="true"/>
+  <key int="0x00000005" type="real" ref="SimpleKeys/Setting5" name="Setting 5" readOnly="true"/>
+  <key int="0x00000006" type="int" ref="SimpleKeys/Setting6" name="Setting 6 (name changed)"/>
+  <key int="0x00000007" type="int" ref="SimpleKeys/Setting7RefChanged" name="Setting 7"/>
+  <key int="0x00000008" type="int" ref="SimpleKeys/Setting8" name="Setting 8">
+    <access type="R" capabilities="ReadUserData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteUserData" sid="0x44332211"/>
+  </key>
+  <key int="0x00000009" type="int" ref="SimpleKeys/Setting9" name="Setting 9">
+  </key>
+  
+  <key int="0x20000001" type="int" ref="SimpleKeys/AddedSetting" name="Added setting"/>
+  <key int="0x20000002" type="int" ref="SimpleKeys/AddedReadOnlySetting" readOnly="true" name="Added setting"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000002_bitmask_keys.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskKeys" uidValue="0x00000002">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="binary" name="Bitmask 1 (name changed)">
+    <access type="R" capabilities="ReadUserData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteUserData" sid="0x44332211"/>
+    
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2RefChanged">2</bit>
+    <bit ref="BitmaskKeys/Bit3" value="false">3</bit>
+    
+    <bit ref="BitmaskKeys/AddedBit">5</bit>
+  </key>
+  
+  <key int="0x20000001" type="int" name="Added bitmask">
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2">2</bit>
+  </key>
+  
+  <key int="0x00000003" type="binary" readOnly="true" name="Modified read-only bitmask (name changed)">
+    <bit ref="BitmaskKeys/Bit1">1</bit>
+    <bit ref="BitmaskKeys/Bit2RefChanged">2</bit>
+    <bit ref="BitmaskKeys/Bit3" value="false">3</bit>
+    
+    <bit ref="BitmaskKeys/AddedBit">5</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000003_key_ranges.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="KeyRanges" uidValue="0x00000003">
+
+  <keyRange ref="KeyRanges/Seq1RefChanged" name="Sequence 1 (name changed)"
+    firstInt="0x1001" lastInt="0x1fff" indexBits="0x1fe0" firstIndex="2" countInt="0x1001" backup="false">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2RefChanged" name="Sub-setting 2 (name changed)" int="0x0002" type="real"/>
+    
+    <key ref="AddedSubSetting" name="Added sub-setting" int="0x0005" type="int"/>
+  </keyRange>
+  
+  <keyRange name="Range 2" firstInt="0x00002000" lastInt="0x00002FFF" backup="false" readOnly="false"/>
+  <keyRange name="Range 3" firstInt="0x00003000" lastInt="0x00003FFF" backup="true" readOnly="true"/>
+  
+  <keyRange ref="KeyRanges/AddedSeq" name="Added range"
+    firstInt="0x20001001" lastInt="0x20001fff" indexBits="0x0ff0" firstIndex="1" countInt="0x20001000">
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2" name="Sub-setting 2" int="0x0002" type="int"/>
+  </keyRange>
+  
+  <keyRange ref="KeyRanges/ReadOnlySeqRefChanged" name="Read-only sequence (name changed)"
+    firstInt="0x3001" lastInt="0x3fff" indexBits="0x1fe0" firstIndex="2" countInt="0x3000" readOnly="true">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2RefChanged" name="Sub-setting 2 (name changed)" int="0x0002" type="real"/>
+    
+    <key ref="AddedSubSetting" name="Added sub-setting" int="0x0005" type="int"/>
+  </keyRange>
+  
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000004_key_type_changed.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="KeyTypeChanged" uidValue="0x00000004">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="int" name="Simple key to bitmask key">
+    <bit ref="Foo/Bit1">1</bit>
+  </key>
+  <key int="0x00000002" type="int" ref="Foo/Bar" name="Bitmask key to simple key"/>
+  <key int="0x00000003" type="binary" name="Bitmask key to simple key (other attrs changed also [xyz])" backup="false" readOnly="false">
+    <access type="R" capabilities="ReadUserData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteUserData" sid="0x44332211"/>
+    <bit ref="Foo/Bit1">1</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000005_repo_attrs_changed.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RepoAttrsChangedXyz" uidValue="0x00000005" rfs="false" backup="false">
+  <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+  <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/00000006_renamed_repo_xyz.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RenamedRepo" uidValue="0x00000006" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDeviceData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/20000001_added_repo.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AddedRepo" uidValue="0x20000001" rfs="true" backup="true">
+  <access type="R" capabilities="ReadDevideData" sid="0x11223344"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x44332211"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/30000000_duplicate_repo1_proj2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="DuplicateRepo1" uidValue="0x30000000" rfs="true" backup="true">
+
+  <keyRange ref="KeyRanges/Seq1RefChanged" name="Sequence 1 (name changed)"
+    firstInt="0x1001" lastInt="0x1fff" indexBits="0x1fe0" firstIndex="2" countInt="0x1001" backup="false">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2RefChanged" name="Sub-setting 2 (name changed)" int="0x0002" type="real"/>
+    
+    <key ref="AddedSubSetting" name="Added sub-setting" int="0x0005" type="int"/>
+  </keyRange>
+  
+  <keyRange name="Range 2" firstInt="0x00002000" lastInt="0x00002FFF" backup="false" readOnly="false"/>
+  <keyRange name="Range 3" firstInt="0x00003000" lastInt="0x00003FFF" backup="true" readOnly="true"/>
+  
+  <keyRange ref="KeyRanges/AddedSeq" name="Added range"
+    firstInt="0x20001001" lastInt="0x20001fff" indexBits="0x0ff0" firstIndex="1" countInt="0x20001000">
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2" name="Sub-setting 2" int="0x0002" type="int"/>
+  </keyRange>
+  
+  <keyRange ref="KeyRanges/ReadOnlySeqRefChanged" name="Read-only sequence (name changed)"
+    firstInt="0x3001" lastInt="0x3fff" indexBits="0x1fe0" firstIndex="2" countInt="0x3000" readOnly="true">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+    
+    <key ref="SubSetting1" name="Sub-setting 1" int="0x0001" type="int"/>
+    <key ref="SubSetting2RefChanged" name="Sub-setting 2 (name changed)" int="0x0002" type="real"/>
+    
+    <key ref="AddedSubSetting" name="Added sub-setting" int="0x0005" type="int"/>
+  </keyRange>
+  
+</repository>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/implml/30000000_duplicate_repo2_proj2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="DuplicateRepo2" uidValue="0x30000000">
+  <access type="R" capabilities="ReadDevideData" sid="0x12344321"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x43211234"/>
+  
+  <key int="0x00000001" type="real" ref="SimpleKeys/Setting1" name="Setting 1"/>
+  <key int="0x00000002" type="int" ref="SimpleKeys/Setting2" name="Setting 2" backup="false"/>
+  <key int="0x00000003" type="int" ref="SimpleKeys/Setting3" name="Setting 3" readOnly="false"/>
+  <key int="0x00000004" type="int" ref="SimpleKeys/Setting4" name="Setting 4" readOnly="true"/>
+  <key int="0x00000005" type="real" ref="SimpleKeys/Setting5" name="Setting 5" readOnly="true"/>
+  <key int="0x00000006" type="int" ref="SimpleKeys/Setting6" name="Setting 6 (name changed)"/>
+  <key int="0x00000007" type="int" ref="SimpleKeys/Setting7RefChanged" name="Setting 7"/>
+  <key int="0x00000008" type="int" ref="SimpleKeys/Setting8" name="Setting 8">
+    <access type="R" capabilities="ReadUserData" sid="0x11223344"/>
+    <access type="W" capabilities="WriteUserData" sid="0x44332211"/>
+  </key>
+  <key int="0x00000009" type="int" ref="SimpleKeys/Setting9" name="Setting 9">
+  </key>
+  
+  <key int="0x20000001" type="int" ref="SimpleKeys/AddedSetting" name="Added setting"/>
+  <key int="0x20000002" type="int" ref="SimpleKeys/AddedReadOnlySetting" readOnly="true" name="Added setting"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+</confml:configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/comp_project_2/root.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000001.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000002.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000003.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000004.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/10000005.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_expected/private/100059C9/cenrep_rfs.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/all_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="AllRfsFeature" version="1">
+  <feature ref="AllRfsFeature" name="Feature with all settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <AllRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </AllRfsFeature>
+  </data>
+  
+  <rfs>
+    <AllRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>true</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </AllRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/backup_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="BackupTest" version="1">
+  <feature ref="BackupTest" name="Settings for testing CRML backup info parsing">
+    <setting ref="Setting1" type="int"/>
+    <setting ref="Setting2" type="int"/>
+    <setting ref="Setting3" type="int"/>
+    <setting ref="Setting4" type="int"/>
+    <setting ref="Setting5" type="int"/>
+  </feature>
+  <data>
+    <BackupTest>
+      <Setting1>1</Setting1>
+      <Setting2>2</Setting2>
+      <Setting3>3</Setting3>
+      <Setting4>4</Setting4>
+      <Setting5>5</Setting5>
+    </BackupTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/bitmask_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="RepoRfsFeature" version="1">
+  <feature ref="BitmaskRfsFeature" name="Feature for testing RFS with bitmask CenRep keys">
+    <setting ref="Mask1Bit0" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit1" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit2" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit3" name="Boolean setting" type="boolean"/>
+    
+    <setting ref="Mask2Bit0" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit1" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit2" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit3" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <BitmaskRfsFeature>
+      <Mask1Bit0>0</Mask1Bit0>
+      <Mask1Bit1>1</Mask1Bit1>
+      <Mask1Bit2>1</Mask1Bit2>
+      <Mask1Bit3>0</Mask1Bit3>
+      
+      <Mask2Bit0>1</Mask2Bit0>
+      <Mask2Bit1>0</Mask2Bit1>
+      <Mask2Bit2>0</Mask2Bit2>
+      <Mask2Bit3>1</Mask2Bit3>
+    </BitmaskRfsFeature>
+  </data>
+  
+  <rfs>
+    <BitmaskRfsFeature>
+      <Mask1Bit0>false</Mask1Bit0>
+      <Mask1Bit1>false</Mask1Bit1>
+      <Mask1Bit2>false</Mask1Bit2>
+      <Mask1Bit3>false</Mask1Bit3>
+      
+      <Mask2Bit0>false</Mask2Bit0>
+      <Mask2Bit1>true</Mask2Bit1>
+      <Mask2Bit2>false</Mask2Bit2>
+      <Mask2Bit3>false</Mask2Bit3>
+    </BitmaskRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/no_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="NoRfsFeature" version="1">
+  <feature ref="NoRfsFeature" name="Feature with no settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <NoRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </NoRfsFeature>
+  </data>
+  
+  <rfs>
+    <NoRfsFeature>
+      <RealSetting>false</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </NoRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/partial_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="PartialRfsFeature" version="1">
+  <feature ref="PartialRfsFeature" name="Feature with some settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <PartialRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </PartialRfsFeature>
+  </data>
+  
+  <rfs>
+    <PartialRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </PartialRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/confml/repo_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="RepoRfsFeature" version="1">
+  <feature ref="RepoRfsFeature" name="Feature with the whole central repository RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <RepoRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </RepoRfsFeature>
+  </data>
+  
+  <!--
+  The values defined here should not matter when the whole repository is
+  marked with rfs="true" in the .crml file
+  -->
+  <rfs>
+    <RepoRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </RepoRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000001_all_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AllRfsFeature" uidValue="0x10000001">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="AllRfsFeature/RealSetting"      name="Real setting"     int="0x000000D1" type="real"/>
+  <key ref="AllRfsFeature/IntSetting"       name="Int setting"      int="0x000000C2" type="int"/>
+  <key ref="AllRfsFeature/StringSetting"    name="String setting"   int="0x000000B3" type="string"/>
+  <key ref="AllRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x000000A4" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000001_all_rfs_dup.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AllRfsFeature" uidValue="0x10000001">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="AllRfsFeature/RealSetting"      name="Real setting"     int="0x000000D1" type="real"/>
+  <key ref="AllRfsFeature/IntSetting"       name="Int setting"      int="0x000000C2" type="int"/>
+  <key ref="AllRfsFeature/StringSetting"    name="String setting"   int="0x000000B3" type="string"/>
+  <key ref="AllRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x000000A4" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000002_partial_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="PartialRfsFeature" uidValue="0x10000002">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="PartialRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="PartialRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="PartialRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="PartialRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000002_partial_rfs_dup.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="PartialRfsFeature" uidValue="0x10000002">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="PartialRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="PartialRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="PartialRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="PartialRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000003_no_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="NoRfsFeature" uidValue="0x10000003">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="NoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="NoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="NoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="NoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000003_no_rfs_dup.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="NoRfsFeature" uidValue="0x10000003">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="NoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="NoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="NoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="NoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000004_repo_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RepoRfsFeature" uidValue="0x10000004" rfs="true">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="RepoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="RepoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="RepoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="RepoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000004_repo_rfs_dup.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RepoRfsFeature" uidValue="0x10000004" rfs="true">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="RepoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="RepoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="RepoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="RepoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000005_bitmask_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskRfsFeature" uidValue="0x10000005">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <key name="Bitmask1" type="int" int="0x0000BDCA">
+    <bit ref="BitmaskRfsFeature/Mask1Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit3">4</bit>
+  </key>
+  
+  <key name="Bitmask2" type="int" int="0x0000ABCD">
+    <bit ref="BitmaskRfsFeature/Mask2Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit3">4</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/implml/1000005_bitmask_rfs_dup.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskRfsFeature" uidValue="0x10000005">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <key name="Bitmask1" type="int" int="0x0000BDCA">
+    <bit ref="BitmaskRfsFeature/Mask1Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit3">4</bit>
+  </key>
+  
+  <key name="Bitmask2" type="int" int="0x0000ABCD">
+    <bit ref="BitmaskRfsFeature/Mask2Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit3">4</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/all_rfs.confml#/"/>
+  <xi:include href="confml/partial_rfs.confml#/"/>
+  <xi:include href="confml/no_rfs.confml#/"/>
+  <xi:include href="confml/repo_rfs.confml#/"/>
+  <xi:include href="confml/bitmask_rfs.confml#/"/>
+</confml:configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/duplicate_rfs_project/root.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000001.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000002.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000003.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000004.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000005.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000006.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000007.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000008.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/00000009.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000A.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000B.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000C.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000D.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/0000000E.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E1.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E2.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E3.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E4.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E5.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E6.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E7.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E8.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000E9.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000EA.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/000000F1.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000001.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000002.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000003.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000004.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/10000005.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/20000001.txt has changed
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_expected/private/100059C9/cenrep_rfs.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/access_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="AccessTest" version="1">
+  <feature ref="AccessTest" name="Settings for testing access parsing">
+    <setting ref="Setting1" type="int"/>
+    <setting ref="Setting2" type="int"/>
+    <setting ref="Setting3" type="int"/>
+    <setting ref="Setting4" type="int"/>
+    <setting ref="Setting5" type="int"/>
+    <setting ref="Setting6" type="int"/>
+    <setting ref="Setting7" type="int"/>
+    <setting ref="Setting8" type="int"/>
+    <setting ref="Setting9" type="int"/>
+    <setting ref="Setting10" type="int"/>
+    <setting ref="Setting11" type="int"/>
+    <setting ref="Setting12" type="int"/>
+    <setting ref="Setting13" type="int"/>
+    <setting ref="Setting14" type="int"/>
+    <setting ref="Setting15" type="int"/>
+    <setting ref="Setting16" type="int"/>
+    <setting ref="Setting17" type="int"/>
+    <setting ref="Setting18" type="int"/>
+    <setting ref="Setting19" type="int"/>
+    <setting ref="Setting20" type="int"/>
+  </feature>
+  <data>
+    <AccessTest>
+      <Setting1>1</Setting1>
+      <Setting2>2</Setting2>
+      <Setting3>3</Setting3>
+      <Setting4>4</Setting4>
+      <Setting5>5</Setting5>
+      <Setting6>6</Setting6>
+      <Setting7>7</Setting7>
+      <Setting8>8</Setting8>
+      <Setting9>9</Setting9>
+      <Setting10>10</Setting10>
+      <Setting11>11</Setting11>
+      <Setting12>12</Setting12>
+      <Setting13>13</Setting13>
+      <Setting14>14</Setting14>
+      <Setting15>15</Setting15>
+      <Setting16>16</Setting16>
+      <Setting17>17</Setting17>
+      <Setting18>18</Setting18>
+      <Setting19>19</Setting19>
+      <Setting20>20</Setting20>
+    </AccessTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/access_test_2.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="dlmgr">
+  <feature name="Access test 2" ref="AccessTest2">
+    <setting name="Setting 1" ref="Setting1" type="int">
+      <desc>Test setting 1</desc>
+    </setting>
+    <setting name="Setting 2" ref="Setting2" type="int">
+      <desc>Test setting 2</desc>
+    </setting>
+  </feature>
+  <data>
+    <AccessTest2>
+      <Setting1>0</Setting1>
+      <Setting2>0</Setting2>
+    </AccessTest2>
+  </data>
+  <rfs>
+    <AccessTest2>
+      <Setting1>false</Setting1>
+      <Setting2>false</Setting2>
+    </AccessTest2>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/all_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="AllRfsFeature" version="1">
+  <feature ref="AllRfsFeature" name="Feature with all settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <AllRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </AllRfsFeature>
+  </data>
+  
+  <rfs>
+    <AllRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>true</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </AllRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/backup_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="BackupTest" version="1">
+  <feature ref="BackupTest" name="Settings for testing CRML backup info parsing">
+    <setting ref="Setting1" type="int"/>
+    <setting ref="Setting2" type="int"/>
+    <setting ref="Setting3" type="int"/>
+    <setting ref="Setting4" type="int"/>
+    <setting ref="Setting5" type="int"/>
+  </feature>
+  <data>
+    <BackupTest>
+      <Setting1>1</Setting1>
+      <Setting2>2</Setting2>
+      <Setting3>3</Setting3>
+      <Setting4>4</Setting4>
+      <Setting5>5</Setting5>
+    </BackupTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/bitmask_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="RepoRfsFeature" version="1">
+  <feature ref="BitmaskRfsFeature" name="Feature for testing RFS with bitmask CenRep keys">
+    <setting ref="Mask1Bit0" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit1" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit2" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask1Bit3" name="Boolean setting" type="boolean"/>
+    
+    <setting ref="Mask2Bit0" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit1" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit2" name="Boolean setting" type="boolean"/>
+    <setting ref="Mask2Bit3" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <BitmaskRfsFeature>
+      <Mask1Bit0>0</Mask1Bit0>
+      <Mask1Bit1>1</Mask1Bit1>
+      <Mask1Bit2>1</Mask1Bit2>
+      <Mask1Bit3>0</Mask1Bit3>
+      
+      <Mask2Bit0>1</Mask2Bit0>
+      <Mask2Bit1>0</Mask2Bit1>
+      <Mask2Bit2>0</Mask2Bit2>
+      <Mask2Bit3>1</Mask2Bit3>
+    </BitmaskRfsFeature>
+  </data>
+  
+  <rfs>
+    <BitmaskRfsFeature>
+      <Mask1Bit0>false</Mask1Bit0>
+      <Mask1Bit1>false</Mask1Bit1>
+      <Mask1Bit2>false</Mask1Bit2>
+      <Mask1Bit3>false</Mask1Bit3>
+      
+      <Mask2Bit0>false</Mask2Bit0>
+      <Mask2Bit1>true</Mask2Bit1>
+      <Mask2Bit2>false</Mask2Bit2>
+      <Mask2Bit3>false</Mask2Bit3>
+    </BitmaskRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/bitmask_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,260 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Bitmask test" version="1">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+    
+    <setting ref="InvertedMaskBit1" name="Inverted mask, Bit 1" type="boolean"/>
+    <setting ref="InvertedMaskBit2" name="Inverted mask, Bit 2" type="boolean"/>
+    <setting ref="InvertedMaskBit3" name="Inverted mask, Bit 3" type="boolean"/>
+    <setting ref="InvertedMaskBit4" name="Inverted mask, Bit 4" type="boolean"/>
+    
+    <setting ref="Int32Bit1" name="Int32, Bit 1" type="boolean"/>
+    <setting ref="Int32Bit2" name="Int32, Bit 2" type="boolean"/>
+    <setting ref="Int32Bit3" name="Int32, Bit 3" type="boolean"/>
+    <setting ref="Int32Bit4" name="Int32, Bit 4" type="boolean"/>
+    <setting ref="Int32Bit5" name="Int32, Bit 5" type="boolean"/>
+    <setting ref="Int32Bit6" name="Int32, Bit 6" type="boolean"/>
+    <setting ref="Int32Bit7" name="Int32, Bit 7" type="boolean"/>
+    <setting ref="Int32Bit8" name="Int32, Bit 8" type="boolean"/>
+    <setting ref="Int32Bit9" name="Int32, Bit 9" type="boolean"/>
+    <setting ref="Int32Bit10" name="Int32, Bit 10" type="boolean"/>
+    <setting ref="Int32Bit11" name="Int32, Bit 11" type="boolean"/>
+    <setting ref="Int32Bit12" name="Int32, Bit 12" type="boolean"/>
+    <setting ref="Int32Bit13" name="Int32, Bit 13" type="boolean"/>
+    <setting ref="Int32Bit14" name="Int32, Bit 14" type="boolean"/>
+    <setting ref="Int32Bit15" name="Int32, Bit 15" type="boolean"/>
+    <setting ref="Int32Bit16" name="Int32, Bit 16" type="boolean"/>
+    <setting ref="Int32Bit17" name="Int32, Bit 17" type="boolean"/>
+    <setting ref="Int32Bit18" name="Int32, Bit 18" type="boolean"/>
+    <setting ref="Int32Bit19" name="Int32, Bit 19" type="boolean"/>
+    <setting ref="Int32Bit20" name="Int32, Bit 20" type="boolean"/>
+    <setting ref="Int32Bit21" name="Int32, Bit 21" type="boolean"/>
+    <setting ref="Int32Bit22" name="Int32, Bit 22" type="boolean"/>
+    <setting ref="Int32Bit23" name="Int32, Bit 23" type="boolean"/>
+    <setting ref="Int32Bit24" name="Int32, Bit 24" type="boolean"/>
+    <setting ref="Int32Bit25" name="Int32, Bit 25" type="boolean"/>
+    <setting ref="Int32Bit26" name="Int32, Bit 26" type="boolean"/>
+    <setting ref="Int32Bit27" name="Int32, Bit 27" type="boolean"/>
+    <setting ref="Int32Bit28" name="Int32, Bit 28" type="boolean"/>
+    <setting ref="Int32Bit29" name="Int32, Bit 29" type="boolean"/>
+    <setting ref="Int32Bit30" name="Int32, Bit 30" type="boolean"/>
+    <setting ref="Int32Bit31" name="Int32, Bit 31" type="boolean"/>
+    <setting ref="Int32Bit32" name="Int32, Bit 32" type="boolean"/>
+    
+    <setting ref="SparseInt32Bit1" name="Sparse Int32, Bit 1" type="boolean"/>
+    <setting ref="SparseInt32Bit7" name="Sparse Int32, Bit 7" type="boolean"/>
+    <setting ref="SparseInt32Bit18" name="Sparse Int32, Bit 18" type="boolean"/>
+    <setting ref="SparseInt32Bit24" name="Sparse Int32, Bit 24" type="boolean"/>
+    <setting ref="SparseInt32Bit31" name="Sparse Int32, Bit 31" type="boolean"/>
+
+    <setting ref="BinaryBit1" name="Binary, Bit 1" type="boolean"/>
+    <setting ref="BinaryBit10" name="Binary, Bit 10" type="boolean"/>
+    <setting ref="BinaryBit20" name="Binary, Bit 20" type="boolean"/>
+    <setting ref="BinaryBit30" name="Binary, Bit 30" type="boolean"/>
+    <setting ref="BinaryBit40" name="Binary, Bit 40" type="boolean"/>
+    <setting ref="BinaryBit50" name="Binary, Bit 50" type="boolean"/>
+    <setting ref="BinaryBit60" name="Binary, Bit 60" type="boolean"/>
+    <setting ref="BinaryBit70" name="Binary, Bit 70" type="boolean"/>
+    <setting ref="BinaryBit80" name="Binary, Bit 80" type="boolean"/>
+    <setting ref="BinaryBit90" name="Binary, Bit 90" type="boolean"/>
+    <setting ref="BinaryBit100" name="Binary, Bit 100" type="boolean"/>
+    
+    <setting ref="BinaryMask2Bit1" name="Binary mask 2, Bit 1" type="boolean"/>
+    <setting ref="BinaryMask2Bit2" name="Binary mask 2, Bit 2" type="boolean"/>
+    <setting ref="BinaryMask2Bit3" name="Binary mask 2, Bit 3" type="boolean"/>
+    <setting ref="BinaryMask2Bit4" name="Binary mask 2, Bit 4" type="boolean"/>
+    <setting ref="BinaryMask2Bit5" name="Binary mask 2, Bit 5" type="boolean"/>
+    <setting ref="BinaryMask2Bit6" name="Binary mask 2, Bit 6" type="boolean"/>
+    <setting ref="BinaryMask2Bit7" name="Binary mask 2, Bit 7" type="boolean"/>
+    <setting ref="BinaryMask2Bit8" name="Binary mask 2, Bit 8" type="boolean"/>
+    <setting ref="BinaryMask2Bit9" name="Binary mask 2, Bit 9" type="boolean"/>
+    <setting ref="BinaryMask2Bit10" name="Binary mask 2, Bit 10" type="boolean"/>
+    <setting ref="BinaryMask2Bit11" name="Binary mask 2, Bit 11" type="boolean"/>
+    <setting ref="BinaryMask2Bit12" name="Binary mask 2, Bit 12" type="boolean"/>
+    <setting ref="BinaryMask2Bit13" name="Binary mask 2, Bit 13" type="boolean"/>
+    <setting ref="BinaryMask2Bit14" name="Binary mask 2, Bit 14" type="boolean"/>
+    <setting ref="BinaryMask2Bit15" name="Binary mask 2, Bit 15" type="boolean"/>
+    <setting ref="BinaryMask2Bit16" name="Binary mask 2, Bit 16" type="boolean"/>
+    <setting ref="BinaryMask2Bit17" name="Binary mask 2, Bit 17" type="boolean"/>
+    
+    <setting ref="BinaryMask3Bit1" name="Binary mask 3, Bit 1" type="boolean"/>
+    <setting ref="BinaryMask3Bit2" name="Binary mask 3, Bit 2" type="boolean"/>
+    <setting ref="BinaryMask3Bit3" name="Binary mask 3, Bit 3" type="boolean"/>
+    <setting ref="BinaryMask3Bit4" name="Binary mask 3, Bit 4" type="boolean"/>
+    <setting ref="BinaryMask3Bit5" name="Binary mask 3, Bit 5" type="boolean"/>
+    <setting ref="BinaryMask3Bit6" name="Binary mask 3, Bit 6" type="boolean"/>
+    <setting ref="BinaryMask3Bit7" name="Binary mask 3, Bit 7" type="boolean"/>
+    <setting ref="BinaryMask3Bit8" name="Binary mask 3, Bit 8" type="boolean"/>
+    <setting ref="BinaryMask3Bit9" name="Binary mask 3, Bit 9" type="boolean"/>
+    <setting ref="BinaryMask3Bit10" name="Binary mask 3, Bit 10" type="boolean"/>
+    <setting ref="BinaryMask3Bit11" name="Binary mask 3, Bit 11" type="boolean"/>
+    <setting ref="BinaryMask3Bit12" name="Binary mask 3, Bit 12" type="boolean"/>
+    <setting ref="BinaryMask3Bit13" name="Binary mask 3, Bit 13" type="boolean"/>
+    <setting ref="BinaryMask3Bit14" name="Binary mask 3, Bit 14" type="boolean"/>
+    <setting ref="BinaryMask3Bit15" name="Binary mask 3, Bit 15" type="boolean"/>
+    <setting ref="BinaryMask3Bit16" name="Binary mask 3, Bit 16" type="boolean"/>
+    <setting ref="BinaryMask3Bit17" name="Binary mask 3, Bit 17" type="boolean"/>
+    
+    <setting ref="BinaryMask4Bit1" name="Binary mask 4, Bit 1" type="boolean"/>
+    <setting ref="BinaryMask4Bit2" name="Binary mask 4, Bit 2" type="boolean"/>
+    <setting ref="BinaryMask4Bit3" name="Binary mask 4, Bit 3" type="boolean"/>
+    <setting ref="BinaryMask4Bit4" name="Binary mask 4, Bit 4" type="boolean"/>
+    <setting ref="BinaryMask4Bit5" name="Binary mask 4, Bit 5" type="boolean"/>
+    <setting ref="BinaryMask4Bit6" name="Binary mask 4, Bit 6" type="boolean"/>
+    <setting ref="BinaryMask4Bit7" name="Binary mask 4, Bit 7" type="boolean"/>
+    <setting ref="BinaryMask4Bit8" name="Binary mask 4, Bit 8" type="boolean"/>
+    <setting ref="BinaryMask4Bit9" name="Binary mask 4, Bit 9" type="boolean"/>
+    <setting ref="BinaryMask4Bit10" name="Binary mask 4, Bit 10" type="boolean"/>
+    <setting ref="BinaryMask4Bit11" name="Binary mask 4, Bit 11" type="boolean"/>
+    <setting ref="BinaryMask4Bit12" name="Binary mask 4, Bit 12" type="boolean"/>
+    <setting ref="BinaryMask4Bit13" name="Binary mask 4, Bit 13" type="boolean"/>
+    <setting ref="BinaryMask4Bit14" name="Binary mask 4, Bit 14" type="boolean"/>
+    <setting ref="BinaryMask4Bit15" name="Binary mask 4, Bit 15" type="boolean"/>
+    <setting ref="BinaryMask4Bit16" name="Binary mask 4, Bit 16" type="boolean"/>
+    <setting ref="BinaryMask4Bit17" name="Binary mask 4, Bit 17" type="boolean"/>
+    
+    <setting ref="BinaryMask5Bit1" name="Binary mask 5, Bit 1" type="boolean"/>
+    
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+      
+      <InvertedMaskBit1>false</InvertedMaskBit1>
+      <InvertedMaskBit2>true</InvertedMaskBit2>
+      <InvertedMaskBit3>false</InvertedMaskBit3>
+      <InvertedMaskBit4>true</InvertedMaskBit4>
+      
+      <Int32Bit1>false</Int32Bit1>
+      <Int32Bit2>true</Int32Bit2>
+      <Int32Bit3>true</Int32Bit3>
+      <Int32Bit4>false</Int32Bit4>
+      <Int32Bit5>true</Int32Bit5>
+      <Int32Bit6>false</Int32Bit6>
+      <Int32Bit7>true</Int32Bit7>
+      <Int32Bit8>false</Int32Bit8>
+      <Int32Bit9>true</Int32Bit9>
+      <Int32Bit10>true</Int32Bit10>
+      <Int32Bit11>1</Int32Bit11>
+      <Int32Bit12>0</Int32Bit12>
+      <Int32Bit13>1</Int32Bit13>
+      <Int32Bit14>0</Int32Bit14>
+      <Int32Bit15>1</Int32Bit15>
+      <Int32Bit16>1</Int32Bit16>
+      <Int32Bit17>0</Int32Bit17>
+      <Int32Bit18>1</Int32Bit18>
+      <Int32Bit19>0</Int32Bit19>
+      <Int32Bit20>1</Int32Bit20>
+      <Int32Bit21>1</Int32Bit21>
+      <Int32Bit22>0</Int32Bit22>
+      <Int32Bit23>1</Int32Bit23>
+      <Int32Bit24>0</Int32Bit24>
+      <Int32Bit25>1</Int32Bit25>
+      <Int32Bit26>1</Int32Bit26>
+      <Int32Bit27>0</Int32Bit27>
+      <Int32Bit28>1</Int32Bit28>
+      <Int32Bit29>0</Int32Bit29>
+      <Int32Bit30>1</Int32Bit30>
+      <Int32Bit31>1</Int32Bit31>
+      <Int32Bit32>0</Int32Bit32>
+      
+      <SparseInt32Bit1>1</SparseInt32Bit1>
+      <SparseInt32Bit7>true</SparseInt32Bit7>
+      <SparseInt32Bit18>1</SparseInt32Bit18>
+      <SparseInt32Bit24>true</SparseInt32Bit24>
+      <SparseInt32Bit31>1</SparseInt32Bit31>
+      
+      <BinaryBit1>true</BinaryBit1>
+      <BinaryBit10>1</BinaryBit10>
+      <BinaryBit20>false</BinaryBit20>
+      <BinaryBit30>true</BinaryBit30>
+      <BinaryBit40>0</BinaryBit40>
+      <BinaryBit50>true</BinaryBit50>
+      <BinaryBit60>1</BinaryBit60>
+      <BinaryBit70>true</BinaryBit70>
+      <BinaryBit80>1</BinaryBit80>
+      <BinaryBit90>true</BinaryBit90>
+      <BinaryBit100>1</BinaryBit100>
+      
+      <BinaryMask2Bit1>0</BinaryMask2Bit1>
+      <BinaryMask2Bit2>0</BinaryMask2Bit2>
+      <BinaryMask2Bit3>0</BinaryMask2Bit3>
+      <BinaryMask2Bit4>0</BinaryMask2Bit4>
+      <BinaryMask2Bit5>0</BinaryMask2Bit5>
+      <BinaryMask2Bit6>0</BinaryMask2Bit6>
+      <BinaryMask2Bit7>0</BinaryMask2Bit7>
+      <BinaryMask2Bit8>0</BinaryMask2Bit8>
+      <BinaryMask2Bit9>0</BinaryMask2Bit9>
+      <BinaryMask2Bit10>0</BinaryMask2Bit10>
+      <BinaryMask2Bit11>0</BinaryMask2Bit11>
+      <BinaryMask2Bit12>0</BinaryMask2Bit12>
+      <BinaryMask2Bit13>0</BinaryMask2Bit13>
+      <BinaryMask2Bit14>0</BinaryMask2Bit14>
+      <BinaryMask2Bit15>0</BinaryMask2Bit15>
+      <BinaryMask2Bit16>1</BinaryMask2Bit16>
+      <BinaryMask2Bit17>0</BinaryMask2Bit17>
+      
+      <BinaryMask3Bit1>0</BinaryMask3Bit1>
+      <BinaryMask3Bit2>0</BinaryMask3Bit2>
+      <BinaryMask3Bit3>0</BinaryMask3Bit3>
+      <BinaryMask3Bit4>1</BinaryMask3Bit4>
+      <BinaryMask3Bit5>0</BinaryMask3Bit5>
+      <BinaryMask3Bit6>0</BinaryMask3Bit6>
+      <BinaryMask3Bit7>0</BinaryMask3Bit7>
+      <BinaryMask3Bit8>1</BinaryMask3Bit8>
+      <BinaryMask3Bit9>0</BinaryMask3Bit9>
+      <BinaryMask3Bit10>0</BinaryMask3Bit10>
+      <BinaryMask3Bit11>0</BinaryMask3Bit11>
+      <BinaryMask3Bit12>0</BinaryMask3Bit12>
+      <BinaryMask3Bit13>0</BinaryMask3Bit13>
+      <BinaryMask3Bit14>0</BinaryMask3Bit14>
+      <BinaryMask3Bit15>0</BinaryMask3Bit15>
+      <BinaryMask3Bit16>0</BinaryMask3Bit16>
+      <BinaryMask3Bit17>0</BinaryMask3Bit17>
+      
+      <BinaryMask4Bit1>0</BinaryMask4Bit1>
+      <BinaryMask4Bit2>0</BinaryMask4Bit2>
+      <BinaryMask4Bit3>0</BinaryMask4Bit3>
+      <BinaryMask4Bit4>1</BinaryMask4Bit4>
+      <BinaryMask4Bit5>0</BinaryMask4Bit5>
+      <BinaryMask4Bit6>0</BinaryMask4Bit6>
+      <BinaryMask4Bit7>0</BinaryMask4Bit7>
+      <BinaryMask4Bit8>1</BinaryMask4Bit8>
+      <BinaryMask4Bit9>0</BinaryMask4Bit9>
+      <BinaryMask4Bit10>0</BinaryMask4Bit10>
+      <BinaryMask4Bit11>0</BinaryMask4Bit11>
+      <BinaryMask4Bit12>0</BinaryMask4Bit12>
+      <BinaryMask4Bit13>0</BinaryMask4Bit13>
+      <BinaryMask4Bit14>0</BinaryMask4Bit14>
+      <BinaryMask4Bit15>0</BinaryMask4Bit15>
+      <BinaryMask4Bit16>1</BinaryMask4Bit16>
+      <BinaryMask4Bit17>1</BinaryMask4Bit17>
+      
+      <BinaryMask5Bit1>0</BinaryMask5Bit1>
+
+    </BitmaskTest>
+  </data>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/booleans.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_binaries.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CrmlBinaries" version="1">
+  <feature ref="CrmlBinaries" name="Settings with CRML int implementations">
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="EmptyStringSetting" name="Empty string setting" type="string"/>
+  </feature>
+  <data>
+    <CrmlBinaries>
+      <IntSetting>10</IntSetting>
+      <StringSetting>B371C72F3D82C38D9B8C7AAD8BF542BD</StringSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <EmptyStringSetting></EmptyStringSetting>
+    </CrmlBinaries>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_ints.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CrmlInts" version="1">
+  <feature ref="CrmlInts" name="Settings with CRML int implementations">
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="IntSettingHex" name="Int setting (hex value)" type="int"/>
+  </feature>
+  <data>
+    <CrmlInts>
+      <IntSetting>10</IntSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <IntSettingHex>0xA</IntSettingHex>
+    </CrmlInts>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_reals.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CrmlReals" version="1">
+  <feature ref="CrmlReals" name="Settings with CRML real implementations">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="RealSetting2" name="Real setting 2" type="real"/>
+    <setting ref="RealSetting3" name="Real setting 3" type="real"/>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0.5"/>
+      <option name="Option1" value="1.5"/>
+      <option name="Option2" value="2.5"/>
+      <option name="Option3" value="3.5"/>
+      <option name="Option4" value="4.5"/>
+    </setting>
+  </feature>
+  <data>
+    <CrmlReals>
+      <RealSetting>1.2345</RealSetting>
+      <RealSetting2>0.0000</RealSetting2>
+      <RealSetting3>0</RealSetting3>
+      <SelectionSetting>1.5</SelectionSetting>
+    </CrmlReals>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_strings.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CrmlStrings" version="1">
+  <feature ref="CrmlStrings" name="Settings with CRML string implementations">
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <option name="Option0" value="opt0"/>
+      <option name="Option1" value="opt1"/>
+      <option name="Option2" value="opt2"/>
+      <option name="Option3" value="opt3"/>
+      <option name="Option4" value="opt4"/>
+    </setting>
+    <setting ref="EmptyStringSetting" name="Empty string setting" type="string"/>
+  </feature>
+  <data>
+    <CrmlStrings>
+      <IntSetting>10</IntSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <RealSetting>11.3</RealSetting>
+      <StringSetting>älämölö カタカナ &lt;&amp;&gt; \&quot;</StringSetting>
+      <SelectionSetting>opt3</SelectionSetting>
+      <EmptyStringSetting></EmptyStringSetting>
+    </CrmlStrings>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/crml_strings8.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="CrmlStrings8" version="1">
+  <feature ref="CrmlStrings8" name="Settings with CRML string implementations">
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <option name="Option0" value="opt0"/>
+      <option name="Option1" value="opt1"/>
+      <option name="Option2" value="opt2"/>
+      <option name="Option3" value="opt3"/>
+      <option name="Option4" value="opt4"/>
+    </setting>
+    <setting ref="EmptyStringSetting" name="Empty string setting" type="string"/>
+  </feature>
+  <data>
+    <CrmlStrings8>
+      <IntSetting>10</IntSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <RealSetting>11.3</RealSetting>
+      <StringSetting>älämölö カタカナ &lt;&amp;&gt; \&quot;</StringSetting>
+      <SelectionSetting>opt3</SelectionSetting>
+      <EmptyStringSetting></EmptyStringSetting>
+    </CrmlStrings8>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1">
+    <desc>Feature with all setting types</desc>
+    <setting ref="FolderSetting" name="Folder setting" type="folder">
+      <desc>A folder setting</desc>
+    </setting>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="FileSetting" name="File setting" type="file">
+      <desc>A file setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <desc>A folder sub-setting</desc>
+      </setting>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <desc>A file sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <FolderSetting>default_folder</FolderSetting>
+      <RealSetting>3.14</RealSetting>
+      <FileSetting>default_file.txt</FileSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <FolderSubSetting>seq/default_folder</FolderSubSetting>
+        <RealSubSetting>1.0</RealSubSetting>
+        <FileSubSetting>seq/default_file.txt</FileSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def1_folder</FolderSubSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <FileSubSetting>seq/def1_file.txt</FileSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def2_folder</FolderSubSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <FileSubSetting>seq/def2_file.txt</FileSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/key_range.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Key range test" version="1">
+  <feature ref="KeyRangeTest" name="Key range test">
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder"/>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real"/>
+      <setting ref="FileSubSetting" name="File sub-setting" type="file"/>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int"/>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean"/>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+    
+    <setting ref="EmptySequenceSetting" name="Empty sequence setting" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+    
+    <setting ref="SequenceSetting2" name="Sequence setting 2" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+    <setting ref="SequenceSetting3" name="Sequence setting 3" type="sequence">
+      <setting ref="StringSubSetting" name="String sub-setting" type="string"/>
+    </setting>
+  </feature>
+  <data>
+    <KeyRangeTest>
+      <SequenceSetting template="true">
+        <FolderSubSetting>seq/default_folder</FolderSubSetting>
+        <RealSubSetting>1.0</RealSubSetting>
+        <FileSubSetting>seq/default_file.txt</FileSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def1_folder</FolderSubSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <FileSubSetting>seq/def1_file.txt</FileSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def2_folder</FolderSubSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <FileSubSetting>seq/def2_file.txt</FileSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>true</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def3_folder</FolderSubSetting>
+        <RealSubSetting>1.75</RealSubSetting>
+        <FileSubSetting>seq/def3_file.txt</FileSubSetting>
+        <IntSubSetting>512</IntSubSetting>
+        <StringSubSetting>def3</StringSubSetting>
+        <BooleanSubSetting>1</BooleanSubSetting>
+        <SelectionSubSetting>3</SelectionSubSetting>
+      </SequenceSetting>
+      
+      <EmptySequenceSetting template="true">
+        <StringSubSetting></StringSubSetting>
+      </EmptySequenceSetting>
+      
+      <SequenceSetting2 template="true">
+        <StringSubSetting>template</StringSubSetting>
+      </SequenceSetting2>
+      <SequenceSetting2>
+        <StringSubSetting>test 1</StringSubSetting>
+      </SequenceSetting2>
+      <SequenceSetting2>
+        <StringSubSetting>test 2</StringSubSetting>
+      </SequenceSetting2>
+      
+      <SequenceSetting3 template="true">
+        <StringSubSetting>template</StringSubSetting>
+      </SequenceSetting3>
+      <SequenceSetting3>
+        <StringSubSetting>test 1</StringSubSetting>
+      </SequenceSetting3>
+      <SequenceSetting3>
+        <StringSubSetting>test 2</StringSubSetting>
+      </SequenceSetting3>
+    </KeyRangeTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/key_range_2.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,104 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="KeyRange2">
+  <feature ref="KeyRange2" name="Key range test 2">
+	<setting type="sequence" ref="Sequence" maxOccurs="7" name="Records">
+	    <setting ref="Int1" name="Int 1" type="int" readOnly="false"/>
+	    <setting ref="Int2" name="Int 2" type="int" readOnly="false"/>
+	    <setting ref="String1" name="String 1" type="string" readOnly="false"/>
+	    <setting ref="String2" name="String 2" type="string" readOnly="false"/>
+	</setting>
+  </feature>
+  <data>
+    <KeyRange2>
+	  <Sequence>
+		  <Int1>0x10285AA9</Int1>
+	      <Int2>0</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>0</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>1</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>1</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>1</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>1</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>0x10285AA9</Int1>
+	      <Int2>1</Int2>
+	      <String1>127.0.0.1</String1>
+	      <String2>20080514:134400.000000</String2>
+	  </Sequence>
+    </KeyRange2>
+  </data>
+  <rfs>
+    <KeyRange2>
+	  <DefaultRecordId>false</DefaultRecordId>
+	  <Sequence>
+		  <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+	  <Sequence>
+	      <Int1>false</Int1>
+	      <Int2>false</Int2>
+	      <String1>false</String1>
+	      <String2>false</String2>
+	  </Sequence>
+    </KeyRange2>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/no_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="NoRfsFeature" version="1">
+  <feature ref="NoRfsFeature" name="Feature with no settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <NoRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </NoRfsFeature>
+  </data>
+  
+  <rfs>
+    <NoRfsFeature>
+      <RealSetting>false</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </NoRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/partial_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="PartialRfsFeature" version="1">
+  <feature ref="PartialRfsFeature" name="Feature with some settings RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <PartialRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </PartialRfsFeature>
+  </data>
+  
+  <rfs>
+    <PartialRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </PartialRfsFeature>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/repo_rfs.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="RepoRfsFeature" version="1">
+  <feature ref="RepoRfsFeature" name="Feature with the whole central repository RFS=true">
+    <setting ref="RealSetting" name="Real setting" type="real"/>
+    <setting ref="IntSetting" name="Int setting" type="int"/>
+    <setting ref="StringSetting" name="String setting" type="string"/>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean"/>
+  </feature>
+  <data>
+    <RepoRfsFeature>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+    </RepoRfsFeature>
+  </data>
+  
+  <!--
+  The values defined here should not matter when the whole repository is
+  marked with rfs="true" in the .crml file
+  -->
+  <rfs>
+    <RepoRfsFeature>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>true</StringSetting>
+      <BooleanSetting>false</BooleanSetting>
+    </RepoRfsFeature>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/sequence_with_rfs_test.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/confml/special_char_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Special char test" version="1">
+  <feature ref="SpecialCharTest" name="Special char test">
+    <setting ref="Test1" name="Test 1" type="string"/>
+    <setting ref="Test2" name="Test 2" type="string"/>
+    <setting ref="Test3" name="Test 3" type="string"/>
+    <setting ref="Test4" name="Test 4" type="string"/>
+    <setting ref="Test5" name="Test 5" type="string"/>
+    <setting ref="Test6" name="Test 6" type="string"/>
+  </feature>
+  <data>
+    <SpecialCharTest>
+      <Test1>älämölö</Test1>
+      <Test2>ударениÑ</Test2>
+      <Test3>ελληνικά</Test3>
+      <Test4>カタカナ</Test4>
+      <Test5>中國話</Test5>
+      <Test6>&lt;&amp;&gt;</Test6>
+    </SpecialCharTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000001_feature1.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="Feature1_1" uidValue="0x00000001" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="Feature1/IntSetting" name="Int setting" int="0x00000001" type="int" readOnly="false" backup="true">
+    <access type="R" capabilities="AlwaysPass"/>
+  </key>
+  <key ref="Feature1/RealSetting" name="Real setting" int="0x00000002" type="real" readOnly="false" backup="true">
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+  <key ref="Feature1/SelectionSetting" name="Selection setting" int="0x00000003" type="int" readOnly="false">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+  <key ref="Feature1/BooleanSetting" name="Selection setting" int="0x00000004" type="int" readOnly="false">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+  
+  <key ref="Feature1/StringSetting" name="String setting" int="0x00000005" type="string" readOnly="false">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000002_feature2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="Feature2" uidValue="0x00000002" owner="0xABCD0000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <keyRange ref="Feature2/SequenceSetting" name="Sequence setting"
+    firstInt="0x01000000" lastInt="0x01ffffff"
+	countInt="0x01000001" indexBits="0x00ff0000" firstIndex="2">
+    <access type="R" capabilities="AlwaysPass"/>
+	<access type="W" capabilities="WriteDeviceData"/>
+	<key int="0x00000001" type="int" ref="IntSubSetting"/>
+	<key int="0x00000002" type="string" ref="StringSubSetting"/>
+  </keyRange>
+  
+  <key ref="Feature2/IntSetting" name="Int setting" int="0x00000003" type="int" readOnly="false">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+</repository>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000003_bitmask_test.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,153 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskTest" uidValue="0x00000003">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+
+  <key name="Bitmask" type="int" int="0x00000001" readOnly="true">
+    <access type="R" capabilities="AlwaysPass"/>
+    <bit ref="BitmaskTest/Bit0">1</bit>
+    <bit ref="BitmaskTest/Bit1">2</bit>
+    <bit ref="BitmaskTest/Bit2">3</bit>
+    <bit ref="BitmaskTest/Bit3">4</bit>
+    <bit ref="BitmaskTest/Bit4">5</bit>
+    <bit ref="BitmaskTest/Bit5">6</bit>
+  </key>
+  
+  <!--
+  This doesn't work in CT2, so not used in ConE plug-in tests for now
+  
+  <key name="InvertedMask" type="int" int="0x00000002" readOnly="true">
+    <bit ref="BitmaskTest/InvertedMaskBit1" value="false">1</bit>
+    <bit ref="BitmaskTest/InvertedMaskBit2" value="false">2</bit>
+    <bit ref="BitmaskTest/InvertedMaskBit3" value="false">3</bit>
+    <bit ref="BitmaskTest/InvertedMaskBit4" value="false">4</bit>
+  </key>
+  -->
+
+  <key name="Int32Mask" type="int" int="0x00000003" readOnly="true">
+    <bit ref="BitmaskTest/Int32Bit1">1</bit>
+    <bit ref="BitmaskTest/Int32Bit2">2</bit>
+    <bit ref="BitmaskTest/Int32Bit3">3</bit>
+    <bit ref="BitmaskTest/Int32Bit4">4</bit>
+    <bit ref="BitmaskTest/Int32Bit5">5</bit>
+    <bit ref="BitmaskTest/Int32Bit6">6</bit>
+    <bit ref="BitmaskTest/Int32Bit7">7</bit>
+    <bit ref="BitmaskTest/Int32Bit8">8</bit>
+    <bit ref="BitmaskTest/Int32Bit9">9</bit>
+    <bit ref="BitmaskTest/Int32Bit10">10</bit>
+    <bit ref="BitmaskTest/Int32Bit11">11</bit>
+    <bit ref="BitmaskTest/Int32Bit12">12</bit>
+    <bit ref="BitmaskTest/Int32Bit13">13</bit>
+    <bit ref="BitmaskTest/Int32Bit14">14</bit>
+    <bit ref="BitmaskTest/Int32Bit15">15</bit>
+    <bit ref="BitmaskTest/Int32Bit16">16</bit>
+    <bit ref="BitmaskTest/Int32Bit17">17</bit>
+    <bit ref="BitmaskTest/Int32Bit18">18</bit>
+    <bit ref="BitmaskTest/Int32Bit19">19</bit>
+    <bit ref="BitmaskTest/Int32Bit20">20</bit>
+    <bit ref="BitmaskTest/Int32Bit21">21</bit>
+    <bit ref="BitmaskTest/Int32Bit22">22</bit>
+    <bit ref="BitmaskTest/Int32Bit23">23</bit>
+    <bit ref="BitmaskTest/Int32Bit24">24</bit>
+    <bit ref="BitmaskTest/Int32Bit25">25</bit>
+    <bit ref="BitmaskTest/Int32Bit26">26</bit>
+    <bit ref="BitmaskTest/Int32Bit27">27</bit>
+    <bit ref="BitmaskTest/Int32Bit28">28</bit>
+    <bit ref="BitmaskTest/Int32Bit29">29</bit>
+    <bit ref="BitmaskTest/Int32Bit30">30</bit>
+    <bit ref="BitmaskTest/Int32Bit31">31</bit>
+    <bit ref="BitmaskTest/Int32Bit32">32</bit>
+  </key>
+  
+  
+  <key name="SparseInt32Bitmask" type="int" int="0x00000004" readOnly="true">
+    <bit ref="BitmaskTest/SparseInt32Bit1">1</bit>
+    <bit ref="BitmaskTest/SparseInt32Bit7">7</bit>
+    <bit ref="BitmaskTest/SparseInt32Bit18">18</bit>
+    <bit ref="BitmaskTest/SparseInt32Bit24">24</bit>
+    <bit ref="BitmaskTest/SparseInt32Bit31">31</bit>
+  </key>
+  
+  <!--
+  This doesn't work in CT2, so not used in ConE plug-in tests for now
+  
+  <key name="BinaryMask" type="binary" int="0x00000005" readOnly="true">
+    <bit ref="BitmaskTest/BinaryBit1">1</bit>
+    <bit ref="BitmaskTest/BinaryBit10">10</bit>
+    <bit ref="BitmaskTest/BinaryBit20">20</bit>
+    <bit ref="BitmaskTest/BinaryBit30">30</bit>
+    <bit ref="BitmaskTest/BinaryBit40">40</bit>
+    <bit ref="BitmaskTest/BinaryBit50">50</bit>
+    <bit ref="BitmaskTest/BinaryBit60">60</bit>
+    <bit ref="BitmaskTest/BinaryBit70">70</bit>
+    <bit ref="BitmaskTest/BinaryBit80">80</bit>
+    <bit ref="BitmaskTest/BinaryBit90">90</bit>
+    <bit ref="BitmaskTest/BinaryBit100">100</bit>
+  </key>
+  -->
+  
+  <key name="BinaryMask2" type="binary" int="0x06000000" readOnly="true">
+    <bit ref="BitmaskTest/BinaryMask2Bit1">1</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit2">2</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit3">3</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit4">4</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit5">5</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit6">6</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit7">7</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit8">8</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit9">9</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit10">10</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit11">11</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit12">12</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit13">13</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit14">14</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit15">15</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit16">16</bit>
+    <bit ref="BitmaskTest/BinaryMask2Bit17">17</bit>
+  </key>
+  
+  <key name="BinaryMask3" type="binary" int="0x07000000" readOnly="true">
+    <bit ref="BitmaskTest/BinaryMask3Bit1">1</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit2">2</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit3">3</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit4">4</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit5">5</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit6">6</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit7">7</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit8">8</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit9">9</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit10">10</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit11">11</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit12">12</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit13">13</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit14">14</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit15">15</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit16">16</bit>
+    <bit ref="BitmaskTest/BinaryMask3Bit17">17</bit>
+  </key>
+  
+  <key name="BinaryMask4" type="binary" int="0x08000000" readOnly="true">
+    <bit ref="BitmaskTest/BinaryMask4Bit1">1</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit2">2</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit3">3</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit4">4</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit5">5</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit6">6</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit7">7</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit8">8</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit9">9</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit10">10</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit11">11</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit12">12</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit13">13</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit14">14</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit15">15</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit16">16</bit>
+    <bit ref="BitmaskTest/BinaryMask4Bit17">17</bit>
+  </key>
+  
+  <key name="BinaryMask5" type="binary" int="0x09000000" readOnly="true">
+    <bit ref="BitmaskTest/BinaryMask5Bit1">1</bit>
+  </key>
+  
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000004_booleans.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidValue="0x00000004" owner="0x1234ABCD">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0x12344321"/>
+  
+  <key ref="Booleans/IntBool1" name="IntBool1" int="0x11" type="int"/>
+  <key ref="Booleans/IntBool2" name="IntBool2" int="0x12" type="int"/>
+  <key ref="Booleans/IntBool3" name="IntBool3" int="0x13" type="int"/>
+  <key ref="Booleans/IntBool4" name="IntBool4" int="0x14" type="int"/>
+  
+  <key name="Bitmask" int="0x40" type="int" backup="true">
+    <bit ref="Booleans/BitmaskBool1">1</bit>
+    <bit ref="Booleans/BitmaskBool2">2</bit>
+    <bit ref="Booleans/BitmaskBool3">3</bit>
+    <bit ref="Booleans/BitmaskBool4">4</bit>
+  </key>
+  
+  <key ref="Booleans/StringBool1" name="StringBool1" int="0x21" type="string"/>
+  <key ref="Booleans/StringBool2" name="StringBool2" int="0x22" type="string"/>
+  <key ref="Booleans/StringBool3" name="StringBool3" int="0x23" type="string"/>
+  <key ref="Booleans/StringBool4" name="StringBool4" int="0x24" type="string"/>
+  
+  <key ref="Booleans/String8Bool1" name="String8Bool1" int="0x31" type="string8"/>
+  <key ref="Booleans/String8Bool2" name="String8Bool2" int="0x32" type="string8"/>
+  <key ref="Booleans/String8Bool3" name="String8Bool3" int="0x33" type="string8"/>
+  <key ref="Booleans/String8Bool4" name="String8Bool4" int="0x34" type="string8"/>
+  
+  <key name="Binary" int="0x50" type="binary">
+    <bit ref="Booleans/BinaryBool1">1</bit>
+    <bit ref="Booleans/BinaryBool2">2</bit>
+    <bit ref="Booleans/BinaryBool3">3</bit>
+    <bit ref="Booleans/BinaryBool4">4</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000005_crml_ints.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="CrmlInts" uidValue="0x00000005" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="CrmlInts/IntSetting" name="Int setting" int="0x00000001" type="int" readOnly="false" backup="true"/>
+  <key ref="CrmlInts/SelectionSetting" name="Selection setting" int="0x00000002" type="int" readOnly="false"/>
+  <key ref="CrmlInts/IntSettingHex" name="Int setting hex" int="0x00000003" type="int" readOnly="false"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000006_crml_reals.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="CrmlReals" uidValue="0x00000006" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="CrmlReals/RealSetting" name="Real setting" int="0x00000001" type="real" readOnly="false" backup="true"/>
+  <key ref="CrmlReals/SelectionSetting" name="Selection setting" int="0x00000002" type="real" readOnly="false"/>
+  <key ref="CrmlReals/RealSetting2" name="Real setting 2" int="0x00000003" type="real" readOnly="false" backup="true"/>
+  <key ref="CrmlReals/RealSetting3" name="Real setting 3" int="0x00000004" type="real" readOnly="false" backup="true"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000007_crml_strings.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="CrmlStrings" uidValue="0x00000007" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="CrmlStrings/IntSetting" name="Int setting" int="0x00000001" type="string" readOnly="false" backup="true"/>
+  <key ref="CrmlStrings/BooleanSetting" name="Selection setting" int="0x00000002" type="string" readOnly="false"/>
+  <key ref="CrmlStrings/RealSetting" name="Selection setting" int="0x00000003" type="string" readOnly="false"/>
+  <key ref="CrmlStrings/StringSetting" name="Selection setting" int="0x00000004" type="string" readOnly="false"/>
+  <key ref="CrmlStrings/SelectionSetting" name="Selection setting" int="0x00000005" type="string" readOnly="false"/>
+  <key ref="CrmlStrings/EmptyStringSetting" name="Empty string setting" int="0x00000006" type="string" readOnly="false"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000008_crml_strings8.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="CrmlStrings8" uidValue="0x00000008" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="CrmlStrings8/IntSetting" name="Int setting" int="0x00000001" type="string" readOnly="false" backup="true"/>
+  <key ref="CrmlStrings8/BooleanSetting" name="Selection setting" int="0x00000002" type="string" readOnly="false"/>
+  <key ref="CrmlStrings8/RealSetting" name="Selection setting" int="0x00000003" type="string" readOnly="false"/>
+  <key ref="CrmlStrings8/StringSetting" name="Selection setting" int="0x00000004" type="string" readOnly="false"/>
+  <key ref="CrmlStrings8/SelectionSetting" name="Selection setting" int="0x00000005" type="string" readOnly="false"/>
+  <key ref="CrmlStrings8/EmptyStringSetting" name="Empty string setting" int="0x00000006" type="string" readOnly="false"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/00000009_crml_binaries.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="CrmlBinaries" uidValue="0x00000009" owner="0x12341000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="CrmlBinaries/IntSetting" name="Int setting" int="0x00000001" type="binary" readOnly="false" backup="true"/>
+  <key ref="CrmlBinaries/StringSetting" name="String setting" int="0x00000002" type="binary" readOnly="false"/>
+  <key ref="CrmlBinaries/SelectionSetting" name="Selection setting" int="0x00000003" type="binary" readOnly="false"/>
+  <key ref="CrmlBinaries/EmptyStringSetting" name="Empty string setting" int="0x00000004" type="binary" readOnly="false"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000A_access_test.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,101 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AccessTest" uidValue="0x0000000A">
+  <access type="R" capabilities="TrustedUi DRM ReadDeviceData" sid="0x12344321"/>
+  <access type="W" capabilities="ProtServ NetworkControl DiskAdmin" sid="0x43211234"/>
+  
+  <!-- Access elements defined again, should not affect anything -->
+  <access type="R" capabilities="ReadDeviceData" sid="0xB0B0B0B0"/>
+  <access type="W" capabilities="WriteDeviceData" sid="0xC0C0C0C0"/>
+  
+  <key ref="AccessTest/Setting1" name="Setting 1" int="0x00000001" type="int">
+    <access type="R" capabilities="TCB CommDD PowerMgmt MultimediaDD ReadDeviceData DRM TrustedUi"/>
+    <access type="W" capabilities="ProtServ DiskAdmin NetworkControl AllFiles SwEvent NetworkServices LocalServices"/>
+  </key>
+  <key ref="AccessTest/Setting2" name="Setting 2" int="0x00000002" type="int">
+    <access type="R" capabilities="ReadDeviceData DRM TrustedUi" sid="0xA0B0C0D0"/>
+    <access type="W" capabilities="ProtServ DiskAdmin NetworkControl" sid="0x0A0B0C0D"/>
+  </key>
+  <key ref="AccessTest/Setting3" name="Setting 3" int="0x00000003" type="int">
+    <access type="R" capabilities="Location UserEnvironment ReadUserData"/>
+    <access type="W" sid="0xA0B0C0D0"/>
+  </key>
+  <key ref="AccessTest/Setting4" name="Setting 4" int="0x00000004" type="int">
+    <access type="R" sid="0xA0B0C0D0"/>
+    <access type="W" capabilities="Location,UserEnvironment,ReadUserData"/>
+  </key>
+  
+  <key ref="AccessTest/Setting5" name="Setting 5" int="0x00000005" type="int">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <key ref="AccessTest/Setting6" name="Setting 6" int="0x00000006" type="int">
+    <access type="R" capabilities="ReadUserData"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <key ref="AccessTest/Setting7" name="Setting 7" int="0x00000007" type="int">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData"/>
+  </key>
+  
+  <!-- Read-only key, but has write capabilities -->
+  <key ref="AccessTest/Setting8" name="Setting 8" int="0x00000008" type="int" readOnly="true">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xAABBCCDD"/>
+  </key>
+  
+  <!-- Keys inheriting access defs from the repository -->
+  <key ref="AccessTest/Setting9" name="Setting 9" int="0x00000009" type="int"/>
+  <key ref="AccessTest/Setting10" name="Setting 10" int="0x0000000a" type="int">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+  </key>
+  <key ref="AccessTest/Setting11" name="Setting 11" int="0x0000000B" type="int">
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <!-- Read-only -->
+  <key ref="AccessTest/Setting12" name="Setting 12" int="0x0000000c" type="int" readOnly="true"/>
+  
+  <!-- Capabilities specified twice -->
+  <key ref="AccessTest/Setting13" name="Setting 13" int="0x0000000D" type="int" readOnly="true">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xAABBCCDD"/>
+    <access type="R" capabilities="ReadDeviceData DRM TrustedUi" sid="0xA0B0C0D0"/>
+    <access type="W" capabilities="ProtServ DiskAdmin NetworkControl" sid="0x0A0B0C0D"/>
+  </key>
+  
+  <!-- Empty capability string -->
+  <key ref="AccessTest/Setting14" name="Setting 14" int="0x0000000e" type="int">
+    <access type="R" capabilities="" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="" sid="0xDDCCBBAA"/>
+  </key>
+  <key ref="AccessTest/Setting15" name="Setting 15" int="0x0000000f" type="int">
+    <access type="R" capabilities="" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+  </key>
+  <key ref="AccessTest/Setting16" name="Setting 16" int="0x00000010" type="int">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="" sid="0xDDCCBBAA"/>
+  </key>
+  
+  <!-- Empty SID string -->
+  <key ref="AccessTest/Setting17" name="Setting 17" int="0x00000011" type="int">
+    <access type="R" capabilities="ReadUserData" sid=""/>
+    <access type="W" capabilities="WriteUserData" sid=""/>
+  </key>
+  <key ref="AccessTest/Setting18" name="Setting 18" int="0x00000012" type="int">
+    <access type="R" capabilities="ReadUserData" sid=""/>
+    <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+  </key>
+  <key ref="AccessTest/Setting19" name="Setting 19" int="0x00000013" type="int">
+    <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+    <access type="W" capabilities="WriteUserData" sid=""/>
+  </key>
+  
+  <key ref="AccessTest/Setting20" name="Setting 20" int="0x00000014" type="int">
+    <access type="R" capabilities="" sid=""/>
+    <access type="W" capabilities="" sid=""/>
+  </key>
+  
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000B_backup_test.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BackupTest" uidValue="0x0000000B" owner="0x10101010" backup="true">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="BackupTest/Setting1" name="Setting 1" int="0x00000001" type="int" readOnly="false" backup="true"/>
+  <key ref="BackupTest/Setting2" name="Setting 2" int="0x00000002" type="int" readOnly="false" backup="false"/>
+  <key ref="BackupTest/Setting3" name="Setting 3" int="0x00000003" type="int" readOnly="true" backup="false"/>
+  <key ref="BackupTest/Setting4" name="Setting 4" int="0x00000004" type="int" backup="true"/>
+  <key ref="BackupTest/Setting5" name="Setting 5" int="0x00000005" type="int" readOnly="true"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000C_key_range.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BackupTest" uidValue="0x0000000C" owner="0x10101010" backup="true">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <!-- This doesn't work correctly in CT2
+  <keyRange firstInt="0x00005000" lastInt="0x00005FFF" backup="true">
+    <access type="R" capabilities="ReadUserData" sid="0x12344321"/>
+    <access type="W" capabilities="WriteUserData"  sid="0x43211234"/>
+  </keyRange>
+  -->
+  
+  <keyRange name="Range 2" firstInt="0x00002000" lastInt="0x00002FFF" backup="true"/>
+  
+  <keyRange firstInt="0x00004000" lastInt="0x00004FFF" readOnly="true" backup="false">
+    <access type="R" capabilities="TCB"/>
+  </keyRange>
+  
+  <keyRange firstInt="0x00003000" lastInt="0x00003FFF">
+    <access type="W" capabilities="WriteUserData"/>
+  </keyRange>
+  <!--
+  <keyRange ref="KeyRangeTest/SequenceSetting" name="Sequence setting"
+    firstInt="0x10000000" lastInt="0x7fffffff"
+    countInt="0x10000001" indexBits="0x0000fff0" firstIndex="5">
+        <access type="W" capabilities="WriteUserData"/>
+        <key int="0x00000001" type="int" ref="IntSubSetting"/>
+        <key int="0x00000002" type="string" ref="StringSubSetting"/>
+        <key int="0x00000005" type="real" ref="RealSubSetting"/>
+        <key int="0x00000006" type="int" ref="SelectionSubSetting"/>
+        <key int="0x00000009" type="int" ref="BooleanSubSetting"/>
+  </keyRange>-->
+  
+  <keyRange ref="KeyRangeTest/EmptySequenceSetting" backup="true" name="Empty sequence setting"
+    firstInt="0x1001" lastInt="0x1fff" indexBits="0x0ff0" firstIndex="1" countInt="0x1000">
+    <desc>History items</desc>
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+    <key ref="StringSubSetting" name="String sub-setting" int="0x0001" type="string8"/>
+  </keyRange>
+  
+  <!-- These key ranges have the ConfML refs specified incorrectly, but they are tested here for CT2 compatibility -->
+  <keyRange ref="KeyRangeTest/SequenceSetting2/StringSubSetting" backup="true" name="Sequence setting 2"
+    firstInt="0x6001" lastInt="0x6fff" indexBits="0x0ff0" firstIndex="1" countInt="0x6000">
+    <key ref="KeyRangeTest/SequenceSetting2/StringSubSetting" name="String sub-setting" int="0x0001" type="string8"/>
+  </keyRange>
+  <keyRange ref="KeyRangeTest/SequenceSetting3" backup="true" name="Sequence setting 3"
+    firstInt="0x7001" lastInt="0x7fff" indexBits="0x0ff0" firstIndex="1" countInt="0x7000">
+    <key ref="KeyRangeTest/StringSubSetting" name="String sub-setting" int="0x0001" type="string8"/>
+  </keyRange>
+  
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000D_sequence_with_rfs_test.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="SequenceWithRfsTest" uidValue="0x0000000D" owner="0xABCD0000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <keyRange ref="SequenceWithRfsTest/SequenceSetting" name="Sequence setting"
+    firstInt="0x01000000" lastInt="0x01ffffff"
+	countInt="0x01000001" indexBits="0x00ff0000" firstIndex="2">
+    <access type="R" capabilities="AlwaysPass"/>
+	<access type="W" capabilities="WriteDeviceData"/>
+	<key int="0x00000001" type="int" ref="IntSubSetting"/>
+	<key int="0x00000002" type="string" ref="StringSubSetting"/>
+  </keyRange>
+</repository>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/0000000E_key_range_2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="KeyRange2" uidValue="0x0000000E" owner="0xA1B2C3D4" initialisationFileVersion="2">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+	<keyRange firstInt="0x00000000" lastInt="0xB00000FF" ref="KeyRange2/Sequence" indexBits="0xff" countInt="0x00000001" firstIndex="0">
+		<key ref="Int1" name="Int 1" int="0x10000000">
+		</key>
+		<key ref="Int2" name="Int 2" int="0x20000000">
+		</key>
+		<key ref="String1" name="String 1" type="string8" int="0x40000000">
+		</key>
+		<key ref="String2" name="String 2" type="string" int="0xA0000000">
+		</key>
+	</keyRange>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E1_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo1" uidValue="0x000000E1" owner="0xABCDDCBA">
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E2_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo2" uidValue="0x000000E2" owner="0xABCDDCBA">
+  <access type="R" capabilities="AlwaysPass"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E3_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo3" uidValue="0x000000E3" owner="0xABCDDCBA">
+  <access type="W" capabilities="AlwaysPass"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E4_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo4" uidValue="0x000000E4" owner="0xABCDDCBA">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E5_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo5" uidValue="0x000000E5" owner="0xABCDDCBA">
+  <access type="R" capabilities="ReadDeviceData"/>
+  <access type="W" capabilities="WriteDeviceData"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E6_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo6" uidValue="0x000000E6">
+  <access type="R" capabilities="AlwaysPass"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E7_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo7" uidValue="0x000000E7">
+  <access type="R" capabilities="" sid="0xAABBCCDD"/>
+  <access type="W" capabilities="" sid="0xDDCCBBAA"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E8_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo8" uidValue="0x000000E8">
+  <access type="R" capabilities="" sid="0xAABBCCDD"/>
+  <access type="W" capabilities="WriteUserData" sid="0xDDCCBBAA"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000E9_empty_repository.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo9" uidValue="0x000000E9">
+  <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+  <access type="W" capabilities="" sid="0xDDCCBBAA"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000EA_empty_repository_ver2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="EmptyRepo10" uidValue="0x000000EA" initialisationFileVersion="2">
+  <access type="R" capabilities="ReadUserData" sid="0xAABBCCDD"/>
+  <access type="W" capabilities="" sid="0xDDCCBBAA"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/000000F1_access_test_2.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AccessTest2" uidValue="0x000000F1">
+  <access type="R" capabilities="AlwaysPass"/>
+  <key ref="AccessTest2/Setting1" name="AccessTestSetting1" int="0x00000001" type="int">
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+  <key ref="AccessTest2/Setting2" readOnly="true" name="AccessTestSetting2" int="0x00000002" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000001_all_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="AllRfsFeature" uidValue="0x10000001">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="AllRfsFeature/RealSetting"      name="Real setting"     int="0x000000D1" type="real"/>
+  <key ref="AllRfsFeature/IntSetting"       name="Int setting"      int="0x000000C2" type="int"/>
+  <key ref="AllRfsFeature/StringSetting"    name="String setting"   int="0x000000B3" type="string"/>
+  <key ref="AllRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x000000A4" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000002_partial_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="PartialRfsFeature" uidValue="0x10000002">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="PartialRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="PartialRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="PartialRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="PartialRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000003_no_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="NoRfsFeature" uidValue="0x10000003">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="NoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="NoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="NoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="NoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000004_repo_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="RepoRfsFeature" uidValue="0x10000004" rfs="true">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="RepoRfsFeature/RealSetting"      name="Real setting"     int="0x00000001" type="real"/>
+  <key ref="RepoRfsFeature/IntSetting"       name="Int setting"      int="0x00000002" type="int"/>
+  <key ref="RepoRfsFeature/StringSetting"    name="String setting"   int="0x00000003" type="string"/>
+  <key ref="RepoRfsFeature/BooleanSetting"   name="Boolean setting"  int="0x00000004" type="int"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/1000005_bitmask_rfs.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="BitmaskRfsFeature" uidValue="0x10000005">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  
+  <key name="Bitmask1" type="int" int="0x0000BDCA">
+    <bit ref="BitmaskRfsFeature/Mask1Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask1Bit3">4</bit>
+  </key>
+  
+  <key name="Bitmask2" type="int" int="0x0000ABCD">
+    <bit ref="BitmaskRfsFeature/Mask2Bit0">1</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit1">2</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit2">3</bit>
+    <bit ref="BitmaskRfsFeature/Mask2Bit3">4</bit>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/implml/20000001_special_char_test.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="SpecialCharTest" uidValue="0x20000001">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="SpecialCharTest/Test1" name="Test 1" int="0x00000001" type="string"/>
+  <key ref="SpecialCharTest/Test2" name="Test 2" int="0x00000002" type="string"/>
+  <key ref="SpecialCharTest/Test3" name="Test 3" int="0x00000003" type="string"/>
+  <key ref="SpecialCharTest/Test4" name="Test 4" int="0x00000004" type="string"/>
+  <key ref="SpecialCharTest/Test5" name="Test 5" int="0x00000005" type="string"/>
+  <key ref="SpecialCharTest/Test6" name="Test 6" int="0x00000006" type="string"/>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/booleans.confml#/"/>
+  <xi:include href="confml/bitmask_test.confml#/"/>
+  <xi:include href="confml/feature1.confml#/"/>
+  <xi:include href="confml/feature2.confml#/"/>
+  <xi:include href="confml/crml_binaries.confml#/"/>
+  <xi:include href="confml/crml_ints.confml#/"/>
+  <xi:include href="confml/crml_reals.confml#/"/>
+  <xi:include href="confml/crml_strings.confml#/"/>
+  <xi:include href="confml/crml_strings8.confml#/"/>
+  <xi:include href="confml/access_test.confml#/"/>
+  <xi:include href="confml/backup_test.confml#/"/>
+  <xi:include href="confml/key_range.confml#/"/>
+  <xi:include href="confml/key_range_2.confml#/"/>
+  <xi:include href="confml/access_test_2.confml#/"/>
+  <xi:include href="confml/sequence_with_rfs_test.confml#/"/>
+  <xi:include href="confml/special_char_test.confml#/"/>
+  
+  <xi:include href="confml/all_rfs.confml#/"/>
+  <xi:include href="confml/partial_rfs.confml#/"/>
+  <xi:include href="confml/no_rfs.confml#/"/>
+  <xi:include href="confml/repo_rfs.confml#/"/>
+  <xi:include href="confml/bitmask_rfs.confml#/"/>
+</confml:configuration>
Binary file configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/gen_project/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_comparator.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,248 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import __init__
+from cone.public import plugin
+from CRMLPlugin.crml_model import *
+from CRMLPlugin.crml_comparator import CrmlComparator
+from cone.public.plugin import FlatComparisonResultEntry as Entry
+
+class TestComparator(unittest.TestCase):
+    def setUp(self):
+        keys = [
+            CrmlSimpleKey(ref='Foo.Bar', int='0x1'),
+            CrmlBitmaskKey(int='0x2', bits=[CrmlBit(ref='Foo.Bit1', index=1),
+                                            CrmlBit(ref='Foo.Bit2', index=2),
+                                            CrmlBit(ref='Foo.Bit4', index=4, invert=True)]),
+            CrmlKeyRange(first_int='0x10000000', last_int='0x1FFFFFFF', ref="Foo.Seq",
+                         subkeys=[CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+                                  CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2')]),
+        ]
+    
+        self.repo = CrmlRepository(
+            uid_value   = '0x10203040',
+            uid_name    = 'KCrUidTest',
+            owner       = '0x11223344',
+            backup      = True,
+            rfs         = True,
+            access      = CrmlAccess(),
+            keys        = keys)
+        
+        self.comparator = CrmlComparator('test.crml', self.repo)
+    
+    
+    def assert_comparison_result_after_change_equals(self,
+        modification_code, added=[], removed=[], modified=[],
+        check_keys_in_entry_data=True,
+        target_resource_ref='test.crml'):
+        # Make a copy of the test repo and modify it using the given code
+        repo = self.repo.copy()
+        exec(modification_code)
+        
+        expected_result = plugin.FlatComparisonResult(only_in_source = removed,
+                                                      only_in_target = added,
+                                                      modified       = modified)
+        
+        comparator = CrmlComparator('test.crml', self.repo)
+        actual_result = comparator.flat_compare(target_resource_ref, repo)
+        self.assertEquals(expected_result, actual_result)
+        
+        # Assert that all comparison result entries have references to the
+        # repository objects 
+        for entry in actual_result.only_in_source:
+            self.assertTrue(isinstance(entry.data['repo'], CrmlRepository))
+        for entry in actual_result.only_in_target:
+            self.assertTrue(isinstance(entry.data['repo'], CrmlRepository))
+        for entry in actual_result.modified:
+            self.assertTrue(isinstance(entry.data['source_repo'], CrmlRepository))
+            self.assertTrue(isinstance(entry.data['target_repo'], CrmlRepository))
+        
+        # Check also references to CRML key objects if specified
+        if check_keys_in_entry_data:
+            for entry in actual_result.only_in_source:
+                self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase))
+            for entry in actual_result.only_in_target:
+                self.assertTrue(isinstance(entry.data['key'], CrmlKeyBase))
+            for entry in actual_result.modified:
+                self.assertTrue(isinstance(entry.data['source_key'], CrmlKeyBase))
+                self.assertTrue(isinstance(entry.data['target_key'], CrmlKeyBase))
+    
+    def test_simple_key_changed(self):
+        def check(attrname, value_id, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[0].%s = %r' % (attrname, new_value),
+                modified=[Entry(sub_id       = '0x00000001',
+                                value_id     = value_id,
+                                source_value = old_value,
+                                target_value = new_value)])
+        
+        check('ref',            'ref',          'Foo.Bar',  'Foo.Baz')
+        check('name',           'name',         None,       'Foobar')
+        check('backup',         'backup',       False,      True)
+        check('read_only',      'read_only',    False,      True)
+        check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
+        check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
+        check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
+        check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
+        
+        
+        self.assert_comparison_result_after_change_equals(
+            'repo.keys[0].int = "0x5"',
+            added   = [Entry(sub_id='0x00000005')],
+            removed = [Entry(sub_id='0x00000001')])
+    
+    def test_bitmask_key_changed(self):
+        def check(attrname, value_id, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[1].%s = %r' % (attrname, new_value),
+                modified=[Entry(sub_id       = '0x00000002',
+                                value_id     = value_id,
+                                source_value = old_value,
+                                target_value = new_value)])
+        
+        check('name',           'name',         None,       'Foobar')
+        check('backup',         'backup',       False,      True)
+        check('read_only',      'read_only',    False,      True)
+        check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
+        check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
+        check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
+        check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
+    
+        self.assert_comparison_result_after_change_equals(
+            'repo.keys[1].int = "0x5"',
+            added   = [Entry(sub_id='0x00000005')],
+            removed = [Entry(sub_id='0x00000002')])
+    
+    def test_bitmask_key_bit_changed(self):    
+        def check(attrname, value_id, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[1].bits[0].%s = %r' % (attrname, new_value),
+                modified = [Entry(sub_id       = '0x00000002 (bit 1)',
+                                  value_id     = value_id,
+                                  source_value = old_value,
+                                  target_value = new_value)])
+        
+        check('ref',    'ref',      'Foo.Bit1', 'Foo.Bar.Bit')
+        check('invert', 'invert',   False,      True)
+        
+        self.assert_comparison_result_after_change_equals(
+            'repo.keys[1].bits[0].index = 6',
+            added   = [Entry(sub_id='0x00000002 (bit 6)')],
+            removed = [Entry(sub_id='0x00000002 (bit 1)')])
+        
+    
+    def test_key_range_changed(self):
+        def check(attrname, value_id, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[2].%s = %r' % (attrname, new_value),
+                modified=[Entry(sub_id       = '0x10000000-0x1FFFFFFF',
+                                value_id     = value_id,
+                                source_value = old_value,
+                                target_value = new_value)])
+        
+        check('ref',            'ref',          'Foo.Seq',  'Foo.Bar')
+        check('name',           'name',         None,       'Foobar')
+        check('backup',         'backup',       False,      True)
+        check('read_only',      'read_only',    False,      True)
+        check('access.cap_rd',  'cap_rd',       None,       'FooCapability')
+        check('access.cap_wr',  'cap_wr',       None,       'FooCapability')
+        check('access.sid_rd',  'sid_rd',       None,       '0x12345678')
+        check('access.sid_wr',  'sid_wr',       None,       '0x12345678')
+        
+        def check(attrname, new_value, old_id, new_id):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[2].%s = %r' % (attrname, new_value),
+            added   = [Entry(sub_id=new_id)],
+            removed = [Entry(sub_id=old_id)])
+        
+        check('first_int',  '0x00000000',   '0x10000000-0x1FFFFFFF', '0x00000000-0x1FFFFFFF')
+        check('last_int',   '0x20000000',   '0x10000000-0x1FFFFFFF', '0x10000000-0x20000000')
+    
+    def test_key_range_subkey_changed(self):
+        def check(attrname, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.keys[2].subkeys[0].%s = %r' % (attrname, new_value),
+                modified = [Entry(sub_id       = '0x10000000-0x1FFFFFFF (sub-key 0x00000001)',
+                                  value_id     = attrname,
+                                  source_value = old_value,
+                                  target_value = new_value)])
+        
+        check('ref', 'Sub1', 'FooSub')
+        check('name', 'Sub-key 1', 'Foo')
+        check('type', 'int', 'real')
+        
+        self.assert_comparison_result_after_change_equals(
+            'repo.keys[2].subkeys[0].int = "0xA"',
+            added   = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x0000000A)')],
+            removed = [Entry(sub_id='0x10000000-0x1FFFFFFF (sub-key 0x00000001)')])
+    
+    def test_key_type_changed(self):
+        # Change a bitmask key into a simple key
+        self.assert_comparison_result_after_change_equals(
+            "repo.keys[1] = CrmlSimpleKey(ref='Foo.Bar', name='Foo', int='0x2')",
+            modified = [Entry(sub_id       = '0x00000002',
+                              value_id     = 'key_type',
+                              source_value = 'bitmask_key',
+                              target_value = 'simple_key'),
+                        Entry(sub_id       = '0x00000002',
+                              value_id     = 'name',
+                              source_value = None,
+                              target_value = 'Foo')])
+        
+        # Change a simple key into a bitmask key
+        self.assert_comparison_result_after_change_equals(
+            "repo.keys[0] = CrmlBitmaskKey(int='0x1', name='Foo', bits=[CrmlBit(ref='Foo.Bit1', index=1)])",
+            modified = [Entry(sub_id       = '0x00000001',
+                              value_id     = 'key_type',
+                              source_value = 'simple_key',
+                              target_value = 'bitmask_key'),
+                        Entry(sub_id       = '0x00000001',
+                              value_id     = 'name',
+                              source_value = None,
+                              target_value = 'Foo')])
+    
+    def test_repository_attrs_changed(self):
+        def check(attrname, value_id, old_value, new_value):
+            self.assert_comparison_result_after_change_equals(
+                'repo.%s = %r' % (attrname, new_value),
+                modified=[Entry(sub_id       = None,
+                                value_id     = value_id,
+                                source_value = old_value,
+                                target_value = new_value)],
+                check_keys_in_entry_data=False)
+        
+        check('uid_name',       'uid_name',     'KCrUidTest',   'Foobar')
+        check('owner',          'owner',        '0x11223344',   '0xAABBCCDD')
+        check('backup',         'backup',       True,           False)
+        check('rfs',            'rfs',          True,           False)
+        check('access.cap_rd',  'cap_rd',       None,           'FooCapability')
+        check('access.cap_wr',  'cap_wr',       None,           'FooCapability')
+        check('access.sid_rd',  'sid_rd',       None,           '0x12345678')
+        check('access.sid_wr',  'sid_wr',       None,           '0x12345678')
+    
+    def test_repository_file_changed(self):
+        self.assert_comparison_result_after_change_equals(
+            '', # Make no modifications in the repository
+            modified=[Entry(sub_id       = None,
+                            value_id     = 'file',
+                            source_value = 'test.crml',
+                            target_value = 'xyz.crml')],
+            target_resource_ref = 'xyz.crml',
+            check_keys_in_entry_data = False)
+
+if __name__ == '__main__':
+    unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,265 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from cone.public import exceptions, plugin, api, container
+from cone.public.plugin import FlatComparisonResultEntry, DuplicateImplementationEntry
+from CRMLPlugin import crml_impl, crml_reader
+
+def impl_from_resource(resource_ref, configuration):
+    doc_root = plugin.ReaderBase._read_xml_doc_from_resource(resource_ref, configuration)
+    return crml_reader.CrmlReader.read_impl(resource_ref, configuration, doc_root)
+
+class MockGenerationContext(object):
+    def __init__(self):
+        self.tags = {}
+
+class TestCrmlImpl(unittest.TestCase):
+
+    def setUp(self):
+        project_dir = os.path.join(ROOT_PATH, 'gen_project')
+        self.project = api.Project(api.Storage.open(project_dir))
+        self.config = self.project.get_configuration('root.confml')
+    
+    def test_has_ref(self):
+        impl = impl_from_resource('Layer1/implml/00000001_feature1.crml', self.config)
+        self.assertTrue(impl.has_ref(['Feature1.IntSetting']))
+        self.assertTrue(impl.has_ref(['Feature1.RealSetting']))
+        self.assertTrue(impl.has_ref(['Feature1.RealSetting', 'foo.bar']))
+        
+        impl = impl_from_resource('Layer1/implml/00000003_bitmask_test.crml', self.config)
+        self.assertTrue(impl.has_ref(['BitmaskTest.Bit0']))
+        self.assertFalse(impl.has_ref(['BitmaskTest.FooBit']))
+        
+        impl = impl_from_resource('Layer1/implml/0000000C_key_range.crml', self.config)
+        self.assertTrue(impl.has_ref(['KeyRangeTest.EmptySequenceSetting']))
+        self.assertTrue(impl.has_ref(['KeyRangeTest.EmptySequenceSetting.StringSubSetting']))
+        self.assertFalse(impl.has_ref(['KeyRangeTest']))
+        self.assertFalse(impl.has_ref(['KeyRangeTest.Foo']))
+    
+    def test_list_output_files(self):
+        def oj( p2): # oj = output_join
+            return os.path.normpath(os.path.join('output', p2))
+        
+        impl = impl_from_resource('Layer1/implml/00000001_feature1.crml', self.config)
+        self.assertEquals(impl.list_output_files(), [oj('00000001.txt')])
+        
+        impl = impl_from_resource('Layer1/implml/00000003_bitmask_test.crml', self.config)
+        self.assertEquals(impl.list_output_files(), [oj('00000003.txt')])
+        
+        gc = MockGenerationContext()
+        gc.tags['target'] = ['core']
+        impl.generation_context = gc
+        self.assertEquals(impl.list_output_files(), [oj('00000003.txt'), oj('private/100059C9/cenrep_rfs.txt')])
+    
+    def test_is_cenrep_rfs_txt_to_be_generated(self):
+        impl = impl_from_resource('Layer1/implml/00000001_feature1.crml', self.config)
+        self.assertFalse(impl._is_cenrep_rfs_txt_to_be_generated())
+        
+        gc = MockGenerationContext()
+        impl.generation_context = gc
+        self.assertFalse(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = []
+        self.assertFalse(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['uda']
+        self.assertFalse(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['rofs3']
+        self.assertFalse(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['rofs2']
+        self.assertTrue(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['core']
+        self.assertTrue(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['core', 'rofs3']
+        self.assertTrue(impl._is_cenrep_rfs_txt_to_be_generated())
+        gc.tags['target'] = ['uda', 'rofs2']
+        self.assertTrue(impl._is_cenrep_rfs_txt_to_be_generated())
+    
+    def _open_config(self, project, config='root.confml'):
+        project_dir = os.path.join(ROOT_PATH, project)
+        project = api.Project(api.Storage.open(project_dir))
+        return project.get_configuration(config)
+    
+    def test_compare(self):
+        conf1 = self._open_config('comp_project_1')
+        conf2 = self._open_config('comp_project_2')
+        
+        crml_file = None
+        repo_uid = None
+        
+        def entry(**kwargs):
+            kwargs['file']      = crml_file
+            kwargs['impl_type'] = 'crml'
+            kwargs['id']        = repo_uid
+            return plugin.FlatComparisonResultEntry(**kwargs)
+        
+        comparison_result = None
+        
+        crml_file = 'Layer1/implml/00000001_simple_keys.crml'
+        impl_filter = '00000001_simple_keys.crml$'
+        repo_uid = '0x00000001'
+        impls1 = plugin.get_impl_set(conf1, impl_filter)
+        impls2 = plugin.get_impl_set(conf2, impl_filter)
+        actual_result = impls1.flat_compare(impls2)
+        
+        expected_mods = [
+            entry(sub_id='0x00000001', value_id='type',     source_value='int', target_value='real'),
+            entry(sub_id='0x00000002', value_id='backup',   source_value=True,  target_value=False),
+            
+            entry(sub_id='0x00000003', value_id='read_only', source_value=True,     target_value=False),
+            entry(sub_id='0x00000004', value_id='read_only', source_value=False,    target_value=True),
+            # Changing read-only changes also cap_wr
+            entry(sub_id='0x00000003', value_id='cap_wr',   source_value='AlwaysFail',    target_value=None),
+            entry(sub_id='0x00000004', value_id='cap_wr',   source_value=None,            target_value='AlwaysFail'),
+            
+            entry(sub_id='0x00000005', value_id='type',     source_value='int',                 target_value='real'),
+            entry(sub_id='0x00000006', value_id='name',     source_value='Setting 6',           target_value='Setting 6 (name changed)'),
+            entry(sub_id='0x00000007', value_id='ref',      source_value='SimpleKeys.Setting7', target_value='SimpleKeys.Setting7RefChanged'),
+            entry(sub_id='0x00000008', value_id='cap_rd',   source_value='ReadDeviceData',      target_value='ReadUserData'),
+            entry(sub_id='0x00000008', value_id='cap_wr',   source_value='WriteDeviceData',     target_value='WriteUserData'),
+            entry(sub_id='0x00000008', value_id='sid_rd',   source_value='0xAABBCCDD',          target_value='0x11223344'),
+            entry(sub_id='0x00000008', value_id='sid_wr',   source_value='0xDDCCBBAA',          target_value='0x44332211'),
+            entry(sub_id='0x00000009', value_id='cap_rd',   source_value='ReadDeviceData',      target_value=None),
+            entry(sub_id='0x00000009', value_id='cap_wr',   source_value='WriteDeviceData',     target_value=None),
+            entry(sub_id='0x00000009', value_id='sid_rd',   source_value='0xAABBCCDD',          target_value=None),
+            entry(sub_id='0x00000009', value_id='sid_wr',   source_value='0xDDCCBBAA',          target_value=None),
+        ]
+        expected_removed = [
+            entry(sub_id='0x10000001'),
+            entry(sub_id='0x10000002'),
+        ]
+        expected_added = [
+            entry(sub_id='0x20000001'),
+            entry(sub_id='0x20000002'),
+        ]
+        expected_result = plugin.FlatComparisonResult(modified=expected_mods,
+                                                      only_in_source=expected_removed,
+                                                      only_in_target=expected_added)
+        self.assertEquals(actual_result, expected_result)
+        
+    
+    def test_compare_all(self):
+        conf1 = self._open_config('comp_project_1')
+        conf2 = self._open_config('comp_project_2')
+        impls1 = plugin.get_impl_set(conf1)
+        impls2 = plugin.get_impl_set(conf2)
+        actual_result = impls1.flat_compare(impls2)
+        
+        expected_result = plugin.FlatComparisonResult(
+            only_in_source = [
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x10000001'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x10000002'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001 (bit 4)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003 (bit 4)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x10000001'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF (sub-key 0x00000004)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF (sub-key 0x00000004)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x10001001-0x10001FFF'),
+            FlatComparisonResultEntry(file='Layer1/implml/10000001_removed_repo.crml', impl_type='crml', id='0x10000001'),
+            ],
+            only_in_target = [
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x20000001'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x20000002'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001 (bit 5)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003 (bit 5)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x20000001'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF (sub-key 0x00000005)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF (sub-key 0x00000005)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x20001001-0x20001FFF'),
+            FlatComparisonResultEntry(file='Layer1/implml/20000001_added_repo.crml', impl_type='crml', id='0x20000001'),
+            ],
+            modified = [
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000001', value_id='type', source_value='int', target_value='real'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000002', value_id='backup', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000003', value_id='cap_wr', source_value='AlwaysFail', target_value=None),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000003', value_id='read_only', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000004', value_id='cap_wr', source_value=None, target_value='AlwaysFail'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000004', value_id='read_only', source_value=False, target_value=True),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000005', value_id='type', source_value='int', target_value='real'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000006', value_id='name', source_value='Setting 6', target_value='Setting 6 (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000007', value_id='ref', source_value='SimpleKeys.Setting7', target_value='SimpleKeys.Setting7RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000008', value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000008', value_id='cap_wr', source_value='WriteDeviceData', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000008', value_id='sid_rd', source_value='0xAABBCCDD', target_value='0x11223344'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000008', value_id='sid_wr', source_value='0xDDCCBBAA', target_value='0x44332211'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000009', value_id='cap_rd', source_value='ReadDeviceData', target_value=None),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000009', value_id='cap_wr', source_value='WriteDeviceData', target_value=None),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000009', value_id='sid_rd', source_value='0xAABBCCDD', target_value=None),
+            FlatComparisonResultEntry(file='Layer1/implml/00000001_simple_keys.crml', impl_type='crml', id='0x00000001', sub_id='0x00000009', value_id='sid_wr', source_value='0xDDCCBBAA', target_value=None),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='cap_wr', source_value='WriteDeviceData', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='name', source_value='Bitmask 1', target_value='Bitmask 1 (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='sid_rd', source_value='0xAABBCCDD', target_value='0x11223344'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='sid_wr', source_value='0xDDCCBBAA', target_value='0x44332211'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001', value_id='type', source_value='int', target_value='binary'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001 (bit 2)', value_id='ref', source_value='BitmaskKeys.Bit2', target_value='BitmaskKeys.Bit2RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000001 (bit 3)', value_id='invert', source_value=False, target_value=True),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003', value_id='name', source_value='Modified read-only bitmask', target_value='Modified read-only bitmask (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003', value_id='type', source_value='int', target_value='binary'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003 (bit 2)', value_id='ref', source_value='BitmaskKeys.Bit2', target_value='BitmaskKeys.Bit2RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000002_bitmask_keys.crml', impl_type='crml', id='0x00000002', sub_id='0x00000003 (bit 3)', value_id='invert', source_value=False, target_value=True),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='backup', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='cap_wr', source_value='WriteDeviceData', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='first_index', source_value=1L, target_value=2L),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='index_bits', source_value='0x00000FF0', target_value='0x00001FE0'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='name', source_value='Sequence 1', target_value='Sequence 1 (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='ref', source_value='KeyRanges.Seq1', target_value='KeyRanges.Seq1RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='sid_rd', source_value='0x11223344', target_value='0xAABBCCDD'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF', value_id='sid_wr', source_value='0x44332211', target_value='0xDDCCBBAA'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF (sub-key 0x00000002)', value_id='name', source_value='Sub-setting 2', target_value='Sub-setting 2 (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF (sub-key 0x00000002)', value_id='ref', source_value='SubSetting2', target_value='SubSetting2RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00001001-0x00001FFF (sub-key 0x00000002)', value_id='type', source_value='int', target_value='real'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00002000-0x00002FFF', value_id='backup', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00002000-0x00002FFF', value_id='read_only', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003000-0x00003FFF', value_id='read_only', source_value=False, target_value=True),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='cap_wr', source_value='WriteDeviceData', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='first_index', source_value=1, target_value=2),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='index_bits', source_value='0x00000FF0', target_value='0x00001FE0'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='name', source_value='Read-only sequence', target_value='Read-only sequence (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='ref', source_value='KeyRanges.ReadOnlySeq', target_value='KeyRanges.ReadOnlySeqRefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='sid_rd', source_value='0x11223344', target_value='0xAABBCCDD'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF', value_id='sid_wr', source_value='0x44332211', target_value='0xDDCCBBAA'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF (sub-key 0x00000002)', value_id='name', source_value='Sub-setting 2', target_value='Sub-setting 2 (name changed)'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF (sub-key 0x00000002)', value_id='ref', source_value='SubSetting2', target_value='SubSetting2RefChanged'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000003_key_ranges.crml', impl_type='crml', id='0x00000003', sub_id='0x00003001-0x00003FFF (sub-key 0x00000002)', value_id='type', source_value='int', target_value='real'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000001', value_id='key_type', source_value='simple_key', target_value='bitmask_key'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000002', value_id='key_type', source_value='bitmask_key', target_value='simple_key'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='backup', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='cap_wr', source_value='AlwaysFail', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='name', source_value='Bitmask key to simple key (other attrs changed also)', target_value='Bitmask key to simple key (other attrs changed also [xyz])'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='read_only', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='sid_rd', source_value='0xAABBCCDD', target_value='0x11223344'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='sid_wr', source_value=None, target_value='0x44332211'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000004_key_type_changed.crml', impl_type='crml', id='0x00000004', sub_id='0x00000003', value_id='type', source_value='int', target_value='binary'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='backup', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='cap_rd', source_value='ReadDeviceData', target_value='ReadUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='cap_wr', source_value='WriteDeviceData', target_value='WriteUserData'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='rfs', source_value=True, target_value=False),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='sid_rd', source_value='0x11223344', target_value='0xAABBCCDD'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='sid_wr', source_value='0x44332211', target_value='0xDDCCBBAA'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000005_repo_attrs_changed.crml', impl_type='crml', id='0x00000005', sub_id=None, value_id='uid_name', source_value='RepoAttrsChanged', target_value='RepoAttrsChangedXyz'),
+            FlatComparisonResultEntry(file='Layer1/implml/00000006_renamed_repo_xyz.crml', impl_type='crml', id='0x00000006', sub_id=None, value_id='file', source_value='Layer1/implml/00000006_renamed_repo.crml', target_value='Layer1/implml/00000006_renamed_repo_xyz.crml'),
+            ],
+            duplicate = [
+            DuplicateImplementationEntry(impl_type='crml', id='0x30000000', files_in_source=['Layer1/implml/30000000_duplicate_repo1_proj1.crml', 'Layer1/implml/30000000_duplicate_repo2_proj1.crml'], files_in_target=['Layer1/implml/30000000_duplicate_repo2_proj2.crml', 'Layer1/implml/30000000_duplicate_repo1_proj2.crml'])
+            ])
+        self.assertEquals(actual_result, expected_result)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_model.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,497 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+import __init__
+
+from cone.public import api, exceptions
+from CRMLPlugin.crml_model import *
+
+class TestCrmlAccess(unittest.TestCase):
+    def test_create_access_object(self):
+        acc = CrmlAccess()
+        self.assertEquals(acc.cap_rd, None)
+        self.assertEquals(acc.cap_wr, None)
+        self.assertEquals(acc.sid_rd, None)
+        self.assertEquals(acc.sid_wr, None)
+        
+        acc = CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteUserData', sid_rd='0x12345678', sid_wr='0x87654321')
+        self.assertEquals(acc.cap_rd, 'AlwaysPass')
+        self.assertEquals(acc.cap_wr, 'WriteUserData')
+        self.assertEquals(acc.sid_rd, '0x12345678')
+        self.assertEquals(acc.sid_wr, '0x87654321')
+    
+    def test_clone_access_object(self):
+        acc1 = CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteUserData', sid_rd='0x12345678', sid_wr='0x87654321')
+        acc2 = acc1.copy()
+        self.assertFalse(acc1 is acc2)
+        self.assertTrue(acc1 == acc2)
+        self.assertFalse(acc1 != acc2)
+    
+    def test_compare_access_objects(self):
+        acc1 = CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteUserData', sid_rd='0x12345678', sid_wr='0x87654321')
+        acc2 = acc1.copy()
+        self.assertTrue(acc1 == acc2)
+        self.assertFalse(acc1 != acc2)
+        
+        def check(attrname, value):
+            acc2 = acc1.copy()
+            setattr(acc1, attrname, value)
+            self.assertFalse(acc1 == acc2)
+            self.assertTrue(acc1 != acc2)
+        
+        # Check that changing each individual attribute makes the comparison fail
+        check('cap_rd', 'ReadDeviceData')
+        check('cap_wr', 'WriteDeviceData')
+        check('sid_rd', '0x11223344')
+        check('sid_wr', '0x44332211')
+
+        subkeys = [
+            CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+            CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2'),
+            CrmlKeyRangeSubKey(ref='Sub3', name='Sub-key 3', type='string', int='0x3'),
+        ]
+        self.keyrange = CrmlKeyRange(
+            first_int   = '0x10000000',
+            last_int    = '0x1FFFFFFF',
+            first_index = 2,
+            index_bits  = 0x0ff0,
+            backup      = True,
+            read_only   = True,
+            access      = CrmlAccess(cap_rd='ReadUserData'),
+            subkeys     = subkeys)
+    
+    def test_create_keyrange_object(self):
+        self.assertRaises(ValueError, CrmlKeyRange)
+        self.assertRaises(ValueError, CrmlKeyRange, first_int='0x10')
+        self.assertRaises(ValueError, CrmlKeyRange, last_int='0x1F')
+        
+        keyrange = CrmlKeyRange(first_int='0x10', last_int='0x1F')
+
+class TestCrmlRepository(unittest.TestCase):
+
+    def setUp(self):
+        keys = [
+            CrmlSimpleKey(ref='Foo.Bar', int='0x1'),
+            CrmlBitmaskKey(int='0x2', bits=[CrmlBit(ref='Foo.Bit1', index=1),
+                                            CrmlBit(ref='Foo.Bit2', index=2),
+                                            CrmlBit(ref='Foo.Bit4', index=4, invert=True)]),
+            CrmlKeyRange(first_int='0x10000000', last_int='0x1FFFFFFF', ref="Foo.Seq",
+                         subkeys=[CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+                                  CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2')]),
+        ]
+    
+        self.repo = CrmlRepository(
+            uid_value   = '0x10203040',
+            uid_name    = 'KCrUidTest',
+            owner       = '0x11223344',
+            backup      = True,
+            rfs         = True,
+            version     = '2',
+            access      = CrmlAccess(cap_rd='ReadUserData'),
+            keys        = keys)
+
+    def test_create_repo_object(self):
+        repo = CrmlRepository()
+        self.assertEquals(repo.uid_value,   None)
+        self.assertEquals(repo.uid_name,    None)
+        self.assertEquals(repo.owner,       None)
+        self.assertEquals(repo.backup,      False)
+        self.assertEquals(repo.rfs,         False)
+        self.assertEquals(repo.access,      CrmlAccess())
+        self.assertEquals(repo.keys,        [])
+
+
+        keys = [
+            CrmlSimpleKey(ref='Foo.Bar', int='0x1'),
+            CrmlBitmaskKey(int='0x2', bits=[CrmlBit(ref='Foo.Bit1', index=1),
+                                            CrmlBit(ref='Foo.Bit2', index=2),
+                                            CrmlBit(ref='Foo.Bit4', index=4, invert=True)]),
+            CrmlKeyRange(first_int='0x10000000', last_int='0x1FFFFFFF', ref="Foo.Seq",
+                         subkeys=[CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+                                  CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2')]),
+        ]
+        
+        repo = self.repo
+        self.assertEquals(repo.uid_value,   '0x10203040')
+        self.assertEquals(repo.uid_name,    'KCrUidTest')
+        self.assertEquals(repo.owner,       '0x11223344')
+        self.assertEquals(repo.backup,      True)
+        self.assertEquals(repo.rfs,         True)
+        self.assertEquals(repo.version,     '2')
+        self.assertEquals(repo.access,      CrmlAccess(cap_rd='ReadUserData'))
+        self.assertEquals(repo.keys,        keys)
+    
+    def test_clone_repo_object(self):
+        repo1 = self.repo
+        repo2 = repo1.copy()
+        self.assertFalse(repo1 is repo2)
+        self.assertTrue(repo1 == repo2)
+        self.assertFalse(repo1 != repo2)
+        
+        # Assert that the keys have been deep-copied
+        self.assertFalse(repo1.keys is repo2.keys)
+        self.assertEquals(repo1.keys, repo2.keys)
+        for i in xrange(len(repo1.keys)):
+            self.assertFalse(repo1.keys[i] is repo2.keys[i])
+    
+    def test_compare_repo_objects(self):
+        repo1 = CrmlRepository()
+        repo2 = repo1.copy()
+        self.assertTrue(repo1 == repo2)
+        self.assertFalse(repo1 != repo2)
+        
+        def check(attrname, value):
+            repo1 = self.repo
+            repo2 = repo1.copy()
+            setattr(repo2, attrname, value)
+            self.assertFalse(repo1 == repo2)
+            self.assertTrue(repo1 != repo2)
+        
+        # Check that changing each individual attribute makes the comparison fail
+        check('uid_value',  '0xbaadf00d')
+        check('uid_name',   'KFooUid')
+        check('owner',      '0xbeef')
+        check('backup',     False)
+        check('rfs',        False)
+        check('access',     CrmlAccess(cap_wr='WriteUserData'))
+        check('keys',       ['foo'])
+        check('version',    '3')
+        
+        def check2(mod_func):
+            repo1 = self.repo
+            repo2 = repo1.copy()
+            mod_func(repo2)
+            self.assertFalse(repo1 == repo2)
+            self.assertTrue(repo1 != repo2)
+        
+        # Check that changing the keys makes the comparison fail
+        check2(lambda r: setattr(r.keys[0], 'name', 'foo'))
+        check2(lambda r: setattr(r.keys[1], 'type', 'binary'))
+        check2(lambda r: setattr(r.keys[2], 'index_bits', 0x00ffff00))
+    
+    def test_get_repo_refs(self):
+        self.assertEquals([], CrmlRepository(uid_value='0x1').get_refs())
+        
+        expected = ['Foo.Bar',
+                    'Foo.Bit1',
+                    'Foo.Bit2',
+                    'Foo.Bit4',
+                    'Foo.Seq',
+                    'Foo.Seq.Sub1',
+                    'Foo.Seq.Sub2']
+        self.assertEquals(sorted(expected), sorted(self.repo.get_refs()))
+
+
+class TestCrmlSimpleKey(unittest.TestCase):
+    def setUp(self):
+        self.key = CrmlSimpleKey(
+            ref         = 'Foo.Bar',
+            name        = 'Foobar',
+            int         = '0x1020',
+            type        = 'real',
+            backup      = True,
+            read_only   = True,
+            access      = CrmlAccess(cap_rd='ReadUserData'))
+    
+    def test_create_key_object(self):
+        # Not specifying ref or index should make the constructor fail
+        self.assertRaises(ValueError, CrmlSimpleKey)
+        self.assertRaises(ValueError, CrmlSimpleKey, ref='Foo.Bar')
+        self.assertRaises(ValueError, CrmlSimpleKey, int='0x1')
+        
+        key = CrmlSimpleKey(ref='Foo.Bar', int='0x1')
+        self.assertEquals(key.ref,          'Foo.Bar')
+        self.assertEquals(key.name,         None)
+        self.assertEquals(key.int,          '0x1')
+        self.assertEquals(key.type,         'int')
+        self.assertEquals(key.backup,       False)
+        self.assertEquals(key.read_only,    False)
+        self.assertEquals(key.access,       CrmlAccess())
+        
+        key = self.key
+        self.assertEquals(key.ref,          'Foo.Bar')
+        self.assertEquals(key.name,         'Foobar')
+        self.assertEquals(key.int,          '0x1020')
+        self.assertEquals(key.type,         'real')
+        self.assertEquals(key.backup,       True)
+        self.assertEquals(key.read_only,    True)
+        self.assertEquals(key.access,       CrmlAccess(cap_rd='ReadUserData'))
+    
+    def test_clone_key_object(self):
+        key1 = self.key
+        key2 = key1.copy()
+        self.assertFalse(key1 is key2)
+        self.assertTrue(key1 == key2)
+        self.assertFalse(key1 != key2)
+    
+    def test_compare_key_objects(self):
+        def check(attrname, value):
+            key1 = self.key
+            key2 = key1.copy()
+            setattr(key2, attrname, value)
+            self.assertFalse(key1 == key2)
+            self.assertTrue(key1 != key2)
+        
+        # Check that changing each individual attribute makes the comparison fail
+        check('ref',        'Foo.Bar.Baz')
+        check('name',       'Testing')
+        check('int',        'KFooUid')
+        check('type',       'selection')
+        check('backup',     False)
+        check('read_only',  False)
+        check('access',     CrmlAccess(cap_wr='WriteUserData'))
+    
+    def test_get_key_refs(self):
+        self.assertEquals(['Foo.Bar'], self.key.get_refs())
+
+class TestCrmlBit(unittest.TestCase):
+    def test_create_bit_object(self):
+        # Not specifying ref or index should make the constructor fail
+        self.assertRaises(ValueError, CrmlBit)
+        self.assertRaises(ValueError, CrmlBit, ref='Foo.Bar')
+        self.assertRaises(ValueError, CrmlBit, index='3')
+        
+        bit = CrmlBit(ref='Foo.Bar', index=1)
+        self.assertEquals(bit.ref,      'Foo.Bar')
+        self.assertEquals(bit.index,    1)
+        self.assertEquals(bit.invert,   False)
+        
+        bit = CrmlBit(ref='Foo.Bar.Baz', index=2, invert=True)
+        self.assertEquals(bit.ref,      'Foo.Bar.Baz')
+        self.assertEquals(bit.index,    2)
+        self.assertEquals(bit.invert,   True)
+    
+    def test_clone_bit_object(self):
+        bit1 = CrmlBit(ref='Foo.Bar.Baz', index=2, invert=True)
+        bit2 = bit1.copy()
+        self.assertFalse(bit1 is bit2)
+        self.assertTrue(bit1 == bit2)
+        self.assertFalse(bit1 != bit2)
+    
+    def test_compare_bit_objects(self):
+        bit1 = CrmlBit(ref='Foo.Bar.Baz', index=2, invert=True)
+        
+        def check(attrname, value):
+            bit2 = bit1.copy()
+            setattr(bit1, attrname, value)
+            self.assertFalse(bit1 == bit2)
+            self.assertTrue(bit1 != bit2)
+        
+        check('ref',    'Foo.Bar')
+        check('index',  5)
+        check('invert', False)
+
+class TestCrmlBitmaskKey(unittest.TestCase):
+    def setUp(self):
+        bits = [
+            CrmlBit(ref='Foo.Bit1', index=1),
+            CrmlBit(ref='Foo.Bit2', index=2),
+            CrmlBit(ref='Foo.Bit4', index=4, invert=True),
+        ]
+        self.bm = CrmlBitmaskKey(
+            int         = '0x500',
+            type        = 'int',
+            backup      = True,
+            read_only   = True,
+            access      = CrmlAccess(cap_rd='ReadUserData'),
+            bits        = bits)
+    
+    def test_create_bitmask_object(self):
+        self.assertRaises(ValueError, CrmlBitmaskKey)
+        
+        bm = CrmlBitmaskKey(int='0x2')
+        self.assertEquals(bm.int,       '0x2')
+        self.assertEquals(bm.type,      'int')
+        self.assertEquals(bm.backup,    False)
+        self.assertEquals(bm.read_only, False)
+        self.assertEquals(bm.access,    CrmlAccess())
+        self.assertEquals(bm.bits,      [])
+        
+        bm = self.bm
+        self.assertEquals(bm.int,       '0x500')
+        self.assertEquals(bm.type,      'int')
+        self.assertEquals(bm.backup,    True)
+        self.assertEquals(bm.read_only, True)
+        self.assertEquals(bm.access,    CrmlAccess(cap_rd='ReadUserData'))
+        self.assertEquals(bm.bits,      [CrmlBit(ref='Foo.Bit1', index=1),
+                                         CrmlBit(ref='Foo.Bit2', index=2),
+                                         CrmlBit(ref='Foo.Bit4', index=4, invert=True)])
+    
+    def test_clone_bitmask_object(self):
+        bm1 = self.bm
+        bm2 = bm1.copy()
+        self.assertFalse(bm1 is bm2)
+        self.assertTrue(bm1 == bm2)
+        self.assertFalse(bm1 != bm2)
+        
+        # Assert that the bits have been deep-copied
+        self.assertFalse(bm1.bits is bm2.bits)
+        self.assertEquals(bm1.bits, bm2.bits)
+        for i in xrange(len(bm1.bits)):
+            self.assertFalse(bm1.bits[i] is bm2.bits[i])
+    
+    def test_compare_bitmask_objects(self):
+        def check(attrname, value):
+            bm1 = self.bm
+            bm2 = bm1.copy()
+            setattr(bm2, attrname, value)
+            self.assertFalse(bm1 == bm2)
+            self.assertTrue(bm1 != bm2)
+        
+        check('int',        '0x600')
+        check('type',       'binary')
+        check('backup',     False)
+        check('read_only',  False)
+        check('access',     CrmlAccess(cap_rd='ReadDeviceData'))
+        check('bits',       [CrmlBit(ref='Foo.Bit7', index=7),
+                             CrmlBit(ref='Foo.Bit9', index=9)])
+    
+    def test_get_bitmask_refs(self):
+        self.assertEquals([], CrmlBitmaskKey(int='0x1').get_refs())
+        
+        expected = ['Foo.Bit1',
+                    'Foo.Bit2',
+                    'Foo.Bit4',]
+        self.assertEquals(sorted(expected), sorted(self.bm.get_refs()))
+ 
+class TestCrmlKeyRangeSubKey(unittest.TestCase):
+
+    def setUp(self):
+        self.subkey = CrmlKeyRangeSubKey(ref='Foo.Bar', name='Foobar', type='int', int='0x1')
+
+    def test_create_subkey_object(self):
+        self.assertRaises(ValueError, CrmlKeyRangeSubKey)
+        self.assertRaises(ValueError, CrmlKeyRangeSubKey, ref='Foo.Bar')
+        self.assertRaises(ValueError, CrmlKeyRangeSubKey, type='int')
+        self.assertRaises(ValueError, CrmlKeyRangeSubKey, int='0x1')
+        
+        subkey = self.subkey
+        self.assertEquals(subkey.ref,   'Foo.Bar')
+        self.assertEquals(subkey.name,  'Foobar')
+        self.assertEquals(subkey.type,  'int')
+        self.assertEquals(subkey.int,   '0x1')
+    
+    def test_clone_subkey_object(self):
+        subkey1 = self.subkey
+        subkey2 = subkey1.copy()
+        self.assertFalse(subkey1 is subkey2)
+        self.assertTrue(subkey1 == subkey2)
+        self.assertFalse(subkey1 != subkey2)
+    
+    def test_compare_subkey_objects(self):
+        def check(attrname, value):
+            subkey1 = self.subkey
+            subkey2 = subkey1.copy()
+            setattr(subkey2, attrname, value)
+            self.assertFalse(subkey1 == subkey2)
+            self.assertTrue(subkey1 != subkey2)
+        
+        check('ref',    'Foo.Bar.Baz')
+        check('name',   'Test')
+        check('int',    '0x2')
+        check('type',   'binary')
+
+class TestCrmlKeyRange(unittest.TestCase):
+    def setUp(self):
+        subkeys = [
+            CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+            CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2'),
+            CrmlKeyRangeSubKey(ref='Sub3', name='Sub-key 3', type='string', int='0x3'),
+        ]
+        self.keyrange = CrmlKeyRange(
+            ref         = 'Foo.Seq',
+            first_int   = '0x10000000',
+            last_int    = '0x1FFFFFFF',
+            first_index = 2,
+            index_bits  = 0x0ff0,
+            backup      = True,
+            read_only   = True,
+            access      = CrmlAccess(cap_rd='ReadUserData'),
+            subkeys     = subkeys)
+    
+    def test_create_keyrange_object(self):
+        self.assertRaises(ValueError, CrmlKeyRange)
+        self.assertRaises(ValueError, CrmlKeyRange, first_int='0x10')
+        self.assertRaises(ValueError, CrmlKeyRange, last_int='0x1F')
+        
+        keyrange = CrmlKeyRange(first_int='0x10', last_int='0x1F')
+        self.assertEquals(keyrange.first_int,   '0x10')
+        self.assertEquals(keyrange.last_int,    '0x1F')
+        self.assertEquals(keyrange.first_index, 0)
+        self.assertEquals(keyrange.index_bits,  None)
+        self.assertEquals(keyrange.backup,      False)
+        self.assertEquals(keyrange.read_only,   False)
+        self.assertEquals(keyrange.access,      CrmlAccess())
+        self.assertEquals(keyrange.subkeys,     [])
+    
+        keyrange = self.keyrange
+        self.assertEquals(keyrange.first_int,   '0x10000000')
+        self.assertEquals(keyrange.last_int,    '0x1FFFFFFF')
+        self.assertEquals(keyrange.first_index, 2)
+        self.assertEquals(keyrange.index_bits,  0x0ff0)
+        self.assertEquals(keyrange.backup,      True)
+        self.assertEquals(keyrange.read_only,   True)
+        self.assertEquals(keyrange.access,      CrmlAccess(cap_rd='ReadUserData'))
+        self.assertEquals(keyrange.subkeys,     [
+            CrmlKeyRangeSubKey(ref='Sub1', name='Sub-key 1', type='int', int='0x1'),
+            CrmlKeyRangeSubKey(ref='Sub2', name='Sub-key 2', type='real', int='0x2'),
+            CrmlKeyRangeSubKey(ref='Sub3', name='Sub-key 3', type='string', int='0x3')])
+        
+    
+    def test_clone_keyrange_object(self):
+        keyrange1 = self.keyrange
+        keyrange2 = keyrange1.copy()
+        self.assertFalse(keyrange1 is keyrange2)
+        self.assertTrue(keyrange1 == keyrange2)
+        self.assertFalse(keyrange1 != keyrange2)
+        
+        # Assert that the sub-keys have been deep-copied
+        self.assertFalse(keyrange1.subkeys is keyrange2.subkeys)
+        self.assertEquals(keyrange1.subkeys, keyrange2.subkeys)
+        for i in xrange(len(keyrange1.subkeys)):
+            self.assertFalse(keyrange1.subkeys[i] is keyrange2.subkeys[i])
+    
+    def test_compare_keyrange_objects(self):
+        def check(attrname, value):
+            keyrange1 = self.keyrange
+            keyrange2 = keyrange1.copy()
+            setattr(keyrange2, attrname, value)
+            self.assertFalse(keyrange1 == keyrange2)
+            self.assertTrue(keyrange1 != keyrange2)
+        
+        check('first_int',      '0x20000000')
+        check('last_int',       '0x2FFFFFFF')
+        check('first_index',    3)
+        check('index_bits',     0xf00)
+        check('backup',         False)
+        check('read_only',      False)
+        check('access',         CrmlAccess(cap_rd='ReadDeviceData'))
+        check('subkeys',        [
+            CrmlKeyRangeSubKey(ref='Sub0x100', name='Sub-key 0x100', type='string', int='0x100'),
+            CrmlKeyRangeSubKey(ref='Sub0x200', name='Sub-key 0x200', type='binary', int='0x200')])
+    
+    def test_get_keyrange_refs(self):
+        self.assertEquals([], CrmlKeyRange(first_int='0x1', last_int='0x2').get_refs())
+        
+        expected = ['Foo.Seq',
+                    'Foo.Seq.Sub1',
+                    'Foo.Seq.Sub2',
+                    'Foo.Seq.Sub3',]
+        self.assertEquals(sorted(expected), sorted(self.keyrange.get_refs()))
+
+if __name__ == "__main__":
+    unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,201 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+from cone.public import exceptions, plugin, api, container
+
+from CRMLPlugin.crml_model import *
+from CRMLPlugin.crml_reader import CrmlReader
+
+class TestCrmlReader(unittest.TestCase):
+    
+    NAMESPACE = CrmlReader.NAMESPACE
+    
+    def setUp(self):
+        self.reader = CrmlReader()
+    
+    def assert_read_access_equals(self, data, expected):
+        etree = ElementTree.fromstring(data)
+        access = self.reader.read_access(etree)
+        self.assertEquals(expected, access)
+    
+    def test_read_access(self):
+        data = """<?xml version="1.0"?><test/>"""
+        self.assert_read_access_equals(data, CrmlAccess())
+        
+        data = """<?xml version="1.0"?>
+                <test xmlns='%s'>
+                    <access type='R' capabilities="AlwaysPass" sid="0x12345678"/>
+                    <access type='W' capabilities="WriteDeviceData" sid="0x87654321"/>
+                </test>
+                """ % self.NAMESPACE
+        self.assert_read_access_equals(data,
+            CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteDeviceData', sid_rd='0x12345678', sid_wr='0x87654321'))
+    
+    def test_read_duplicate_access(self):
+        data = """<?xml version="1.0"?>
+                <test xmlns='%s'>
+                    <access type='R' capabilities="ReadDeviceData" sid="0x12345678"/>
+                    <access type='W' capabilities="WriteDeviceData" sid="0x87654321"/>
+                    <access type='R' capabilities="TCB" sid="0x11223344"/>
+                    <access type='W' capabilities="DRM" sid="0x44332211"/>
+                </test>
+                """ % self.NAMESPACE
+        self.assert_read_access_equals(data,
+            CrmlAccess(cap_rd='ReadDeviceData', cap_wr='WriteDeviceData', sid_rd='0x12345678', sid_wr='0x87654321'))
+    
+    
+    def read_key_from_xml(self, data):
+        etree = ElementTree.fromstring(data)
+        return self.reader.read_key(etree)
+        
+    def assert_read_key_equals(self, data, expected):
+        self.assertEquals(expected, self.read_key_from_xml(data))
+    
+    def test_read_key(self):
+        data = """<?xml version="1.0"?>
+                <key xmlns='%s' ref="Foo/Bar" name="Foobar setting" int="0x01020304" type="real" readOnly="true" backup="true">
+                    <access type='R' capabilities="AlwaysPass" sid="0x12345678"/>
+                    <access type='W' capabilities="WriteDeviceData" sid="0x87654321"/>
+                </key>""" % self.NAMESPACE
+        self.assert_read_key_equals(data,
+            CrmlSimpleKey(ref='Foo.Bar', name='Foobar setting', int='0x01020304', type='real', read_only=True, backup=True,
+                          access=CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteDeviceData', sid_rd='0x12345678', sid_wr='0x87654321')))
+        
+    def test_read_invalid_key(self):
+        # Required attribute 'ref' missing
+        data = '<key xmlns="%s" name="Foobar setting" int="0x01020304" type="real"/>' % self.NAMESPACE
+        self.assertRaises(exceptions.ParseError, self.read_key_from_xml, data)
+    
+    def assert_read_bitmask_key_equals(self, data, expected):
+        etree = ElementTree.fromstring(data)
+        key = self.reader.read_bitmask_key(etree)
+        self.assertEquals(expected, key)
+    
+    def test_read_bitmask_key(self):
+        data = """
+        <key xmlns='%s' name="Bitmask" type="binary" int="0x00000001" readOnly="true" backup="true">
+            <access type="R" capabilities="ReadDeviceData"/>
+            <bit ref="BitmaskTest/Bit0">1</bit>
+            <bit ref="BitmaskTest/Bit3">4</bit>
+            <bit ref="BitmaskTest/Bit5" value='false'>6</bit>
+        </key>
+        """ % self.NAMESPACE
+        
+        self.assert_read_bitmask_key_equals(data,
+            CrmlBitmaskKey(name      = 'Bitmask',
+                           type      = 'binary',
+                           int       = '0x00000001',
+                           read_only = True,
+                           backup    = True,
+                           access    = CrmlAccess(cap_rd='ReadDeviceData'),
+                           bits      = [CrmlBit(ref='BitmaskTest.Bit0', index=1),
+                                        CrmlBit(ref='BitmaskTest.Bit3', index=4),
+                                        CrmlBit(ref='BitmaskTest.Bit5', index=6, invert=True)]))
+    
+    def assert_read_key_range_equals(self, data, expected):
+        etree = ElementTree.fromstring(data)
+        key = self.reader.read_key_range(etree)
+        self.assertEquals(expected, key)
+    
+    def test_read_key_range(self):
+        data = """
+            <keyRange xmlns='%s' firstInt="0x00004000" lastInt="0x00004FFF" readOnly="true" backup="false">
+                <access type="R" capabilities="TCB"/>
+            </keyRange>
+            """ % self.NAMESPACE
+        self.assert_read_key_range_equals(data,
+            CrmlKeyRange(first_int='0x00004000', last_int='0x00004FFF', read_only=True, backup=False,
+                         access=CrmlAccess(cap_rd='TCB')))
+        
+        data = """
+            <keyRange xmlns='%s' ref="KeyRangeTest/SequenceSetting" backup="true" name="Sequence setting"
+                firstInt="0x1001" lastInt="0x1fff" indexBits="0x0ff0" firstIndex="1" countInt="0x1000">
+                <access type="R" capabilities="AlwaysPass"/>
+                <access type="W" capabilities="WriteDeviceData"/>
+                <key ref="StringSubSetting" name="String" int="0x0001" type="string8"/>
+                <key ref="IntSubSetting" name="Int" int="0x0002" type="int"/>
+                <key ref="IntSubSetting2" name="Int2" int="0x0003"/>
+            </keyRange>
+            """ % self.NAMESPACE
+        self.assert_read_key_range_equals(data,
+            CrmlKeyRange(first_int='0x1001', last_int='0x1fff', index_bits=0x0ff0,
+                         count_int='0x1000', first_index=1,
+                         ref='KeyRangeTest.SequenceSetting',
+                         name='Sequence setting', backup=True, read_only=False,
+                         access=CrmlAccess(cap_rd='AlwaysPass', cap_wr='WriteDeviceData'),
+                         subkeys=[CrmlKeyRangeSubKey(ref='StringSubSetting', name='String', int='0x0001', type='string8'),
+                                  CrmlKeyRangeSubKey(ref='IntSubSetting', name='Int', int='0x0002', type='int'),
+                                  CrmlKeyRangeSubKey(ref='IntSubSetting2', name='Int2', int='0x0003', type='int')]))
+    
+    def assert_read_repo_equals(self, data, expected):
+        etree = ElementTree.fromstring(data)
+        key = self.reader.read_repository(etree)
+        self.assertEquals(expected, key)
+    
+    def test_read_empty_repository(self):
+        data = """<?xml version="1.0"?>
+            <repository xmlns="%s" uidName="EmptyRepo" uidValue="0x000000E1"
+                owner="0xABCDDCBA" backup="true" rfs="true" initialisationFileVersion="2">
+            </repository>
+            """ % self.NAMESPACE
+        self.assert_read_repo_equals(data,
+            CrmlRepository(uid_name  = 'EmptyRepo',
+                           uid_value = '0x000000E1',
+                           owner     = '0xABCDDCBA',
+                           backup    = True,
+                           rfs       = True,
+                           version   = '2'))
+    
+    def test_read_simple_repository(self):
+        data = """<?xml version="1.0"?>
+            <repository xmlns="%s" uidName="SimpleRepo" uidValue="0x000000E2"
+                owner="0xF00DBEEF" backup="true" rfs="true">
+                <key ref="Foo/Key1" name="Fookey 1" int="0x00000001" type="int" readOnly="true" backup="true"/>
+                <key ref="Foo/Key2" name="Fookey 2" int="0x00000002" type="real" readOnly="false" backup="true"/>
+                <key ref="Foo/Key3" name="Fookey 3" int="0x00000003" type="string" readOnly="true" backup="false"/>
+            </repository>
+            """ % self.NAMESPACE
+        self.assert_read_repo_equals(data,
+            CrmlRepository(
+                uid_name  = 'SimpleRepo',
+                uid_value = '0x000000E2',
+                owner     = '0xF00DBEEF',
+                backup    = True,
+                rfs       = True,
+                version   = '1',
+                keys      = [CrmlSimpleKey(ref='Foo.Key1', name='Fookey 1', int='0x00000001', type='int', read_only=True, backup=True, access=CrmlAccess(cap_wr='AlwaysFail')),
+                             CrmlSimpleKey(ref='Foo.Key2', name='Fookey 2', int='0x00000002', type='real', read_only=False, backup=True),
+                             CrmlSimpleKey(ref='Foo.Key3', name='Fookey 3', int='0x00000003', type='string', read_only=True, backup=False, access=CrmlAccess(cap_wr='AlwaysFail')),]))
+
+
+if __name__ == "__main__":
+    unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_crml_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,171 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest, logging
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from cone.public import exceptions, plugin, api, container
+
+from CRMLPlugin.crml_model import *
+from CRMLPlugin.crml_writer import CrmlTxtWriter
+
+log = logging.getLogger('unittest_crml_writer')
+
+FEATURES = {
+#   Ref                    Type         Value (+ optionally orig. value) 
+    'Foo.Int'           : ('int',       5,      '5'),
+    'Foo.Real'          : ('real',      5.5,    '5.5'),
+    'Foo.String'        : ('string',    'Test'),
+    'Foo.UnicodeString' : ('string',    u'100\u20ac'),
+    'Foo.Bit1'          : ('boolean',   True,   'true'),
+    'Foo.Bit2'          : ('boolean',   False,  'false'),
+    'Foo.Bit3'          : ('boolean',   True,   '1'),
+    'Foo.Bit4'          : ('boolean',   False,  '0'),
+    'Foo.Bit5'          : ('boolean',   True,   '1'),
+    'Foo.Bit6'          : ('boolean',   False,  '0'),
+    'Foo.Seq.Int'       : ('int',       ['1', '2', '3']),
+    'Foo.Seq.Real'      : ('real',      ['0.1', '0.2', '0.3']),
+    'Foo.Seq.String'    : ('string',    ['Test1', 'Test2', 'Test3']),
+}
+
+class Mock(object):
+    pass
+
+class MockFeature(object):
+    def __init__(self, ref):
+        self.ref = ref
+    def get_value(self):
+        return FEATURES[self.ref][1]
+    def get_original_value(self):
+        val = FEATURES[self.ref]
+        if len(val) == 3:   return val[2]
+        else:               return val[1]
+    def get_type(self):
+        return FEATURES[self.ref][0]
+
+class MockConfiguration(object):
+    def get_default_view(self):
+        dview = Mock()
+        dview.get_feature = lambda ref: MockFeature(ref)
+        return dview
+
+class TestCrmlTxtWriter(unittest.TestCase):
+    def setUp(self):
+        self.writer = CrmlTxtWriter(MockConfiguration(), log)
+    
+    def test_write_access(self):
+        def check(acc, expected):
+            actual = self.writer.get_access_line(acc)
+            self.assertEquals(expected, actual)
+        
+        check(CrmlAccess(), '')
+        check(CrmlAccess(cap_rd="AlwaysPass"), 'cap_rd=alwayspass')
+        check(CrmlAccess(cap_wr="AlwaysPass"), 'cap_wr=alwayspass')
+        check(CrmlAccess(cap_rd="ReadDeviceData", cap_wr="WriteDeviceData"),
+              'cap_rd=ReadDeviceData cap_wr=WriteDeviceData')
+        check(CrmlAccess(sid_rd="0x12345678", sid_wr="0x87654321"),
+              'sid_rd=0x12345678 sid_wr=0x87654321')
+        check(CrmlAccess(cap_rd="ReadDeviceData", cap_wr="WriteDeviceData", sid_rd="0x12345678", sid_wr="0x87654321"),
+              'sid_rd=0x12345678 cap_rd=ReadDeviceData sid_wr=0x87654321 cap_wr=WriteDeviceData')
+    
+    def test_write_simple_key(self):
+        def check(key, expected):
+            key_line = self.writer.get_cenrep_entries(key)[0]
+            actual = self.writer.get_cenrep_entry_line(key_line)
+            self.assertEquals(expected, actual)
+    
+        check(CrmlSimpleKey(ref='Foo.Int', int='0x01020304'),
+              '0x1020304 int 5 0')
+        check(CrmlSimpleKey(ref='Foo.Int', int='0x01020304', backup=True),
+              '0x1020304 int 5 16777216')
+        check(CrmlSimpleKey(ref='Foo.Int', int='0x01020304', backup=True, access=CrmlAccess(cap_rd='AlwaysPass', cap_wr='AlwaysFail')),
+              '0x1020304 int 5 16777216 cap_rd=alwayspass cap_wr=alwaysfail')
+
+
+class TestKeyRange(unittest.TestCase):
+    
+    def test_get_shift_count_with_small_range(self):
+        self.assertEquals(CrmlTxtWriter.get_range_shift(0xff00), 8)
+
+    def test_get_shift_count_with_medium_range(self):
+        self.assertEquals(CrmlTxtWriter.get_range_shift(0xff000), 12)
+
+    def test_get_shift_count_with_larger_range(self):
+        self.assertEquals(CrmlTxtWriter.get_range_shift(0xff0000), 16)
+
+    def test_get_shift_count_with_split_range(self):
+        self.assertEquals(CrmlTxtWriter.get_range_shift(0xfc00), 10)
+
+    def test_get_range_with_larger_range(self):
+        self.assertEquals(CrmlTxtWriter.get_range(0xff0000), 0xffff)
+        self.assertEquals(CrmlTxtWriter.get_range(0xff000), 0xfff)
+        self.assertEquals(CrmlTxtWriter.get_range(0xff00), 0xff)
+        self.assertEquals(CrmlTxtWriter.get_range(0xfc0000), 0x3ffff)
+
+    def test_get_index_with_whole_range_00(self):
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,0), 0x20000)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,1), 0x20001)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,2), 0x20002)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,3), 0x20003)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,4), 0x20004)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,0,5), 0x20005)
+
+    def test_get_index_with_whole_range_10(self):
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,0), 0x30000)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,1), 0x30001)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,2), 0x30002)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,3), 0x30003)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,4), 0x30004)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,1,5), 0x30005)
+
+    def test_get_index_with_whole_range_f(self):
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,16,0), 0x120000)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,16,1), 0x120001)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,16,2), 0x120002)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,16,3), 0x120003)
+        self.assertEquals(CrmlTxtWriter.get_index(0x0,2, 0xff0000,16,4), 0x120004)
+        
+    def test_get_seqid_with_whole_range_00(self):
+        self.assertEquals(CrmlTxtWriter.get_seqid(0x0,2, 0xff0000,0x20000), 0)
+        self.assertEquals(CrmlTxtWriter.get_seqid(0x0,2, 0xff0000,0x20004), 0)
+        self.assertEquals(CrmlTxtWriter.get_seqid(0x0,2, 0xff0000,0x30001), 1)
+        self.assertEquals(CrmlTxtWriter.get_seqid(0x0,2, 0xff0000,0x120000), 16)
+
+    def test_get_subseqid(self):
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0x0,0, 0xff0000,0x4), 4)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0x0,2, 0xff0000,0x120004), 4)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0x0,2, 0xff0000,0x120012), 18)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0xcf000002,2, 0xff0000,0xcf000002), 0)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0xcf000002,2, 0xff0000,0xcf000006), 4)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0xcf000002,2, 0xff0000,0xcf00000f), 13)
+        self.assertEquals(CrmlTxtWriter.get_subseqid(0xcf000002,2, 0xff0000,0xcf020002), 0)
+
+    def test_get_index_with_example_range_f(self):
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,0), 0xcf020002)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,1), 0xcf020003)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,2), 0xcf020004)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,3), 0xcf020005)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,4), 0xcf020006)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,0,5), 0xcf020007)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,1,0), 0xcf030002)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,1,3), 0xcf030005)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,1,5), 0xcf030007)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,16,0), 0xcf120002)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,16,3), 0xcf120005)
+        self.assertEquals(CrmlTxtWriter.get_index(0xcf000002,2, 0xff0000,16,5), 0xcf120007)
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/CRMLPlugin/tests/unittest_txt_generation.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,87 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from testautomation.base_testcase import BaseTestCase
+from cone.public import exceptions, plugin, api, container
+
+from CRMLPlugin import crml_impl
+
+def abspath(path):
+    return os.path.normpath(os.path.join(ROOT_PATH, path))
+
+class TestCrmlImpl(BaseTestCase):
+
+    def test_generate_from_project_with_rfs(self):
+        project_dir     = abspath('gen_project')
+        config          = 'root.confml'
+        output_dir      = abspath('temp/gen_output1')
+        expected_dir    = abspath('gen_expected')
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration(config)
+        impls = plugin.get_impl_set(config, 'crml$')
+        impls.output = output_dir
+        impls.generation_context.tags['target'] = ['rofs2']
+        impls.generate()
+        impls.post_generate()
+        
+        self.assert_dir_contents_equal(output_dir, expected_dir, ['.svn'])
+    
+    def test_generate_from_project_without_rfs(self):
+        project_dir     = abspath('gen_project')
+        config          = 'root.confml'
+        output_dir      = abspath('temp/gen_output2')
+        expected_dir    = abspath('gen_expected')
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration(config)
+        impls = plugin.get_impl_set(config, 'crml$')
+        impls.output = output_dir
+        impls.generation_context.tags['target'] = []
+        impls.generate()
+        impls.post_generate()
+        
+        self.assert_dir_contents_equal(output_dir, expected_dir, ['.svn', 'private'])
+        self.assertFalse(os.path.exists(os.path.join(output_dir, 'private/100059C9/cenrep_rfs.txt')))
+    
+    
+    def test_generate_from_project_duplicate_rfs(self):
+        project_dir     = abspath('duplicate_rfs_project')
+        config          = 'root.confml'
+        output_dir      = abspath('temp/duplicate_rfs_output')
+        expected_dir    = abspath('duplicate_rfs_expected')
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration(config)
+        impls = plugin.get_impl_set(config, 'crml$')
+        impls.output = output_dir
+        impls.generation_context.tags['target'] = ['rofs2']
+        impls.generate()
+        impls.post_generate()
+        
+        self.assert_dir_contents_equal(output_dir, expected_dir, ['.svn'])
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeCRMLPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from CRMLPlugin import __version__
+
+setup(
+    name = "conecrmlplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "crmlplugin.tests.collect_suite",
+     
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Configuration Tool CRML plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",   # project home page, if any
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['crml = CRMLPlugin.crml_reader:CrmlReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+__all__ = ['confflattener', 'genconfmlplugin', 'xslttransformer']
+
+import pkg_resources 
+import sys,os
+
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/confflattener.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Configuration flattener
+'''
+
+import re
+import os
+import sys
+import logging
+import xml.parsers.expat
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+import copy
+
+
+
+class ConfigurationFlattener():
+    """
+    Configuration flattener
+    """
+    
+    def _init(self):
+        self.logger = logging.getLogger('cone.gcfml(%s)' % self.ref)
+        pass
+        
+
+    def flat(self, conf_from_org, settings, to_config):
+        """
+        Flats configuration to one element xml element
+        """
+        """ 
+        Get the default view
+        Create the new flat configuration 
+         """
+        dview_from = conf_from_org.get_default_view()
+        
+        """ Go through the required settings """
+        for setting in settings:
+            setting_name = setting.replace('/', '.')
+            try:
+                for fea in dview_from.get_features(setting_name):
+                    """ Add the given feature ref and its children """
+                    newfea = copy.copy(fea._obj)
+                    to_config.add_feature(newfea, fea.namespace)
+                    for subfeaname in fea.list_features():
+                        subfea = fea.get_feature(subfeaname)
+                        newfea = copy.copy(subfea._obj)
+                        to_config.add_feature(newfea, subfea.namespace)
+            except exceptions.NotFound, e:
+                logging.getLogger('cone.gcfml').warning('Failed to get feature: %s , %s %s' % (setting_name, type(e), e) )
+            except Exception, e:
+                logging.getLogger('cone.gcfml').warning('Failed to flat feature: %s , %s %s' % (setting_name, type(e), e) )
+                
+        """ Copy all data values from the existing configuration to the new configuration """
+        toview = to_config.get_default_view()
+        for fea in toview.get_features('**'):
+            fromfea = dview_from.get_feature(fea.fqr)
+            if fromfea.get_value() != None:
+                fea.set_value(fromfea.get_value())
+        return to_config
+
+    def create_configuration(self, conf_from_org, settings, path="tempfile.confml"):
+        """
+        Flats configuration to one feature and data confml
+        """
+        """ 
+        Get the default view
+        Create the new flat configuration 
+         """
+        prj = conf_from_org.get_project()
+        flat = prj.create_configuration(path)
+        (root,ext) = os.path.splitext(path)
+        dataname = "%s_data%s" % (root,ext)
+        flat.create_configuration(dataname)
+        self.flat(conf_from_org, settings, flat)
+        flat.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/genconfmlplugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,401 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+GenConfml plugin for ConE
+'''
+
+import re
+import os
+import sys
+import logging
+import xml.parsers.expat
+import confflattener
+import xslttransformer
+import codecs
+import tempfile
+import tempfile
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+from cone.confml import persistentconfml
+
+class GenconfmlImpl(plugin.ImplBase):
+    """
+    GenConfml plugin implementation
+    """
+    
+    IMPL_TYPE_ID = "gcfml"
+    
+    
+    def __init__(self,ref,configuration, output='output', linesep=os.linesep, reader=None):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.logger = logging.getLogger('cone.gcfml(%s)' % self.ref)
+        self.errors = False
+        self.xstl_etree = None
+        self.xslt_temp_file_name = os.path.join(tempfile.gettempdir(), "genconfml_temp_%i.xslt" % os.getpid())
+        self.set_output_root(output)
+        self.linesep = linesep
+        self._flatconfig = None
+        self.temp_confml_file = os.path.join(tempfile.gettempdir(),'temp_flatted_%i.confml' % os.getpid())
+        self.reader = reader
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        self.create_output()
+        return 
+    
+    def get_refs(self):
+        result = []
+        for ref in self.reader.settings:
+            # Process the reference, so that it will work with has_ref().
+            # E.g. 'MyFeature/MySetting' -> 'MyFeature.MySetting'
+            #      'MyFeature/*          -> 'MyFeature'
+            ref = ref.replace('/', '.')
+            if ref.endswith('.*'):
+                ref = ref[:-2]
+            result.append(ref)
+        return result
+      
+    def list_output_files(self):
+        """ Return a list of output files as an array. """
+        return [self.get_output_filename()]
+        
+    def get_output_filename(self):
+        """ Return a output file name. """
+        
+        name = self.reader.name
+        if name == None: name = ""
+        target = self.reader.target
+        if target == None: target = ""
+        output = self.output
+        if self.output == None: output = ""
+        
+        # Make sure that target file is generated under output
+        target = utils.resourceref.remove_begin_slash(utils.resourceref.norm(target))
+        subdir = self.reader.subdir
+        if subdir == None: 
+            self.output_subdir = subdir
+        output_file = os.path.normpath(os.path.join(output, target, name))
+        
+        return output_file
+    
+    def create_output(self, layers=None):
+        """ Generate all output """
+        resource = self.configuration.get_resource(self.ref)
+        write_element_enc(self.reader.stylesheet_elem, self.xslt_temp_file_name, self.reader.stylesheet_output_enc)
+        gen = Generator()
+        
+        target = self.reader.target
+        if target == None: target = ""
+        
+        output_file = self.get_output_filename()
+        # Don't create the dirs here, since the output file may be filtered out
+        # if it is empty
+        #if not os.path.exists(os.path.dirname(output_file)):
+        #    os.makedirs(os.path.dirname(output_file))
+        
+        self.logger.info('Generating %s' % output_file)
+        
+        flatted_conf_as_element = persistentconfml.ConfmlWriter().dumps(self.flatconfig)
+        postprocessed_element = self.post_process_flattening(flatted_conf_as_element)
+        write_element_enc(postprocessed_element, self.temp_confml_file, self.reader.stylesheet_output_enc)
+        gen.generate(self.configuration, resource, output_file, self.xslt_temp_file_name, self.reader.settings, self.reader.stylesheet_output_enc)
+      
+    def post_process_flattening(self, element):
+        """
+        Pick just data element and build document out of it
+        """
+        
+        data_element = element.find("data")
+        if data_element == None:
+            self.logger.warning('No data to generate!!')
+            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
+        else:
+            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
+        return ElementTree.fromstring(new_doc)
+
+    @property
+    def flatconfig(self):
+      """ 
+      Create a flat configuration from the current configuration with the given setting refs.
+      Take the last configuration element, which will contain the data elements
+      """ 
+      if not self._flatconfig:
+          try:
+              cf = confflattener.ConfigurationFlattener()
+              self._flatconfig = api.Configuration()
+              cf.flat(self.configuration, self.reader.settings, self._flatconfig)
+          except (exceptions.ConeException, TypeError, Exception), e:
+              utils.log_exception(self.logger, 'Failed to flat configuration with settings %s. Exception: %s' % (self.reader.settings, e))
+              raise exceptions.ConeException('Failed to flat configuration. Exception: %s' % e)
+      return self._flatconfig
+
+
+def write_element(element, output, linesep=os.linesep):
+    """
+    """
+    if element != None and ElementTree.iselement(element):
+        enc = None
+        
+       
+        try:
+            out_file = open(output, 'w')
+            out_string = ElementTree.tostring(element)
+            out_string = out_string.replace('\r\n', linesep)
+            out_string = out_string.replace('\n', linesep)
+            out_file.write(out_string)
+            out_file.close()
+        except Exception, e:
+            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
+    else:
+        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
+    
+def remove_namespace(doc, namespace):
+    """Remove namespace in the passed document in place."""
+    ns = u'{%s}' % namespace
+    nsl = len(ns)
+    for elem in doc.getiterator():
+        if elem.tag.startswith(ns):
+            elem.tag = elem.tag[nsl:]
+
+def write_element_enc(element, output, enc, linesep=os.linesep):
+    """
+    Writes element to file
+    """
+    if element != None and ElementTree.iselement(element):
+        enc = None
+        
+       
+        try:
+            remove_namespace(element, 'http://www.s60.com/xml/genconfml/1')
+            
+            
+            out_file = codecs.open(output, 'w', enc)
+            output_string = ElementTree.tostring(element)
+            output_string = output_string.replace('\r\n', linesep)
+            output_string = output_string.replace('\n', linesep)
+            out_file.write(output_string)
+            out_file.close()
+        except Exception, e:
+            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
+    else:
+        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
+
+    
+def write_element_tempfile(element, tempfile):
+    """
+    Writes element to temp file
+    """
+    if element != None and ElementTree.iselement(element):
+        
+        try:
+            tempfile.write(ElementTree.tostring(element))
+        except Exception, e:
+            raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
+    else:
+        raise exceptions.ConeException('Cannot write element to file, because None element passed or not Element passed.')
+    
+class GenconfmlImplReader(plugin.ReaderBase):
+    """
+    Parses a single gcfml file
+    """ 
+    NAMESPACE = 'http://www.s60.com/xml/genconfml/1'
+    IGNORED_NAMESPACES = ['http://www.w3.org/1999/XSL/Transform', 
+                          'http://www.w3.org/2001/xinclude']
+    FILE_EXTENSIONS = ['gcfml']
+    
+    def __init__(self):
+        self.stylesheet = None
+        self.namespaces = self.IGNORED_NAMESPACES + [self.NAMESPACE]
+        self.settings = None
+        self.name = None
+        self.subdir = None
+        self.target = None
+        self.stylesheet_elem = None
+        self.stylesheet_output_enc = None
+        self.nss = None
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        
+        reader = GenconfmlImplReader()
+        reader.from_etree(etree)
+        return GenconfmlImpl(resource_ref, configuration, reader=reader)
+            
+    def from_etree(self, etree):
+        self.stylesheet = self.parse_stylesheet(etree)
+        self.settings = self.parse_settings(etree)
+        self.name = self.parse_name(etree)
+        self.subdir = self.parse_subdir(etree)        
+        self.target = self.parse_target(etree)
+        self.stylesheet_elem = self.parse_stylesheet_elem(etree)
+        self.stylesheet_output_enc = self.parse_stylesheet_output_enc(etree)
+        self.nss = self.parse_stylesheet_nss(etree)
+        
+        return
+
+    def parse_target(self, etree):
+        """
+        Parses target from etree
+        """
+        
+        target = ""
+        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
+          if elem != None:
+              target = elem.get('target')
+        
+        return target
+    
+    def parse_name(self, etree):
+        """
+        Parses name from etree
+        """
+        
+        name = ""
+        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
+          if elem != None:
+              name = elem.get('name')
+        
+        return name
+
+    def parse_subdir(self, etree):
+        """
+        Parses subdir from etree
+        """
+        
+        subdir = ""
+        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
+          if elem != None:
+              subdir = elem.get('subdir')
+        if subdir == None:
+            subdir = ""
+        
+        return subdir
+
+        
+    def parse_stylesheet(self,etree):
+        """
+        Parses stylesheet from getree
+        """
+        
+        stylesheet = ""
+        stylesheet_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
+        if stylesheet_elem != None:
+            stylesheet = ElementTree.tostring(stylesheet_elem)
+        return stylesheet
+
+    def parse_stylesheet_output_enc(self, etree):
+        enc = ""
+        ss_elem = etree.find("{%s}stylesheet" % self.namespaces[0])
+        if ss_elem != None:
+            children = ss_elem.getchildren()
+            for child in children:
+                if child.tag == '{%s}output' % self.namespaces[0]: 
+                    enc = child.attrib.get('encoding')
+        return enc
+
+    def parse_stylesheet_nss(self, etree):
+        nss = None
+        
+        for elem in etree.getiterator():
+            name = elem.tag
+            if name[0] == "{":
+                uri, tag = name[1:].split("}")
+                if tag == "stylesheet":
+                    nss = uri
+        return nss
+
+    def parse_stylesheet_elem(self,etree):
+        """
+        Parses stylesheet element from getree
+        """
+        
+        return etree.find("{%s}stylesheet" % self.namespaces[0])
+
+    def parse_settings(self,etree):
+        """
+        Parses settings from etree
+        """
+        
+        settings = []
+        
+        for elem in etree.getiterator("{%s}file" % self.namespaces[2]):
+          if elem != None:
+              setting_elems = elem.findall("{%s}setting" % self.namespaces[2])
+              for setting_elem in setting_elems:
+                  if setting_elem != None:
+                      settings.append(setting_elem.get('ref'))
+        
+        return settings
+    
+class Generator(object):
+    """
+    Genconfml generator
+    """ 
+    def __init__(self):
+        self.temp_confml_file = os.path.join(tempfile.gettempdir(),'temp_flatted_%i.confml' % os.getpid())
+        pass
+
+    def post_process_flattening(self, element):
+        """
+        Pick just data element and build document out of it
+        """
+        
+        data_element = element.find("data")
+        if data_element == None:
+            self.logger.warning('No data to generate!!')
+            new_doc = "<?xml version=\"1.0\"?><configuration>" + "</configuration>"
+        else:
+            new_doc = "<?xml version=\"1.0\"?><configuration>" + ElementTree.tostring(data_element) + "</configuration>"
+        return ElementTree.fromstring(new_doc)
+
+
+    def generate(self, configuration, input, output, xslt, settings, enc=sys.getdefaultencoding()):
+        """
+        Generates output
+        """
+        self.logger = logging.getLogger('cone.gcfml{%s}' % input.path)
+
+        
+        try:
+            tf = xslttransformer.XsltTransformer()
+            tf.transform_lxml(os.path.abspath(self.temp_confml_file), os.path.abspath(xslt), output, enc)
+            #tf.transform_4s(os.path.abspath(self.temp_confml_file), os.path.abspath(xslt), output, enc)
+        except (exceptions.ConeException, TypeError, Exception), e:
+            logging.getLogger('cone.gcfml').warning('Failed to do XSLT tranformation. Exception: %s' % e)
+            raise exceptions.ConeException('Failed to do XSLT tranformation. Exception: %s' % e)
+
+        """ Removes template files """
+        if not logging.getLogger('cone').getEffectiveLevel() != 10:
+            os.remove(os.path.abspath(self.temp_confml_file))
+            os.remove(os.path.abspath(xslt))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/b/feature1_file_5.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/b/x/y/feature1_file_7.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/feature1_file_4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/a/x/feature1_file_6.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+
+10
+default string
+3.14
+1
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature1_file_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/feature2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+
+default 1
+default 2
+
Binary file configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/special_char_test.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/x/feature1_file_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root1/x/y/feature1_file_3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/b/feature1_file_5.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/b/x/y/feature1_file_7.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/feature1_file_4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/a/x/feature1_file_6.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+
+200
+layer 2 string
+2.005
+2
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature1_file_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/feature2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+
+default 1
+default 2
+layer2 (1)
+layer2 (2)
+layer2 (3)
+
Binary file configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/special_char_test.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/x/feature1_file_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root2/x/y/feature1_file_3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/b/feature1_file_5.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/b/x/y/feature1_file_7.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/feature1_file_4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/a/x/feature1_file_6.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+
+300
+layer 3 string
+3.005
+3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature1_file_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/feature2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+
+layer3 (1)
+layer3 (2)
+default 1
+default 2
+layer2 (1)
+layer2 (2)
+layer2 (3)
+
Binary file configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/special_char_test.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/x/feature1_file_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root3/x/y/feature1_file_3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/b/feature1_file_5.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/b/x/y/feature1_file_7.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/feature1_file_4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/a/x/feature1_file_6.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+
+400
+layer 4 string
+4.005
+4
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature1_file_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/feature2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+
+layer4 (1)
+layer4 (2)
+
Binary file configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/special_char_test.txt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/x/feature1_file_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/expected/root4/x/y/feature1_file_3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+
+default_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1">
+    <desc>Feature with all setting types</desc>
+    <setting ref="FolderSetting" name="Folder setting" type="folder">
+      <desc>A folder setting</desc>
+    </setting>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="FileSetting" name="File setting" type="file">
+      <desc>A file setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <desc>A folder sub-setting</desc>
+      </setting>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <desc>A file sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <FolderSetting>default_folder</FolderSetting>
+      <RealSetting>3.14</RealSetting>
+      <FileSetting>default_file.txt</FileSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <FolderSubSetting>seq/default_folder</FolderSubSetting>
+        <RealSubSetting>1.0</RealSubSetting>
+        <FileSubSetting>seq/default_file.txt</FileSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def1_folder</FolderSubSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <FileSubSetting>seq/def1_file.txt</FileSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <FolderSubSetting>seq/def2_folder</FolderSubSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <FileSubSetting>seq/def2_file.txt</FileSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <FolderSetting>default_folder</FolderSetting>
+      <RealSetting>2.5</RealSetting>
+      <FileSetting>default_file.txt</FileSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>rfs string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/confml/special_char_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Special char test" version="1">
+  <feature ref="SpecialCharTest" name="Special char test">
+    <setting ref="Test1" name="Test 1" type="string"/>
+    <setting ref="Test2" name="Test 2" type="string"/>
+    <setting ref="Test3" name="Test 3" type="string"/>
+    <setting ref="Test4" name="Test 4" type="string"/>
+    <setting ref="Test5" name="Test 5" type="string"/>
+    <setting ref="Test6" name="Test 6" type="string"/>
+  </feature>
+  <data>
+    <SpecialCharTest>
+      <Test1>älämölö</Test1>
+      <Test2>ударениÑ</Test2>
+      <Test3>ελληνικά</Test3>
+      <Test4>カタカナ</Test4>
+      <Test5>中國話</Test5>
+      <Test6>&lt;&amp;&gt;</Test6>
+    </SpecialCharTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="feature1.txt">
+	<setting ref="Feature1/IntSetting"/>
+	<setting ref="Feature1/StringSetting"/>
+	<setting ref="Feature1/RealSetting"/>
+	<setting ref="Feature1/SelectionSetting"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/IntSetting"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="Feature1/StringSetting"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="Feature1/RealSetting"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="Feature1/SelectionSetting"/><xsl:text>&#xA;</xsl:text>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_1.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="feature1_file_1.txt" target="">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_2.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="x/feature1_file_2.txt" target="">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_3.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="x/y/feature1_file_3.txt" target="">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_4.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="feature1_file_4.txt" target="a/">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_5.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="feature1_file_5.txt" target="a/b/">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_6.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="x/feature1_file_6.txt" target="a/">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_7.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="x/y/feature1_file_7.txt" target="a/b/">
+
+	<setting ref="Feature1/FileSetting"/>
+	
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="Feature1/FileSetting"/>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature1_file_readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+The GenConfML files feature1_file_*.gcfml are intended for testing the
+output locations for gcfml generation.
+
+For quick reference, the folders specified in the data and target
+attributes of the gcfml files are as follows:
+
+num		name		target
+1
+2		x/			
+3		x/y/		
+4					a/
+5					a/b/
+6		x/			a/
+7		x/y/		a/b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/feature2.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="feature2.txt">
+	<setting ref="Feature2/SequenceSetting"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<xsl:for-each select="Feature2/SequenceSetting">
+				<xsl:value-of select="StringSubSetting"/><xsl:text>&#xA;</xsl:text>
+			</xsl:for-each>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/implml/special_char_test.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="special_char_test.txt">
+	<setting ref="SpecialCharTest/Test1"/>
+	<setting ref="SpecialCharTest/Test2"/>
+	<setting ref="SpecialCharTest/Test3"/>
+	<setting ref="SpecialCharTest/Test4"/>
+    <setting ref="SpecialCharTest/Test5"/>
+    <setting ref="SpecialCharTest/Test6"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-16"/>
+		<xsl:template match="configuration/data">
+			<xsl:value-of select="SpecialCharTest/Test1"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="SpecialCharTest/Test2"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="SpecialCharTest/Test3"/><xsl:text>&#xA;</xsl:text>
+			<xsl:value-of select="SpecialCharTest/Test4"/><xsl:text>&#xA;</xsl:text>
+            <xsl:value-of select="SpecialCharTest/Test5"/><xsl:text>&#xA;</xsl:text>
+            <xsl:value-of select="SpecialCharTest/Test6"/><xsl:text>&#xA;</xsl:text>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 1">
+  <xi:include href="confml/feature1.confml#/"/>
+  <xi:include href="confml/feature2.confml#/"/>
+  <xi:include href="confml/special_char_test.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" name="data">
+  <confml:data>
+  
+	<confml:Feature1>
+	<confml:IntSetting>200</confml:IntSetting>
+	<confml:StringSetting>layer 2 string</confml:StringSetting>
+	<confml:RealSetting>2.005</confml:RealSetting>
+	<confml:SelectionSetting>2</confml:SelectionSetting>
+	</confml:Feature1>
+  
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="append">
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (3)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 2">
+  <xi:include href="confml/data.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer2/root_oldmodel.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 2">
+  <confml:data>
+  
+	<confml:Feature1>
+	<confml:IntSetting>200</confml:IntSetting>
+	<confml:StringSetting>layer 2 string</confml:StringSetting>
+	<confml:RealSetting>2.005</confml:RealSetting>
+	<confml:SelectionSetting>2</confml:SelectionSetting>
+	</confml:Feature1>
+  
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="append">
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>222</confml:IntSubSetting>
+		<confml:StringSubSetting>layer2 (3)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+  <xi:include href="../Layer1/root.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" name="data">
+  <confml:data>
+
+	<confml:Feature1>
+	<confml:IntSetting>300</confml:IntSetting>
+	<confml:StringSetting>layer 3 string</confml:StringSetting>
+	<confml:RealSetting>3.005</confml:RealSetting>
+	<confml:SelectionSetting>3</confml:SelectionSetting>
+	</confml:Feature1>
+    
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="prefix">
+	    <confml:IntSubSetting>333</confml:IntSubSetting>
+		<confml:StringSubSetting>layer3 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>333</confml:IntSubSetting>
+		<confml:StringSubSetting>layer3 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 3">
+  <xi:include href="confml/data.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer3/root_oldmodel.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 3">
+  <confml:data>
+
+	<confml:Feature1>
+	<confml:IntSetting>300</confml:IntSetting>
+	<confml:StringSetting>layer 3 string</confml:StringSetting>
+	<confml:RealSetting>3.005</confml:RealSetting>
+	<confml:SelectionSetting>3</confml:SelectionSetting>
+	</confml:Feature1>
+    
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="prefix">
+	    <confml:IntSubSetting>333</confml:IntSubSetting>
+		<confml:StringSubSetting>layer3 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>333</confml:IntSubSetting>
+		<confml:StringSubSetting>layer3 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+  <xi:include href="../Layer2/root_oldmodel.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" name="data">
+  <confml:data>
+  
+	<confml:Feature1>
+	<confml:IntSetting>400</confml:IntSetting>
+	<confml:StringSetting>layer 4 string</confml:StringSetting>
+	<confml:RealSetting>4.005</confml:RealSetting>
+	<confml:SelectionSetting>4</confml:SelectionSetting>
+	</confml:Feature1>
+    
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="replace">
+	    <confml:IntSubSetting>444</confml:IntSubSetting>
+		<confml:StringSubSetting>layer4 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>444</confml:IntSubSetting>
+		<confml:StringSubSetting>layer4 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 4">
+  <xi:include href="confml/data.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/Layer4/root_oldmodel.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="Layer 4">
+  <confml:data>
+  
+	<confml:Feature1>
+	<confml:IntSetting>400</confml:IntSetting>
+	<confml:StringSetting>layer 4 string</confml:StringSetting>
+	<confml:RealSetting>4.005</confml:RealSetting>
+	<confml:SelectionSetting>4</confml:SelectionSetting>
+	</confml:Feature1>
+    
+	<confml:Feature2>
+	  <confml:SequenceSetting extensionPolicy="replace">
+	    <confml:IntSubSetting>444</confml:IntSubSetting>
+		<confml:StringSubSetting>layer4 (1)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	  <confml:SequenceSetting>
+	    <confml:IntSubSetting>444</confml:IntSubSetting>
+		<confml:StringSubSetting>layer4 (2)</confml:StringSubSetting>
+	  </confml:SequenceSetting>
+	</confml:Feature2>
+	
+  </confml:data>
+  <xi:include href="../Layer3/root_oldmodel.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/CVC_2DigitDialing.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<configuration name="unknown" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <feature name="2 Digit Dialing" ref="CVC_2DigitDialing">
+    <desc>2 Digit Dialing.</desc>
+  <setting name="2 Digit Dialing" ref="CVC_2DigitDialing" type="boolean">
+      <desc>2 Dialing. Default is disabled</desc>
+    </setting>
+  </feature>
+<data>
+    <CVC_2DigitDialing extensionPolicy="append">
+      <CVC_2DigitDialing extensionPolicy="append">false</CVC_2DigitDialing>
+    </CVC_2DigitDialing>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/commsdatcreator.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1893 @@
+<configuration name="Default CommsDat settings" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <feature name="CommsDat generation" ref="KCRUidCommsDatCreator">
+    <desc>Used to configure whether CommsDat generation from these settings is enabled.</desc>
+  <setting name="CommsDat generation enabled" ref="KCommsDatCreatorInputFileName" type="string">
+      <desc>This is the master switch that determines whether CommsDat is created in the first boot 
+    	of the device based on Configuration Tool output. Set this to Yes if you are creating variant 
+    	and need to configure anything under Default CommsDat settings.</desc>
+    <option name="No" value="" />
+    <option name="Yes" value="VariantData_commsdat.xml" />
+    </setting>
+  <setting name="CommsDatCreator startup status flag" ref="KCommsDatCreatorStartupStatus" type="int">
+      <desc>Read-only flag that indicates the CommsDatCreator start-up status in runtime.</desc>
+    </setting>
+  </feature>
+<feature name="Global settings" ref="Global">
+    <desc>
+  	Global networking related settings not tied to individual connection methods.
+  	</desc>
+  <setting name="Attachmode" ref="Attachmode" type="selection">
+      <desc>
+      GPRS attach mode (attach when needed/when available).
+      </desc>
+    <option name="When available" value="whenavailable" />
+    <option name="When needed" value="whenneeded" />
+    </setting>
+  <setting name="Default access point" ref="DefaultAP" type="string">
+      <desc>
+    	Default GPRS access point. Used when the phone is used as a modem for a PC.
+    	The corresponding UI setting is Connection-Packet data-Access point.
+    	</desc>
+    </setting>
+  <setting name="Default icon for DNs" ref="DefaultDnIcon" type="selection">
+      <desc>
+      Default icon for destination networks.
+      </desc>
+    <option name="internet" value="0" />
+    <option name="wap" value="1" />
+    <option name="mms" value="2" />
+    <option name="intranet" value="3" />
+    <option name="operator" value="4" />
+    <option name="icon1" value="5" />
+    <option name="icon2" value="6" />
+    <option name="icon3" value="7" />
+    <option name="icon4" value="8" />
+    <option name="icon5" value="9" />
+    <option name="icon6" value="10" />
+    <option name="default" value="11" />
+    </setting>
+  <setting name="LAN bearer default priority" ref="PriorityLan" type="string">
+      <desc>
+    	Default priority for LAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="WLAN bearer default priority" ref="PriorityWlan" type="string">
+      <desc>
+    	Default priority for WLAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="PAN bearer default priority" ref="PriorityPan" type="string">
+      <desc>
+    	Default priority for PAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="Outgoing GPRS bearer default priority" ref="PriorityGprsOut" type="string">
+      <desc>
+    	Default priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="Incoming GPRS bearer default priority" ref="PriorityGprsIn" type="string">
+      <desc>
+    	Default priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="CDMA2000 bearer default priority" ref="PriorityCdma2k" type="string">
+      <desc>
+    	Default priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialOut ISP bearer default priority" ref="PriorityDialOut" type="string">
+      <desc>
+    	Default priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialIn ISP bearer default priority" ref="PriorityDialIn" type="string">
+      <desc>
+    	Default priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="VPN bearer default priority" ref="PriorityVpn" type="string">
+      <desc>
+    	Default priority for VPN bearer type.
+    	</desc>
+    </setting>
+  <setting name="MIP bearer default priority" ref="PriorityMip" type="string">
+      <desc>
+    	Default priority for MIP bearer type.
+    	</desc>
+    </setting>
+  <setting name="LAN bearer default UI priority" ref="UIPriorityLan" type="string">
+      <desc>
+    	Default UI priority of LAN connection.
+    	</desc>
+    </setting>
+  <setting name="WLAN bearer default UI priority" ref="UIPriorityWlan" type="string">
+      <desc>
+    	Default UI priority for WLAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="PAN bearer default UI priority" ref="UIPriorityPan" type="string">
+      <desc>
+    	Default UI priority for PAN bearer type.
+    	</desc>
+    </setting>
+  <setting name="Outgoing GPRS bearer default UI priority" ref="UIPriorityGprsOut" type="string">
+      <desc>
+    	Default UI priority for outgoing GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="Incoming GPRS bearer default UI priority" ref="UIPriorityGprsIn" type="string">
+      <desc>
+    	Default UI priority for incoming GPRS bearer type.
+    	</desc>
+    </setting>
+  <setting name="CDMA2000 bearer default UI priority" ref="UIPriorityCdma2k" type="string">
+      <desc>
+    	Default UI priority for CDMA 2000 bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialOut ISP bearer default UI priority" ref="UIPriorityDialOut" type="string">
+      <desc>
+    	Default UI priority for outgoing dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="DialIn ISP bearer default UI priority" ref="UIPriorityDialIn" type="string">
+      <desc>
+    	Default UI priority for incoming dial bearer type.
+    	</desc>
+    </setting>
+  <setting name="VPN bearer default UI priority" ref="UIPriorityVpn" type="string">
+      <desc>
+    	Default UI priority for VPN bearer type.
+    	</desc>
+    </setting>
+  <setting name="MIP bearer default UI priority" ref="UIPriorityMip" type="string">
+      <desc>
+    	Default UI priority for MIP bearer type.
+    	</desc>
+    </setting>
+  <setting name="Default connection type" ref="DefaultConnectionType" type="selection">
+      <desc>
+      Specifies how the applications' default connection is specified.
+      </desc>
+    <option name="Ask once" value="Ask once" />
+    <option name="Always ask" value="Always ask" />
+    <option name="Destination" value="Destination" />
+    <option name="Connection method" value="Connection method" />
+    </setting>
+  <setting name="Default connection name" ref="DefaultConnectionName" type="string">
+      <desc>
+    	The name of the default connection (connection method or destination network). 
+    	Default connection type parameter needs to be set accordingly.
+    	</desc>
+    </setting>
+  <setting name="GPRS last socket activity timeout" ref="GprsLastSocketActivityTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="GPRS last session closed timeout" ref="GprsLastSessionClosedTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when session has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="GPRS last socket closed timeout" ref="GprsLastSocketClosedTimeout" type="int">
+      <desc>
+    	For GPRS the time (in seconds) to stay online when socket has closed. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last socket activity timeout" ref="CsdLastSocketActivityTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last session closed timeout" ref="CsdLastSessionClosedTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="CSD last socket closed timeout" ref="CsdLastSocketClosedTimeout" type="int">
+      <desc>
+    	For CSD the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last socket activity timeout" ref="WlanLastSocketActivityTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last session closed timeout" ref="WlanLastSessionClosedTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN last socket closed timeout" ref="WlanLastSocketClosedTimeout" type="int">
+      <desc>
+    	For WLAN the time (in seconds) to stay online when all socket activity has ceased. -1 for unlimited time.
+    	Leave empty to use the product default value.
+    	</desc>
+    </setting>
+  <setting name="WLAN background scan interval" ref="WlanBGScanInterval" type="selection">
+      <desc>
+      How often WLAN networks are scanned when idle.
+      </desc>
+    <option name="Never" value="0" />
+    <option name="Every minute" value="60" />
+    <option name="Every 2 minutes" value="120" />
+    <option name="Every 5 minutes" value="300" />
+    <option name="Every 10 minutes" value="600" />
+    </setting>
+  <setting name="WLAN use default settings" ref="WlanUseDefSettings" type="selection">
+      <desc>Defines whether default values are being used for the advanced WLAN settings (recommended). </desc>
+    <option name="No" value="0" />
+    <option name="Yes" value="1" />
+    </setting>
+  <setting name="WLAN long retry limit" ref="WlanLongRetry" type="int">
+      <desc>Defines how many times packets bigger than RTS Threshold are been resent.</desc>
+    </setting>
+  <setting name="WLAN short retry limit" ref="WlanShortRetry" type="int">
+      <desc>Defines how many times packets smaller than RTS Threshold are been resent.</desc>
+    </setting>
+  <setting name="WLAN RTS threshold" ref="WlanRTS" type="int">
+      <desc>Minimum size of a packet for which CTS/RTS handshake has been used.</desc>
+    </setting>
+  <setting name="WLAN TX power level" ref="WlanTxPowerLevel" type="selection">
+      <desc>Transmission power level in use. In mWs. 4, 10 or 100 mW.</desc>
+    <option name="100 mW" value="100" />
+    <option name="10 mW" value="10" />
+    <option name="4 mW" value="4" />
+    </setting>
+  <setting name="WLAN allow radio measurements" ref="WlanRadioMeasurements" type="selection">
+      <desc>Defines whether the CCX radio measurements are allowed.</desc>
+    <option name="No" value="0" />
+    <option name="Yes" value="1" />
+    </setting>
+  <setting name="WLAN power save" ref="WlanPowerMode" type="selection">
+      <desc>Defines whether power saving methods are active. Disabling WLAN
+      power save might increase interoperability but will dramatically shorten battery life.</desc>
+    <option name="On" value="1" />
+    <option name="Off" value="0" />
+    </setting>
+  </feature>
+<feature name="GPRS Access Points" ref="APs">
+    <desc>GPRS connection method (CM) definitions</desc>
+  <setting name="GPRS" ref="AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Network type" ref="NetworkType" type="selection">
+        <desc>Addressing that the network uses.</desc>
+      <option name="IPv4" value="IPv4" />
+      <option name="IPv6" value="IPv6" />
+      </setting>
+    <setting name="GPRS Access Point Name" ref="GPRS_AP_Name" type="string">
+        <desc>The access point name for this GPRS connection</desc>
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="GPRS Use EDGE" ref="GprsUseEdge" type="selection">
+        <desc>Allow EDGE usage.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="ISP Type" ref="IspType" type="selection">
+        <desc>Specifies the service provider type. Used when filtering connection methods for certain purpose.</desc>
+      <option name="Internet" value="0" />
+      <option name="WAP" value="1" />
+      <option name="Both" value="2" />
+      </setting>
+    </setting>
+  </feature>
+<feature name="WLAN Access Points" ref="WLAN_APs">
+    <desc>WLAN connection method (CM) definitions</desc>
+  <setting name="WLAN" ref="WLAN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Network Name" ref="NetworkName" type="string">
+        <desc>Service set identifier (SSID) of the primary WLAN network.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method. In URL format.</desc>
+      </setting>
+    <setting name="Network Mode" ref="NetworkMode" type="string">
+        <desc>Determines the network infrastructure. 
+        If there is a WLAN access point in the network then this should be Infrastructure.</desc>
+      <option name="Infrastructure" value="Infrastructure" />
+      <option name="Ad-hoc" value="Ad-hoc" />
+      </setting>
+    <setting name="Security Mode" ref="SecurityMode" type="selection">
+        <desc>Security mode of the WLAN network.</desc>
+      <option name="Open" value="Open" />
+      <option name="WEP" value="WEP" />
+      <option name="802.1x" value="802.1x" />
+      <option name="WPA" value="WPA" />
+      <option name="WPA2" value="WPA2" />
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="WLAN IP Gateway Address" ref="WlanIpGatewayAddress" type="string">
+        <desc>The gateway IP address. 
+      Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="Wlan IP Net Mask" ref="WlanIpNetMask" type="string">
+        <desc>Network mask. Typically allocated automatically in which case this should be empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="WLAN Scan SSID" ref="WLANScanSSID" type="selection">
+        <desc>Defines whether the SSID should be actively scanned. 
+        This is needed if the SSID is hidden (not broadcasted by the AP) </desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="WLAN Channel ID" ref="WlanChannelId" type="string">
+        <desc>
+      	802.11 Channel ID (1-14). Used only when connecting/setting up adhoc network.
+      	</desc>
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="WEP Key In Use" ref="WEPKeyInUse" type="selection">
+        <desc>Index of default WEP key. Used only when security mode is WEP.</desc>
+      <option name="key1" value="key1" />
+      <option name="key2" value="key2" />
+      <option name="key3" value="key3" />
+      <option name="key4" value="key4" />
+      </setting>
+    <setting name="WEP Auth Type" ref="WEPAuthType" type="selection">
+        <desc>WEP authentication mode. Only used when security mode is WEP.</desc>
+      <option name="Shared" value="Shared" />
+      <option name="Open" value="Open" />
+      </setting>
+    <setting name="WEP Key1 Length" ref="WEPKey1Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key1 Format" ref="WEPKey1Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key1 Data" ref="WEPKey1Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key2 Length" ref="WEPKey2Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key2 Format" ref="WEPKey2Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key2 Data" ref="WEPKey2Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key3 Length" ref="WEPKey3Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key3 Format" ref="WEPKey3Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key3 Data" ref="WEPKey3Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WEP Key4 Length" ref="WEPKey4Length" type="selection">
+        <desc>WEP key length in bits.</desc>
+      <option name="64" value="64" />
+      <option name="128" value="128" />
+      <option name="256" value="256" />
+      </setting>
+    <setting name="WEP Key4 Format" ref="WEPKey4Format" type="selection">
+        <desc>WEP key format.</desc>
+      <option name="ASCII" value="ASCII" />
+      <option name="Hexadecimal" value="Hexadecimal" />
+      </setting>
+    <setting name="WEP Key4 Data" ref="WEPKey4Data" type="string">
+        <desc>WEP key data (in format specified by corresponding WEP key format field).</desc>
+      </setting>
+    <setting name="WPA Pre-shared Key" ref="WPAPresharedKey" type="string">
+        <desc>WPA/WPA2 pre-shared key in plain text. ASCII character set values between 32-126 must be used. Minimum length is 8 characters and maximum 63.
+        You need to also define the WPA pre-shared key length field accordingly</desc>
+      </setting>
+    <setting name="WPA Use of Pre-shared Key" ref="WPAUseOfPresharedKey" type="selection">
+        <desc>Specifies that when the security mode is WPA or WPA2 if the PSK mode is enabled. 
+        If this is off then EAP mode is used and the list of EAPs needs to be defined.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="WPA Pre-shared key length" ref="WPAKeyLength" type="int">
+        <desc>The length of the specified pre-shared key (in WPA pre-shared key field)</desc>
+      </setting>
+    <setting name="WPA List Of EAPs" ref="WPAListOfEAPs" type="string">
+        <desc>
+      	A list of Extensible Authentication Protocols (EAPs) in use. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM the string needs to be "+018". 
+      	The list is in priority order, highest priority first.      	
+      	</desc>
+      </setting>
+    <setting name="EAP-GTC user name" ref="EapGtcUsername" type="string">
+        <desc>The username used with EAP-GTC.</desc>
+      </setting>
+    <setting name="EAP-GTC session validity time" ref="EapGtcSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-GTC tunneling method" ref="EapGtcEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-GTC.</desc>
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-TLS user name" ref="EapTlsUsername" type="string">
+        <desc>The username used with EAP-TLS.</desc>
+      </setting>
+    <setting name="EAP-TLS realm" ref="EapTlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-TLS verify server realm" ref="EapTlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TLS require client authentication" ref="EapTlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TLS session validity time" ref="EapTlsSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-TLS cipher suites" ref="EapTlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate subject key id" ref="EapTlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate. 
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate issuer" ref="EapTlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS user certificate serial number" ref="EapTlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate subject key id" ref="EapTlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate issuer" ref="EapTlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS CA certificate serial number" ref="EapTlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TLS tunneling method" ref="EapTlsEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-TLS.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-LEAP user name" ref="EapLeapUsername" type="string">
+        <desc>The username used with EAP-LEAP.</desc>
+      </setting>
+    <setting name="EAP-LEAP password" ref="EapLeapPassword" type="string">
+        <desc>The password used with EAP-LEAP.</desc>
+      </setting>
+    <setting name="EAP-LEAP session validity time" ref="EapLeapSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-SIM user name" ref="EapSimUsername" type="string">
+        <desc>The username used with EAP-SIM.</desc>
+      </setting>
+    <setting name="EAP-SIM realm" ref="EapSimRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-SIM pseudonyms allowed" ref="EapSimUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-SIM session validity time" ref="EapSimSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-SIM tunneling method" ref="EapSimEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-SIM.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-TTLS user name" ref="EapTtlsUsername" type="string">
+        <desc>The username used with EAP-TTLS.</desc>
+      </setting>
+    <setting name="EAP-TTLS realm" ref="EapTtlsRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-TTLS verify server realm" ref="EapTtlsVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TTLS require client authentication" ref="EapTtlsRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-TTLS session validity time" ref="EapTtlsSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-TTLS cipher suites" ref="EapTtlsCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-TTLS tunneled methods" ref="EapTtlsEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-TTLS. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate subject key id" ref="EapTtlsUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate issuer" ref="EapTtlsUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS user certificate serial number" ref="EapTtlsUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate subject key id" ref="EapTtlsCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate issuer" ref="EapTtlsCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-TTLS CA certificate serial number" ref="EapTtlsCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-AKA user name" ref="EapAkaUsername" type="string">
+        <desc>The username used with EAP-AKA.</desc>
+      </setting>
+    <setting name="EAP-AKA realm" ref="EapAkaRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-AKA pseudonyms allowed" ref="EapAkaUsePseudonyms" type="selection">
+        <desc>Specifies whether IMSI is sent always when authentication or is pseudonym usage allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-AKA session validity time" ref="EapAkaSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="EAP-AKA tunneling method" ref="EapAkaEncapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-AKA.</desc>
+      <option name="None" value="" />
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-PEAP user name" ref="EapPeapUsername" type="string">
+        <desc>The username used with EAP-PEAP.</desc>
+      </setting>
+    <setting name="EAP-PEAP realm" ref="EapPeapRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-PEAP verify server realm" ref="EapPeapVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP require client authentication" ref="EapPeapRequireClientAuth" type="selection">
+        <desc>Specifies whether PEAP requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP session validity time" ref="EapPeapSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-PEAP cipher suites" ref="EapPeapCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-PEAP version 0 allowed" ref="EapPeapV0Allowed" type="selection">
+        <desc>Is PEAP version 0 allowed. If in doubt enable only this one.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP version 1 allowed" ref="EapPeapV1Allowed" type="selection">
+        <desc>Is PEAP version 1 allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP version 2 allowed" ref="EapPeapV2Allowed" type="selection">
+        <desc>Is PEAP version 2 allowed.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-PEAP tunneled methods" ref="EapPeapEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-PEAP. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate subject key id" ref="EapPeapUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate issuer" ref="EapPeapUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP user certificate serial number" ref="EapPeapUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate subject key id" ref="EapPeapCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate issuer" ref="EapPeapCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-PEAP CA certificate serial number" ref="EapPeapCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 user name" ref="EapMschapv2Username" type="string">
+        <desc>The username used with EAP-MSCHAPv2.</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 password" ref="EapMschapv2Password" type="string">
+        <desc>The password used with EAP-MSCHAPv2.</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 session validity time" ref="EapMschapv2SessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-MSCHAPv2 tunneling method" ref="EapMschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with EAP-MSCHAPv2.</desc>
+      <option name="EAP-PEAP" value="25" />
+      <option name="EAP-TTLS" value="21" />
+      <option name="EAP-FAST" value="43" />
+      </setting>
+    <setting name="EAP-FAST user name" ref="EapFastUsername" type="string">
+        <desc>The username used with EAP-FAST.</desc>
+      </setting>
+    <setting name="EAP-FAST realm" ref="EapFastRealm" type="string">
+        <desc>The realm used for device identification to the server.</desc>
+      </setting>
+    <setting name="EAP-FAST verify server realm" ref="EapFastVerifyServerRealm" type="selection">
+        <desc>Specifies whether the server's realm is compared with own realm. 
+      	This provides extra security but it depends on the network infrastructure and set-up whether this will work.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST require client authentication" ref="EapFastRequireClientAuth" type="selection">
+        <desc>Specifies whether TTLS requires that the server authenticates it (the client).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST session validity time" ref="EapFastSessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear)</desc>
+      </setting>
+    <setting name="EAP-FAST cipher suites" ref="EapFastCipherSuites" type="string">
+        <desc>The list of allowed cipher suites. In the format +xxx,+xxx,+xxx... where xxx is the cipher suite identifier.
+      	004: TLS_RSA_WITH_RC4_128_MD5, 005: TLS_RSA_WITH_RC4_128_SHA, 010: TLS_RSA_WITH_3DES_EDE_CBC_SHA,
+				019:	TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, 022: TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA, 047: TLS_RSA_WITH_AES_128_CBC_SHA
+				050:	TLS_DHE_DSS_WITH_AES_128_CBC_SHA, 051:	TLS_DHE_RSA_WITH_AES_128_CBC_SHA, 052: TLS_DH_anon_WITH_AES_128_CBC_SHA 
+				For example +004 enables only RSA with RC4 and MD5.
+				</desc>
+      </setting>
+    <setting name="EAP-FAST tunneled methods" ref="EapFastEncapsulatedTypes" type="string">
+        <desc>A list of Extensible Authentication Protocols (EAPs) in tunneled by EAP-FAST. The format is +xxx,+xxx,+xxx where xxx indicates the enabled EAP method ID as
+      	specified in the IANA registry: http://www.iana.org/assignments/eap-numbers. For example to enable EAP-SIM encapsulation the string needs to be "+018". 
+      	The list is in priority order, highest priority first. Note that the encapsulate type's encapsulation parameter needs to be configured accordingly. </desc>
+      </setting>
+    <setting name="EAP-FAST authenticated provisioning mode allowed" ref="EapFastAuthProvModeAllowed" type="selection">
+        <desc>EAP-FAST authenticated provisioning mode allowed</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST unauthenticated provisioning mode allowed" ref="EapFastUnauthProvModeAllowed" type="selection">
+        <desc>EAP-FAST unauthenticated provisioning mode allowed</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn ADHP no PAC" ref="EapFastWarnADHPNoPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no PAC</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn ADHP no matching PAC" ref="EapFastWarnADHPNoMatchingPAC" type="selection">
+        <desc>EAP-FAST warn ADHP no matching PAC</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST warn not default server" ref="EapFastWarnNotDefaultServer" type="selection">
+        <desc>EAP-FAST warn not default server</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="EAP-FAST user certificate subject key id" ref="EapFastUserCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the user certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-FAST user certificate issuer" ref="EapFastUserCertIssuerName" type="string">
+        <desc>The issuer of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST user certificate serial number" ref="EapFastUserCertSerialNumber" type="string">
+        <desc>The serial number of the user certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate subject key id" ref="EapFastCaCertSubjectKeyId" type="string">
+        <desc>The subject key id value of the CA certificate.
+        Currently this field is the only one that can be used to identify the certificate.</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate issuer" ref="EapFastCaCertIssuerName" type="string">
+        <desc>The issuer of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="EAP-FAST CA certificate serial number" ref="EapFastCaCertSerialNumber" type="string">
+        <desc>The serial number of the CA certificate. Ignored by the implementation currently!</desc>
+      </setting>
+    <setting name="MSCHAPv2 user name" ref="Mschapv2Username" type="string">
+        <desc>The username used with MSCHAPv2.</desc>
+      </setting>
+    <setting name="MSCHAPv2 password" ref="Mschapv2Password" type="string">
+        <desc>The password used with MSCHAPv2.</desc>
+      </setting>
+    <setting name="MSCHAPv2 session validity time" ref="Mschapv2SessionValidityTime" type="int">
+        <desc>Specifies how long single session is kept in memory (so no new password queries or similar appear).</desc>
+      </setting>
+    <setting name="MSCHAPv2 tunneling method" ref="Mschapv2Encapsulation" type="selection">
+        <desc>Defines which EAP tunneling method is used with MSCHAPv2. Needs to be EAP-TTLS.</desc>
+      <option name="EAP-TTLS" value="21" />
+      </setting>
+    </setting>
+  </feature>
+<feature name="CSD Access Points" ref="CSD_APs">
+    <desc>Circuit-Switched Data connection methods</desc>
+  <setting name="CSD" ref="CSD_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>Username for the connection.</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password on connection set-up time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password Authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication type.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Starting page.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>WTLS security.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Connection type.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+    <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+      <option name="Autodetect" value="Autodetect" />
+      <option name="9600" value="9600" />
+      <option name="14400" value="14400" />
+      <option name="19200" value="19200" />
+      <option name="28800" value="28800" />
+      <option name="38400" value="38400" />
+      <option name="43200" value="43200" />
+      <option name="56000" value="56000" />
+      </setting>
+    <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+      <option name="Analogue" value="Analogue" />
+      <option name="Isdn v110" value="Isdn v110" />
+      <option name="Isdn v120" value="Isdn v120" />
+      </setting>
+    <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+      <option name="Server Number" value="Server Number" />
+      <option name="Other Number" value="Other Number" />
+      </setting>
+    <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+    <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+    <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="HSCD Access Points" ref="HSCSD_APs">
+    <desc>High-speed Circuit-Switched Data connection methods</desc>
+  <setting name="HSCSD" ref="HSCSD_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="User Name" ref="UserName" type="string">
+        <desc>User name</desc>
+      </setting>
+    <setting name="Prompt Password" ref="PromptPassword" type="selection">
+        <desc>Prompt password at connection time.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Password" ref="Password" type="string">
+        <desc>Password.</desc>
+      </setting>
+    <setting name="Password authentication type" ref="PasswordAuthenticationType" type="selection">
+        <desc>Password authentication method.</desc>
+      <option name="Normal" value="Normal" />
+      <option name="Secure" value="Secure" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Default Tel Number (Mandatory)" ref="DefaultTelNumber" type="string">
+        <desc>Default telephone number.</desc>
+      </setting>
+    <setting name="Bearer Speed" ref="BearerSpeed" type="selection">
+        <desc>Bearer speed</desc>
+      <option name="Autodetect" value="Autodetect" />
+      <option name="9600" value="9600" />
+      <option name="14400" value="14400" />
+      <option name="19200" value="19200" />
+      <option name="28800" value="28800" />
+      <option name="38400" value="38400" />
+      <option name="43200" value="43200" />
+      <option name="56000" value="56000" />
+      </setting>
+    <setting name="Bearer Call Type Isdn" ref="BearerCallTypeIsdn" type="selection">
+        <desc>Bearer Call Type Isdn</desc>
+      <option name="Analogue" value="Analogue" />
+      <option name="Isdn v110" value="Isdn v110" />
+      <option name="Isdn v120" value="Isdn v120" />
+      </setting>
+    <setting name="Call back Enabled" ref="CallbackEnabled" type="selection">
+        <desc>Is callback enabled.</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Call back type" ref="CallbackType" type="selection">
+        <desc>Callback type.</desc>
+      <option name="Server Number" value="Server Number" />
+      <option name="Other Number" value="Other Number" />
+      </setting>
+    <setting name="Call back number" ref="CallbackInfo" type="string">
+        <desc>Callback number.</desc>
+      </setting>
+    <setting name="Enable PPP Compression" ref="EnableSWCompression" type="selection">
+        <desc>Enable compression</desc>
+      <option name="Yes" value="Yes" />
+      <option name="No" value="No" />
+      </setting>
+    <setting name="Use Login Script" ref="UseLoginScript" type="selection">
+        <desc>Use login script</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Login Script" ref="LoginScript" type="string">
+        <desc>Login script</desc>
+      </setting>
+    <setting name="Modem init string" ref="InitString" type="string">
+        <desc>Modem init string</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="LAN Access Points" ref="LAN_APs">
+    <desc>LAN connection methods</desc>
+  <setting name="LAN" ref="LAN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="WAP Gateway IP" ref="WAPGatewayIP" type="string">
+        <desc>WAP gateway IP address.</desc>
+      </setting>
+    <setting name="Starting Page" ref="StartingPage" type="string">
+        <desc>Start page of the connection method.</desc>
+      </setting>
+    <setting name="WTLS Security" ref="WTLS_Security" type="selection">
+        <desc>Attempts a secure WTLS connection to the gateway.</desc>
+      <option name="On" value="On" />
+      <option name="Off" value="Off" />
+      </setting>
+    <setting name="Connection type" ref="WAP_ConnectionType" type="selection">
+        <desc>Indicates whether a connection-oriented or connectionless API should be used.</desc>
+      <option name="Continuous" value="Continuous" />
+      <option name="Temporary" value="Temporary" />
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="LAN If Networks" ref="LanIfNetworks" type="string">
+        <desc>LAN interface networks.</desc>
+      </setting>
+    <setting name="LAN IP Netmask" ref="LanIpNetmask" type="string">
+        <desc>LAN interface netmask.</desc>
+      </setting>
+    <setting name="LAN IP Gateway" ref="LanIpGateway" type="string">
+        <desc>LAN IP Gateway.</desc>
+      </setting>
+    <setting name="IPv4 Phone IP address" ref="PhoneIP" type="string">
+        <desc>IP address of the interface. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Primary Name Server" ref="PrimaryNameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names. 
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv4 Secondary Name Server" ref="SecondaryNameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Primary Name Server" ref="PrimaryIP6NameServer" type="string">
+        <desc>Address of the primary DNS server that resolves host names.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    <setting name="IPv6 Secondary Name Server" ref="SecondaryIP6NameServer" type="string">
+        <desc>Address of the secondary DNS server to connect if the primary DNS server is not available.
+        Typically allocated automatically so this can be left empty.</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="VPN Access Points" ref="VPN_APs">
+    <desc>Virtual Private Network connection methods</desc>
+  <setting name="VPN" ref="VPN_AP" type="sequence">
+      <setting name="Connection Name" ref="ConnectionName" type="string">
+        <desc>The CM name that is visible to the user.</desc>
+      </setting>
+    <setting name="Connection ID" ref="ConnectionId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Protected" ref="Protected" type="selection">
+        <desc>Defines whether connection method is protected (= cannot be edited by the user).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Defines whether connection method is hidden.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Connection method is hidden in CConnDlg or not (used to divide MMS and non-MMS CMs).</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Connection method is highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Seamlessness" ref="Seamlessness" type="selection">
+        <desc>Defines whether an IAP can be roamed to.</desc>
+      <option name="Confirm First" value="ConfirmFirst" />
+      <option name="Show Progress" value="ShowProgress" />
+      </setting>
+    <setting name="Proxy Server Address" ref="ProxyServerAddress" type="string">
+        <desc>Address of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy Port Number" ref="ProxyPortNumber" type="string">
+        <desc>Port number of the HTTP/HTTPS proxy server.</desc>
+      </setting>
+    <setting name="Proxy protocol Name" ref="ProxyProtocolName" type="string">
+        <desc>Name of the protocol for which this proxy can be used. 
+        Typically http or https.</desc>
+      </setting>
+    <setting name="Underlying IAP Name" ref="IAP_Name" type="string">
+        <desc>The network connection provider IAP name.</desc>
+      </setting>
+    <setting name="Service Policy" ref="ServicePolicy" type="string">
+        <desc>Service policy.</desc>
+      </setting>
+    </setting>
+  </feature>
+<feature name="Destination Networks" ref="DNs">
+    <desc>Destination network (SNAP) definitions.</desc>
+  <setting name="DN" ref="DN" type="sequence">
+      <setting name="Name" ref="Name" type="string">
+        <desc>The name that is visible to the user</desc>
+      </setting>
+    <setting name="Destination Network ID" ref="DNId" type="int">
+        <desc>The CommsDat record id can be manually specified here. If left empty it is allocated automatically.
+      	Note: It needs to be verified carefully that the IDs are globally unique if allocated manually! 
+      	So a good idea is to either specify all the IDs manually or none at all.</desc>
+      </setting>
+    <setting name="Metadata" ref="Metadata" type="selection">
+        <desc>Metadata that specifies a few default destination networks that applications can use</desc>
+      <option name="User Defined" value="UserDefined" />
+      <option name="Internet" value="Internet" />
+      <option name="Operator" value="Operator" />
+      <option name="MMS" value="MMS" />
+      <option name="Intranet" value="Intranet" />
+      </setting>
+    <setting name="Protection Level" ref="Protection" type="selection">
+        <desc>DN protection level. Destination contents mean the connection methods inside the destination and their priorities. </desc>
+      <option name="No protection" value="0" />
+      <option name="Destination and contents" value="1" />
+      <option name="Destination" value="2" />
+      </setting>
+    <setting name="Hidden" ref="Hidden" type="selection">
+        <desc>Is DN hidden or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Hidden Agent" ref="HiddenAgent" type="selection">
+        <desc>Is DN hidden in CConnDlg or not</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Highlighted" ref="Highlighted" type="selection">
+        <desc>Is DN highlighted or not.</desc>
+      <option name="No" value="No" />
+      <option name="Yes" value="Yes" />
+      </setting>
+    <setting name="Icon" ref="Icon" type="selection">
+        <desc>Icon to be assigned to DN.</desc>
+      <option name="internet" value="0" />
+      <option name="wap" value="1" />
+      <option name="mms" value="2" />
+      <option name="intranet" value="3" />
+      <option name="operator" value="4" />
+      <option name="icon1" value="5" />
+      <option name="icon2" value="6" />
+      <option name="icon3" value="7" />
+      <option name="icon4" value="8" />
+      <option name="icon5" value="9" />
+      <option name="icon6" value="10" />
+      <option name="default" value="11" />
+      </setting>
+    <setting name="EmbeddedDN" ref="EmbeddedDN" type="string">
+        <desc>
+	    	Name of an embedded DN that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 1" ref="IAP" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 2" ref="IAP2" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 3" ref="IAP3" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 4" ref="IAP4" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 5" ref="IAP5" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 6" ref="IAP6" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 7" ref="IAP7" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 8" ref="IAP8" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 9" ref="IAP9" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    <setting name="IAP Name 10" ref="IAP10" type="string">
+        <desc>
+	    	Name of the Connection Method that is bound to DN.
+	    	</desc>
+      </setting>
+    </setting>
+  </feature>
+<data>
+    <CSD_APs extensionPolicy="append">
+      <CSD_AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">ConfirmFirst</Seamlessness>
+      <PasswordAuthenticationType extensionPolicy="append">Normal</PasswordAuthenticationType>
+      <WTLS_Security extensionPolicy="append">On</WTLS_Security>
+      <WAP_ConnectionType extensionPolicy="append">Continuous</WAP_ConnectionType>
+      <BearerSpeed extensionPolicy="append">Autodetect</BearerSpeed>
+      <BearerCallTypeIsdn extensionPolicy="append">Analogue</BearerCallTypeIsdn>
+      <CallbackEnabled extensionPolicy="append">Yes</CallbackEnabled>
+      <CallbackType extensionPolicy="append">Server Number</CallbackType>
+      <EnableSWCompression extensionPolicy="append">No</EnableSWCompression>
+      <UseLoginScript extensionPolicy="append">No</UseLoginScript>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <UserName extensionPolicy="append" />
+      <PromptPassword extensionPolicy="append" />
+      <Password extensionPolicy="append" />
+      <WAPGatewayIP extensionPolicy="append" />
+      <StartingPage extensionPolicy="append" />
+      <PhoneIP extensionPolicy="append" />
+      <PrimaryNameServer extensionPolicy="append" />
+      <SecondaryNameServer extensionPolicy="append" />
+      <PrimaryIP6NameServer extensionPolicy="append" />
+      <SecondaryIP6NameServer extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <DefaultTelNumber extensionPolicy="append" />
+      <CallbackInfo extensionPolicy="append" />
+      <LoginScript extensionPolicy="append" />
+      <InitString extensionPolicy="append" />
+      </CSD_AP>
+    </CSD_APs>
+  <DNs extensionPolicy="append">
+      <DN extensionPolicy="append" template="true">
+        <Metadata extensionPolicy="append">User Defined</Metadata>
+      <Protection extensionPolicy="append">0</Protection>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Icon extensionPolicy="append">11</Icon>
+      <Name extensionPolicy="append" />
+      <DNId extensionPolicy="append" />
+      <EmbeddedDN extensionPolicy="append" />
+      <IAP extensionPolicy="append" />
+      <IAP2 extensionPolicy="append" />
+      <IAP3 extensionPolicy="append" />
+      <IAP4 extensionPolicy="append" />
+      <IAP5 extensionPolicy="append" />
+      <IAP6 extensionPolicy="append" />
+      <IAP7 extensionPolicy="append" />
+      <IAP8 extensionPolicy="append" />
+      <IAP9 extensionPolicy="append" />
+      <IAP10 extensionPolicy="append" />
+      </DN>
+    <DN extensionPolicy="append">
+        <Name extensionPolicy="append">Internet</Name>
+      <DNId extensionPolicy="append">1</DNId>
+      <Metadata extensionPolicy="append">Internet</Metadata>
+      <Protection extensionPolicy="append">2</Protection>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">Yes</Highlighted>
+      <Icon extensionPolicy="append">0</Icon>
+      <EmbeddedDN extensionPolicy="append" />
+      <IAP extensionPolicy="append" />
+      <IAP2 extensionPolicy="append" />
+      <IAP3 extensionPolicy="append" />
+      <IAP4 extensionPolicy="append" />
+      <IAP5 extensionPolicy="append" />
+      <IAP6 extensionPolicy="append" />
+      <IAP7 extensionPolicy="append" />
+      <IAP8 extensionPolicy="append" />
+      <IAP9 extensionPolicy="append" />
+      <IAP10 extensionPolicy="append" />
+      </DN>
+    <DN extensionPolicy="append">
+        <Name extensionPolicy="append">MMS</Name>
+      <DNId extensionPolicy="append">2</DNId>
+      <Metadata extensionPolicy="append">MMS</Metadata>
+      <Protection extensionPolicy="append">2</Protection>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">Yes</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Icon extensionPolicy="append">2</Icon>
+      <EmbeddedDN extensionPolicy="append" />
+      <IAP extensionPolicy="append" />
+      <IAP2 extensionPolicy="append" />
+      <IAP3 extensionPolicy="append" />
+      <IAP4 extensionPolicy="append" />
+      <IAP5 extensionPolicy="append" />
+      <IAP6 extensionPolicy="append" />
+      <IAP7 extensionPolicy="append" />
+      <IAP8 extensionPolicy="append" />
+      <IAP9 extensionPolicy="append" />
+      <IAP10 extensionPolicy="append" />
+      </DN>
+    <DN extensionPolicy="append">
+        <Name extensionPolicy="append">Operator</Name>
+      <DNId extensionPolicy="append">3</DNId>
+      <Metadata extensionPolicy="append">Operator</Metadata>
+      <Protection extensionPolicy="append">2</Protection>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Icon extensionPolicy="append">4</Icon>
+      <EmbeddedDN extensionPolicy="append" />
+      <IAP extensionPolicy="append" />
+      <IAP2 extensionPolicy="append" />
+      <IAP3 extensionPolicy="append" />
+      <IAP4 extensionPolicy="append" />
+      <IAP5 extensionPolicy="append" />
+      <IAP6 extensionPolicy="append" />
+      <IAP7 extensionPolicy="append" />
+      <IAP8 extensionPolicy="append" />
+      <IAP9 extensionPolicy="append" />
+      <IAP10 extensionPolicy="append" />
+      </DN>
+    </DNs>
+  <Global extensionPolicy="append">
+      <Attachmode extensionPolicy="append">whenavailable</Attachmode>
+    <DefaultDnIcon extensionPolicy="append">11</DefaultDnIcon>
+    <DefaultConnectionType extensionPolicy="append">Ask once</DefaultConnectionType>
+    <DefaultConnectionName extensionPolicy="append" />
+    <DefaultAP extensionPolicy="append" />
+    <WlanUseDefSettings extensionPolicy="append">1</WlanUseDefSettings>
+    <WlanBGScanInterval extensionPolicy="append">0</WlanBGScanInterval>
+    <WlanTxPowerLevel extensionPolicy="append">100</WlanTxPowerLevel>
+    <WlanRadioMeasurements extensionPolicy="append">1</WlanRadioMeasurements>
+    <WlanPowerMode extensionPolicy="append">1</WlanPowerMode>
+    <PriorityLan extensionPolicy="append">0</PriorityLan>
+    <PriorityWlan extensionPolicy="append">1</PriorityWlan>
+    <PriorityPan extensionPolicy="append">2</PriorityPan>
+    <PriorityGprsOut extensionPolicy="append">3</PriorityGprsOut>
+    <PriorityGprsIn extensionPolicy="append">4</PriorityGprsIn>
+    <PriorityCdma2k extensionPolicy="append">5</PriorityCdma2k>
+    <PriorityDialOut extensionPolicy="append">6</PriorityDialOut>
+    <PriorityDialIn extensionPolicy="append">7</PriorityDialIn>
+    <PriorityVpn extensionPolicy="append">253</PriorityVpn>
+    <PriorityMip extensionPolicy="append">254</PriorityMip>
+    <UIPriorityLan extensionPolicy="append">9</UIPriorityLan>
+    <UIPriorityWlan extensionPolicy="append">0</UIPriorityWlan>
+    <UIPriorityPan extensionPolicy="append">8</UIPriorityPan>
+    <UIPriorityGprsOut extensionPolicy="append">1</UIPriorityGprsOut>
+    <UIPriorityGprsIn extensionPolicy="append">2</UIPriorityGprsIn>
+    <UIPriorityCdma2k extensionPolicy="append">3</UIPriorityCdma2k>
+    <UIPriorityDialOut extensionPolicy="append">4</UIPriorityDialOut>
+    <UIPriorityDialIn extensionPolicy="append">5</UIPriorityDialIn>
+    <UIPriorityVpn extensionPolicy="append">6</UIPriorityVpn>
+    <UIPriorityMip extensionPolicy="append">7</UIPriorityMip>
+    <WlanLongRetry extensionPolicy="append">4</WlanLongRetry>
+    <WlanShortRetry extensionPolicy="append">7</WlanShortRetry>
+    <WlanRTS extensionPolicy="append">2347</WlanRTS>
+    <CsdLastSocketActivityTimeout extensionPolicy="append">300</CsdLastSocketActivityTimeout>
+    <CsdLastSessionClosedTimeout extensionPolicy="append">1</CsdLastSessionClosedTimeout>
+    <CsdLastSocketClosedTimeout extensionPolicy="append">300</CsdLastSocketClosedTimeout>
+    <WlanLastSocketActivityTimeout extensionPolicy="append">-1</WlanLastSocketActivityTimeout>
+    <WlanLastSessionClosedTimeout extensionPolicy="append">1</WlanLastSessionClosedTimeout>
+    <WlanLastSocketClosedTimeout extensionPolicy="append">-1</WlanLastSocketClosedTimeout>
+    <GprsLastSocketActivityTimeout extensionPolicy="append">-1</GprsLastSocketActivityTimeout>
+    <GprsLastSessionClosedTimeout extensionPolicy="append">1</GprsLastSessionClosedTimeout>
+    <GprsLastSocketClosedTimeout extensionPolicy="append">-1</GprsLastSocketClosedTimeout>
+    </Global>
+  <APs extensionPolicy="append">
+      <AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">ConfirmFirst</Seamlessness>
+      <NetworkType extensionPolicy="append">IPv4</NetworkType>
+      <PromptPassword extensionPolicy="append">No</PromptPassword>
+      <PasswordAuthenticationType extensionPolicy="append">Normal</PasswordAuthenticationType>
+      <WTLS_Security extensionPolicy="append">On</WTLS_Security>
+      <WAP_ConnectionType extensionPolicy="append">Continuous</WAP_ConnectionType>
+      <GprsUseEdge extensionPolicy="append">Yes</GprsUseEdge>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <GPRS_AP_Name extensionPolicy="append" />
+      <UserName extensionPolicy="append" />
+      <Password extensionPolicy="append" />
+      <WAPGatewayIP extensionPolicy="append" />
+      <StartingPage extensionPolicy="append" />
+      <PhoneIP extensionPolicy="append" />
+      <PrimaryNameServer extensionPolicy="append" />
+      <SecondaryNameServer extensionPolicy="append" />
+      <PrimaryIP6NameServer extensionPolicy="append" />
+      <SecondaryIP6NameServer extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <IspType extensionPolicy="append" />
+      </AP>
+    </APs>
+  <HSCSD_APs extensionPolicy="append">
+      <HSCSD_AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">ConfirmFirst</Seamlessness>
+      <PromptPassword extensionPolicy="append">No</PromptPassword>
+      <PasswordAuthenticationType extensionPolicy="append">Normal</PasswordAuthenticationType>
+      <WTLS_Security extensionPolicy="append">On</WTLS_Security>
+      <WAP_ConnectionType extensionPolicy="append">Continuous</WAP_ConnectionType>
+      <BearerSpeed extensionPolicy="append">Autodetect</BearerSpeed>
+      <BearerCallTypeIsdn extensionPolicy="append">Analogue</BearerCallTypeIsdn>
+      <CallbackEnabled extensionPolicy="append">Yes</CallbackEnabled>
+      <CallbackType extensionPolicy="append">Server Number</CallbackType>
+      <EnableSWCompression extensionPolicy="append">No</EnableSWCompression>
+      <UseLoginScript extensionPolicy="append">No</UseLoginScript>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <UserName extensionPolicy="append" />
+      <Password extensionPolicy="append" />
+      <WAPGatewayIP extensionPolicy="append" />
+      <StartingPage extensionPolicy="append" />
+      <PhoneIP extensionPolicy="append" />
+      <PrimaryNameServer extensionPolicy="append" />
+      <SecondaryNameServer extensionPolicy="append" />
+      <PrimaryIP6NameServer extensionPolicy="append" />
+      <SecondaryIP6NameServer extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <DefaultTelNumber extensionPolicy="append" />
+      <CallbackInfo extensionPolicy="append" />
+      <LoginScript extensionPolicy="append" />
+      <InitString extensionPolicy="append" />
+      </HSCSD_AP>
+    </HSCSD_APs>
+  <LAN_APs extensionPolicy="append">
+      <LAN_AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">Confirm first</Seamlessness>
+      <WTLS_Security extensionPolicy="append">On</WTLS_Security>
+      <WAP_ConnectionType extensionPolicy="append">Continuous</WAP_ConnectionType>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <WAPGatewayIP extensionPolicy="append" />
+      <StartingPage extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <LanIfNetworks extensionPolicy="append" />
+      <LanIpNetmask extensionPolicy="append" />
+      <LanIpGateway extensionPolicy="append" />
+      <PhoneIP extensionPolicy="append" />
+      <PrimaryNameServer extensionPolicy="append" />
+      <SecondaryNameServer extensionPolicy="append" />
+      <PrimaryIP6NameServer extensionPolicy="append" />
+      <SecondaryIP6NameServer extensionPolicy="append" />
+      </LAN_AP>
+    </LAN_APs>
+  <WLAN_APs extensionPolicy="append">
+      <WLAN_AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">ConfirmFirst</Seamlessness>
+      <NetworkMode extensionPolicy="append">Infrastructure</NetworkMode>
+      <SecurityMode extensionPolicy="append">Open</SecurityMode>
+      <WLANScanSSID extensionPolicy="append">No</WLANScanSSID>
+      <WEPKeyInUse extensionPolicy="append">key1</WEPKeyInUse>
+      <WEPAuthType extensionPolicy="append">Shared</WEPAuthType>
+      <WEPKey1Length extensionPolicy="append">64</WEPKey1Length>
+      <WEPKey1Format extensionPolicy="append">ASCII</WEPKey1Format>
+      <WEPKey2Length extensionPolicy="append">64</WEPKey2Length>
+      <WEPKey2Format extensionPolicy="append">ASCII</WEPKey2Format>
+      <WEPKey3Length extensionPolicy="append">64</WEPKey3Length>
+      <WEPKey3Format extensionPolicy="append">ASCII</WEPKey3Format>
+      <WEPKey4Length extensionPolicy="append">64</WEPKey4Length>
+      <WEPKey4Format extensionPolicy="append">ASCII</WEPKey4Format>
+      <WPAUseOfPresharedKey extensionPolicy="append">No</WPAUseOfPresharedKey>
+      <WPAKeyLength extensionPolicy="append">0</WPAKeyLength>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <NetworkName extensionPolicy="append" />
+      <StartingPage extensionPolicy="append" />
+      <PrimaryNameServer extensionPolicy="append" />
+      <SecondaryNameServer extensionPolicy="append" />
+      <PrimaryIP6NameServer extensionPolicy="append" />
+      <SecondaryIP6NameServer extensionPolicy="append" />
+      <WlanIpGatewayAddress extensionPolicy="append" />
+      <WlanIpNetMask extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <WlanChannelId extensionPolicy="append" />
+      <PhoneIP extensionPolicy="append" />
+      <WEPKey1Data extensionPolicy="append" />
+      <WEPKey2Data extensionPolicy="append" />
+      <WEPKey3Data extensionPolicy="append" />
+      <WEPKey4Data extensionPolicy="append" />
+      <WPAPresharedKey extensionPolicy="append" />
+      <WPAListOfEAPs extensionPolicy="append" />
+      <EapGtcUsername extensionPolicy="append" />
+      <EapGtcSessionValidityTime extensionPolicy="append" />
+      <EapGtcEncapsulation extensionPolicy="append" />
+      <EapTlsUsername extensionPolicy="append" />
+      <EapTlsRealm extensionPolicy="append" />
+      <EapTlsVerifyServerRealm extensionPolicy="append" />
+      <EapTlsRequireClientAuth extensionPolicy="append" />
+      <EapTlsSessionValidityTime extensionPolicy="append" />
+      <EapTlsCipherSuites extensionPolicy="append" />
+      <EapTlsUserCertSubjectKeyId extensionPolicy="append" />
+      <EapTlsUserCertIssuerName extensionPolicy="append" />
+      <EapTlsUserCertSerialNumber extensionPolicy="append" />
+      <EapTlsCaCertSubjectKeyId extensionPolicy="append" />
+      <EapTlsCaCertIssuerName extensionPolicy="append" />
+      <EapTlsCaCertSerialNumber extensionPolicy="append" />
+      <EapTlsEncapsulation extensionPolicy="append" />
+      <EapLeapUsername extensionPolicy="append" />
+      <EapLeapPassword extensionPolicy="append" />
+      <EapLeapSessionValidityTime extensionPolicy="append" />
+      <EapSimUsername extensionPolicy="append" />
+      <EapSimRealm extensionPolicy="append" />
+      <EapSimUsePseudonyms extensionPolicy="append" />
+      <EapSimSessionValidityTime extensionPolicy="append" />
+      <EapSimEncapsulation extensionPolicy="append" />
+      <EapTtlsUsername extensionPolicy="append" />
+      <EapTtlsRealm extensionPolicy="append" />
+      <EapTtlsVerifyServerRealm extensionPolicy="append" />
+      <EapTtlsRequireClientAuth extensionPolicy="append" />
+      <EapTtlsSessionValidityTime extensionPolicy="append" />
+      <EapTtlsCipherSuites extensionPolicy="append" />
+      <EapTtlsEncapsulatedTypes extensionPolicy="append" />
+      <EapTtlsUserCertSubjectKeyId extensionPolicy="append" />
+      <EapTtlsUserCertIssuerName extensionPolicy="append" />
+      <EapTtlsUserCertSerialNumber extensionPolicy="append" />
+      <EapTtlsCaCertSubjectKeyId extensionPolicy="append" />
+      <EapTtlsCaCertIssuerName extensionPolicy="append" />
+      <EapTtlsCaCertSerialNumber extensionPolicy="append" />
+      <EapAkaUsername extensionPolicy="append" />
+      <EapAkaRealm extensionPolicy="append" />
+      <EapAkaUsePseudonyms extensionPolicy="append" />
+      <EapAkaSessionValidityTime extensionPolicy="append" />
+      <EapAkaEncapsulation extensionPolicy="append" />
+      <EapPeapUsername extensionPolicy="append" />
+      <EapPeapRealm extensionPolicy="append" />
+      <EapPeapVerifyServerRealm extensionPolicy="append" />
+      <EapPeapRequireClientAuth extensionPolicy="append" />
+      <EapPeapSessionValidityTime extensionPolicy="append" />
+      <EapPeapCipherSuites extensionPolicy="append" />
+      <EapPeapV0Allowed extensionPolicy="append" />
+      <EapPeapV1Allowed extensionPolicy="append" />
+      <EapPeapV2Allowed extensionPolicy="append" />
+      <EapPeapEncapsulatedTypes extensionPolicy="append" />
+      <EapPeapUserCertSubjectKeyId extensionPolicy="append" />
+      <EapPeapUserCertIssuerName extensionPolicy="append" />
+      <EapPeapUserCertSerialNumber extensionPolicy="append" />
+      <EapPeapCaCertSubjectKeyId extensionPolicy="append" />
+      <EapPeapCaCertIssuerName extensionPolicy="append" />
+      <EapPeapCaCertSerialNumber extensionPolicy="append" />
+      <EapMschapv2Username extensionPolicy="append" />
+      <EapMschapv2Password extensionPolicy="append" />
+      <EapMschapv2SessionValidityTime extensionPolicy="append" />
+      <EapMschapv2Encapsulation extensionPolicy="append" />
+      <EapFastUsername extensionPolicy="append" />
+      <EapFastRealm extensionPolicy="append" />
+      <EapFastVerifyServerRealm extensionPolicy="append" />
+      <EapFastRequireClientAuth extensionPolicy="append" />
+      <EapFastSessionValidityTime extensionPolicy="append" />
+      <EapFastCipherSuites extensionPolicy="append" />
+      <EapFastEncapsulatedTypes extensionPolicy="append" />
+      <EapFastAuthProvModeAllowed extensionPolicy="append" />
+      <EapFastUnauthProvModeAllowed extensionPolicy="append" />
+      <EapFastWarnADHPNoPAC extensionPolicy="append" />
+      <EapFastWarnADHPNoMatchingPAC extensionPolicy="append" />
+      <EapFastWarnNotDefaultServer extensionPolicy="append" />
+      <EapFastUserCertSubjectKeyId extensionPolicy="append" />
+      <EapFastUserCertIssuerName extensionPolicy="append" />
+      <EapFastUserCertSerialNumber extensionPolicy="append" />
+      <EapFastCaCertSubjectKeyId extensionPolicy="append" />
+      <EapFastCaCertIssuerName extensionPolicy="append" />
+      <EapFastCaCertSerialNumber extensionPolicy="append" />
+      <Mschapv2Username extensionPolicy="append" />
+      <Mschapv2Password extensionPolicy="append" />
+      <Mschapv2SessionValidityTime extensionPolicy="append" />
+      <Mschapv2Encapsulation extensionPolicy="append" />
+      </WLAN_AP>
+    </WLAN_APs>
+  <VPN_APs extensionPolicy="append">
+      <VPN_AP extensionPolicy="append" template="true">
+        <Protected extensionPolicy="append">No</Protected>
+      <Hidden extensionPolicy="append">No</Hidden>
+      <HiddenAgent extensionPolicy="append">No</HiddenAgent>
+      <Highlighted extensionPolicy="append">No</Highlighted>
+      <Seamlessness extensionPolicy="append">ConfirmFirst</Seamlessness>
+      <ConnectionName extensionPolicy="append" />
+      <ConnectionId extensionPolicy="append" />
+      <ProxyServerAddress extensionPolicy="append" />
+      <ProxyPortNumber extensionPolicy="append" />
+      <ProxyProtocolName extensionPolicy="append" />
+      <IAP_Name extensionPolicy="append" />
+      <ServicePolicy extensionPolicy="append" />
+      </VPN_AP>
+    </VPN_APs>
+  <KCRUidCommsDatCreator extensionPolicy="append">
+      <KCommsDatCreatorStartupStatus extensionPolicy="append">0</KCommsDatCreatorStartupStatus>
+    <KCommsDatCreatorInputFileName extensionPolicy="append">VariantData_commsdat.xml</KCommsDatCreatorInputFileName>
+    </KCRUidCommsDatCreator>
+  </data>
+<rfs>
+    <KCRUidCommsDatCreator extensionPolicy="append">
+      <KCommsDatCreatorStartupStatus extensionPolicy="append">false</KCommsDatCreatorStartupStatus>
+    <KCommsDatCreatorInputFileName extensionPolicy="append">false</KCommsDatCreatorInputFileName>
+    </KCRUidCommsDatCreator>
+  </rfs>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/confml/predefinedcontacts.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,164 @@
+<configuration name="predefinedcontacts" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <feature name="Contacts" ref="Contacts">
+    <setting name="Contact" ref="Contact" type="sequence">
+      <setting name="first name" ref="FirstName" type="string" />
+    <setting name="last name" ref="LastName" type="string" />
+    <setting name="company" ref="Company" type="string" />
+    <setting name="job" ref="Job" type="string" />
+    <setting name="general" ref="General" type="string" />
+    <setting name="mobile" ref="Mobile" type="string" />
+    <setting name="video number" ref="VideoNo" type="string" />
+    <setting name="fax number" ref="Fax" type="string" />
+    <setting name="e-mail" ref="Email" type="string" />
+    <setting name="WvUserId" ref="WvUserId" type="string" />
+    <setting name="URL" ref="URL" type="string" />
+    <setting name="speed dial number" ref="SpeeddialNo" type="string" />
+    <setting name="speed dial number assgin" ref="SpeeddialNoAssign" type="string" />
+    </setting>
+  </feature>
+<feature name="GenconfmlIby" ref="GenconfmlIby">
+    <setting name="TargetPath" ref="TargetPath" type="string" />
+  </feature>
+<data>
+    <Contacts extensionPolicy="append">
+      <Contact extensionPolicy="append" template="true">
+        <FirstName extensionPolicy="append" />
+      <LastName extensionPolicy="append" />
+      <Company extensionPolicy="append" />
+      <Job extensionPolicy="append" />
+      <General extensionPolicy="append" />
+      <Mobile extensionPolicy="append" />
+      <VideoNo extensionPolicy="append" />
+      <Fax extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      <SpeeddialNo extensionPolicy="append" />
+      <SpeeddialNoAssign extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Hao</FirstName>
+      <LastName extensionPolicy="append">Rich</LastName>
+      <Company extensionPolicy="append">Neusoft</Company>
+      <Job extensionPolicy="append" />
+      <General extensionPolicy="append">011</General>
+      <Mobile extensionPolicy="append">022</Mobile>
+      <VideoNo extensionPolicy="append">033</VideoNo>
+      <Fax extensionPolicy="append">044</Fax>
+      <Email extensionPolicy="append">rich@neusoft.com</Email>
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      <SpeeddialNo extensionPolicy="append">2</SpeeddialNo>
+      <SpeeddialNoAssign extensionPolicy="append">videono</SpeeddialNoAssign>
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Kevin</FirstName>
+      <LastName extensionPolicy="append">Chong</LastName>
+      <Company extensionPolicy="append">Neusoft</Company>
+      <Job extensionPolicy="append">Engineer</Job>
+      <General extensionPolicy="append">11</General>
+      <Mobile extensionPolicy="append">22</Mobile>
+      <VideoNo extensionPolicy="append">33</VideoNo>
+      <Fax extensionPolicy="append">44</Fax>
+      <Email extensionPolicy="append">Kevin@neusoft.com</Email>
+      <SpeeddialNo extensionPolicy="append">3</SpeeddialNo>
+      <SpeeddialNoAssign extensionPolicy="append">mob</SpeeddialNoAssign>
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Feng</FirstName>
+      <LastName extensionPolicy="append">Chen</LastName>
+      <Company extensionPolicy="append">Neusoft</Company>
+      <General extensionPolicy="append">135</General>
+      <Mobile extensionPolicy="append" />
+      <VideoNo extensionPolicy="append" />
+      <Fax extensionPolicy="append">138</Fax>
+      <SpeeddialNo extensionPolicy="append">4</SpeeddialNo>
+      <SpeeddialNoAssign extensionPolicy="append">fax</SpeeddialNoAssign>
+      <Job extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Heng</FirstName>
+      <LastName extensionPolicy="append">Xia</LastName>
+      <Company extensionPolicy="append">HenNuo</Company>
+      <Job extensionPolicy="append">Manager</Job>
+      <General extensionPolicy="append">010</General>
+      <Mobile extensionPolicy="append">020</Mobile>
+      <VideoNo extensionPolicy="append">040</VideoNo>
+      <Fax extensionPolicy="append">030</Fax>
+      <Email extensionPolicy="append">wllx@neusoft.com</Email>
+      <SpeeddialNo extensionPolicy="append">5</SpeeddialNo>
+      <SpeeddialNoAssign extensionPolicy="append">email</SpeeddialNoAssign>
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Bo</FirstName>
+      <LastName extensionPolicy="append">Zhang</LastName>
+      <General extensionPolicy="append">110</General>
+      <Mobile extensionPolicy="append">120</Mobile>
+      <SpeeddialNo extensionPolicy="append">6</SpeeddialNo>
+      <SpeeddialNoAssign extensionPolicy="append" />
+      <Company extensionPolicy="append" />
+      <Job extensionPolicy="append" />
+      <VideoNo extensionPolicy="append" />
+      <Fax extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <SpeeddialNo extensionPolicy="append">9</SpeeddialNo>
+      <FirstName extensionPolicy="append" />
+      <LastName extensionPolicy="append" />
+      <Company extensionPolicy="append" />
+      <Job extensionPolicy="append" />
+      <General extensionPolicy="append" />
+      <Mobile extensionPolicy="append" />
+      <VideoNo extensionPolicy="append" />
+      <Fax extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      <SpeeddialNoAssign extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append">Codo</FirstName>
+      <LastName extensionPolicy="append">Kiki</LastName>
+      <Company extensionPolicy="append">Neusoft</Company>
+      <General extensionPolicy="append">32</General>
+      <Mobile extensionPolicy="append">54</Mobile>
+      <VideoNo extensionPolicy="append">65</VideoNo>
+      <Fax extensionPolicy="append">65</Fax>
+      <Job extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      <SpeeddialNo extensionPolicy="append" />
+      <SpeeddialNoAssign extensionPolicy="append" />
+      </Contact>
+    <Contact extensionPolicy="append">
+        <FirstName extensionPolicy="append" />
+      <LastName extensionPolicy="append" />
+      <Company extensionPolicy="append" />
+      <Job extensionPolicy="append" />
+      <General extensionPolicy="append" />
+      <Mobile extensionPolicy="append" />
+      <VideoNo extensionPolicy="append" />
+      <Fax extensionPolicy="append" />
+      <Email extensionPolicy="append" />
+      <WvUserId extensionPolicy="append" />
+      <URL extensionPolicy="append" />
+      <SpeeddialNo extensionPolicy="append" />
+      <SpeeddialNoAssign extensionPolicy="append" />
+      </Contact>
+    </Contacts>
+  <GenconfmlIby extensionPolicy="append">
+      <TargetPath extensionPolicy="append">\private\2000BEE5\</TargetPath>
+    </GenconfmlIby>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/implml/file1.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="Setting/Data.xml" target="output">
+  <setting ref="Setting/Settings"/>
+  <setting ref="Setting/ContentSettings"/>
+  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">
+    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+    <xsl:template match="configuration/data">
+      <Variant>
+        <xsl:copy-of select="Setting/Settings"/>
+        <xsl:copy-of select="Setting/ContentSettings"/>
+      </Variant>
+    </xsl:template>
+  </xsl:stylesheet>
+</file>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/implml/predefinedcontacts.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,31 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="predefinedcontacts.xml" target="\private\2000BEE5\">
+	<setting ref="Contacts/Contact"/>
+	<xsl:stylesheet version="1.0" 
+                xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
+                xmlns:xi="http://www.w3.org/2001/xinclude">
+		<xsl:output method="xml" indent="yes" encoding="UTF-8"/>
+		<xsl:template match="configuration/data">
+			<Variant>
+				<Contacts>
+					<xsl:for-each select="Contacts/Contact">
+						<Contact>
+							<FirstName><xsl:value-of select="FirstName"/></FirstName>
+							<LastName><xsl:value-of select="LastName"/></LastName>
+							<Company><xsl:value-of select="Company"/></Company>
+							<Job><xsl:value-of select="Job"/></Job>
+							<General><xsl:value-of select="General"/></General>
+							<Mobile><xsl:value-of select="Mobile"/></Mobile>
+							<VideoNo><xsl:value-of select="VideoNo"/></VideoNo>
+							<Fax><xsl:value-of select="Fax"/></Fax>
+							<Email><xsl:value-of select="Email"/></Email>
+							<WvUserId><xsl:value-of select="WvUserId"/></WvUserId>
+							<URL><xsl:value-of select="URL"/></URL>
+							<SpeeddialNo><xsl:value-of select="SpeeddialNo"/></SpeeddialNo>
+							<SpeeddialNoAssign><xsl:value-of select="SpeeddialNoAssign"/></SpeeddialNoAssign>
+						</Contact>
+					</xsl:for-each>
+				</Contacts>
+			</Variant>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/assets/s60/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<configuration name="unknown" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="confml/commsdatcreator.confml" />
+<xi:include href="confml/CVC_2DigitDialing.confml" />
+<xi:include href="confml/predefinedcontacts.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_2DigitDialing.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="2 Digit Dialing" ref="CVC_2DigitDialing">
+		<confml:desc>2 Digit Dialing.</confml:desc>
+		<confml:setting name="2 Digit Dialing" ref="CVC_2DigitDialing" type="boolean">
+			<confml:desc>2 Dialing. Default is disabled</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	<CVC_2DigitDialing>
+	<CVC_2DigitDialing>false</CVC_2DigitDialing>
+	</CVC_2DigitDialing>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ActiveIdleNotifiers.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Homescreen Notification components" ref="CVC_ActiveIdleNotifiers">
+      <confml:desc>Notification components: missed calls, new messages (device inbox), and new voice messages are located on one row of the device. It is possible to configure the notifiers on/off separately. If a notification component is turned off, the notifications are shown as traditional pop-up notifications.</confml:desc>  
+  <confml:setting name="E-mail notification" ref="CVC_ActiveIdleNotifiersEmail" type="boolean">
+      <confml:desc>Up to two different e-mail accounts for each mode can be configured to be visible on the Home screen. It is not possible to customize e-mail notifiers as they are only available when the e-mail account is first activated.</confml:desc>
+    </confml:setting>
+  <confml:setting name="Calendar and To-do notification" ref="CVC_ActiveIdleNotifiersCalendar" type="boolean">
+      <confml:desc>Calendar and To-do components provide dynamically updated information from Calendar entries and ToDo notes. If there is no data to show, "No calendar events for today" note is visible on the Home screen view.</confml:desc>
+    </confml:setting>
+ <confml:setting name="Music Player notification" ref="CVC_ActiveIdleNotifiersMusicPlayer" type="boolean">
+     <confml:desc>The Music Player component shows the music tracks that are being played by the Music Player. If there is no data to show, this UI area is empty.</confml:desc>
+   </confml:setting>
+ <confml:setting name="Visual Radio notification" ref="CVC_ActiveIdleNotifiersVisualRadio" type="boolean">
+     <confml:desc>The Visual radio plug-in shows the name or frequency of the radio channel that is being played by Visual radio in the background. The icon also shows whether Visual radio service is available for the current channel.</confml:desc>
+   </confml:setting>
+    <confml:setting name="WLAN notification" ref="CVC_ActiveIdleNotifiersWLAN" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="E-mail settings wizard" ref="CVC_ActiveIdleNotifiersEmailSettingsWizard" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Internet Сall setup" ref="CVC_ActiveIdleNotifiersInternetCallSetup" type="boolean">
+     <confml:desc>This plug-in provides easy access to Voice over IP settings wizard, providing options to launch Voice over IP setup wizard or hide the plug-in from the Home screen.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Mobile search" ref="CVC_ActiveIdleNotifiersMobileSearch" type="boolean">
+     <confml:desc>The Mobile search plug-in allows the user to initiate a search for content in the device or in the Internet directly from Home screen. User can click on the plug-in and write the search term.</confml:desc>
+   </confml:setting>
+    <confml:setting name="SIM Application Toolkit" ref="CVC_ActiveIdleNotifiersSIMApplicationToolkit" type="boolean">
+     <confml:desc>The SIM Application Toolkit shows messages from an application residing on the SIM card.</confml:desc>
+   </confml:setting>
+</confml:feature>
+<confml:data>
+<confml:CVC_ActiveIdleNotifiers>
+<confml:CVC_ActiveIdleNotifiersEmail>true</confml:CVC_ActiveIdleNotifiersEmail>
+<confml:CVC_ActiveIdleNotifiersCalendar>true</confml:CVC_ActiveIdleNotifiersCalendar>
+<confml:CVC_ActiveIdleNotifiersMusicPlayer>true</confml:CVC_ActiveIdleNotifiersMusicPlayer>
+<confml:CVC_ActiveIdleNotifiersVisualRadio>true</confml:CVC_ActiveIdleNotifiersVisualRadio>
+<confml:CVC_ActiveIdleNotifiersWLAN>true</confml:CVC_ActiveIdleNotifiersWLAN>
+<confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>true</confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>
+<confml:CVC_ActiveIdleNotifiersInternetCallSetup>true</confml:CVC_ActiveIdleNotifiersInternetCallSetup>
+<confml:CVC_ActiveIdleNotifiersMobileSearch>true</confml:CVC_ActiveIdleNotifiersMobileSearch>
+<confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>true</confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>
+</confml:CVC_ActiveIdleNotifiers>
+</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ActiveIdleOther.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Miscelaneous Homescreen settings" ref="CVC_ActiveIdleOther">
+  <confml:setting name="Homescreen Idle Easy Dialing" ref="CVC_ActiveIdleEasyDialing" type="boolean">
+      <confml:desc>Easy Dialing allows user to start dialling from Home Screen to a contact without first starting Phonebook application. The name input is predictive (subject to restrictions by input language), and the contacts are matched so that each character only requires one key press. Typing more narrows down the options. User is able to use the number that was just typed, or select one of the name matches.</confml:desc>
+    </confml:setting>
+    
+    
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CPHSALS.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="CPHS / ALS settings" ref="CVC_CPHSALS">
+		<confml:desc>CPHS is an extension to the GSM specification that adds several convenience and usability enhancements to the way GSM phones and SIM cards operate. Examples of CPHS enhancements include single-key access to a standard voicemail number stored on the SIM, and a message-waiting indicator to alert users to new voicemail messages. CPHS also provides carriers with greater control and flexibility over the carrier name that is displayed on the phone. CPHS also includes the ability to control certain network-based features from the phone interface, including call forwarding, call waiting, and caller-ID. CPHS is not an official part of the GSM specification. It was developed by the PCN Association rather than the GSM Association. Nonetheless, CPHS has been popular among carriers. Many European and American GSM carriers require it, and so newer GSM phones from most major manufacturers include CPHS functionality.</confml:desc>
+		<confml:setting name="CPHS / ALS mode" ref="CVC_CPHSALS" type="selection">
+			<confml:desc>If ALS is set as ON, the functionality of toggling from General to Silent profile by long press # key will be disabled. CPHS and ALS can be set ON and OFF in the customer variants of the standard transceiver. CPHS and ALS can never be both set ON at the same time.</confml:desc>
+      <confml:option name="Both OFF" value="off"/>
+      <confml:option name="CPHS" value="cphs"/>
+      <confml:option name="ALS" value="als"/>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CellInfoDisplay.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+<feature name="Cell Info Display" ref="CVC_CellInfoDisplay">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception)</desc>
+	<setting name="Cell Info Display" ref="CVC_CellInfoDisplay" type="boolean">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception). "On" when checked. Cell info display is "Off" by default in the standard transceiver. This setting is set "On" by default for countries in which the GSM regulatory authority requires it.</desc>
+  </setting>
+</feature>
+<data>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_CustomerMenu.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="CVC_Previewable">
+	<confml:feature name="Customer Menu" ref="CVC_OperatorMenu">
+		<confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter. The URL defines the xHTML Startup page that is shown when the Customer Menu application is launched, for example www.customername.com/index.html. The URL also defines the customer domain URL path, for example www.customername.com/. All user-browsed xHTML pages belonging to that path are automatically stored in the Customer Menu cache.The Customer Menu application can be configured as a shortcut just like any other application. In Main menu, the Customer Menu is placed by default to 11th position. When the Customer Menu is enabled, Help moves from position 11 to 12 and Apps moves from 12 to 13, which is not visible until the user scrolls the menu cursor.</confml:desc>
+		<confml:setting name="Customer Menu icon" ref="CVC_OperatorMenuIconFile" type="file">
+			<confml:desc>Customer menu icon that will be present in Application Grid. Size: 65 x 65 pixels. Format: SVGT (preferred) or BMP. Color depth: 24 bit</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon bitmask" ref="CVC_OperatorMenuIconMaskFile" type="file">
+			<confml:desc>Customer menu bitmask when using BMP menu icon. Size: 65 x 65 pixels. Format: BMP. Color depth: 8 bit</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon caption" ref="CVC_OperatorMenuIconCaption" type="string">
+			<confml:desc>The text caption for Customer Menu icon </confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu source URL" ref="CVC_OperatorMenuURL" type="string">
+			<confml:desc>Target URL for Operator Menu. The URL defines the xHTML Start-up page that will be shown when the Customer Menu application is launched (e.g. “www.customername.com/index.htmâ€). The URL also defines the customer domain URL path (e.g. “www.customername.comâ€).</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu cache" ref="CVC_OperatorMenuCache" type="folder">
+			<confml:desc>Data stored in the Customer Menu cache is preserved in the device memory and can be accessed even after the Browser session is ended and through power cycles of the device. File format: xHTML files. Customers provide the xHTML pages to be pre-installed in the Customer Menu Cache.The max. amount of data that can be stored in the Customer Menu cache is 300 KB</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer menu cache expiration date" ref="CVC_AppShellOperatorMenuCacheExpireDate" type="string">
+			<confml:desc>In “mm/yyyy†format. Customers define the expiration date of the xHTML page(s). After that date, the cache content will no longer be used and Operator icon will launch URL instead.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_InstantMessaging.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_instantmessaging">
+
+<feature name="Instant Messaging" ref="CVC_InstantMessaging">
+	<desc>IM (Instant Messaging) settings</desc>	
+	<setting name="Server name" ref="CVC_IMServerName" type="string">
+	<desc>Server name. Max 30 chars.</desc>
+  	</setting>
+  	<setting name="Access point in use" ref="CVC_IMAccessPointInUse" type="string">
+  	<desc>Max 100 chars.</desc>
+  	</setting>
+  	<setting name="Web address" ref="CVC_IMWebAddress" type="string">
+  	<desc>Max 50 chars.</desc>
+  	</setting>
+  	<setting name="User ID" ref="CVC_IMUserID" type="string">
+  	</setting>
+  	<setting name="Password " ref="CVC_IMPassword" type="string">
+  	</setting>
+  	<setting name="IM Presence" ref="CVC_IMPresence" type="selection">
+  		<option name="Active for all" value="all"/>
+		<option name="Active for contacts" value="contacts"/>
+		<option name="Not active" value="not"/>
+  	</setting>
+  	<setting name="Allow messages from" ref="CVC_IMAllowMessagesFrom" type="selection">
+  		<option name="All" value="all"/>
+		<option name="IM contacts only " value="contacts"/>
+		<option name="None" value="none"/>
+  	</setting>
+  	<setting name="Message  scrolling speed" ref="CVC_IMMessageScrollingSpeed" type="selection">
+  		<option name="Slow" value="Slow"/>
+		<option name="Medium" value="Medium"/>
+		<option name="Fast" value="Fast"/>
+  	</setting>
+  	<setting name="Sort IM contacts" ref="CVC_IMSortContacts" type="selection">
+  		<option name="Alphabetically" value="Alphabetically"/>
+		<option name="By online status" value="Bystatus"/>
+  	</setting>
+  	<setting name="Availability reloading" ref="CVC_IMAvailabilityReloading" type="selection">
+  		<option name="Automatic" value="Automatic"/>
+		<option name="Manual" value="Manual"/>
+  	</setting>
+  	<setting name="Offline contacts" ref="CVC_IMOfflineContacts" type="selection">
+  		<option name="Show" value="Show"/>
+		<option name="Hide" value="Hide"/>
+  	</setting>
+  	<setting name="Own message colour" ref="CVC_IMOwnMessageColour" type="string">
+  	</setting>
+  	<setting name="Received message colour" ref="CVC_IMReceivedMessageColour" type="string">
+  	</setting>
+  	<setting name="Show date/ time info" ref="CVC_IMShowDateTimeInfo" type="selection">
+  		<option name="Yes" value="Yes"/>
+		<option name="No" value="No"/>
+  	</setting>
+  	<setting name="IM alert tone" ref="CVC_IMAlertTone" type="file">
+		<desc>Alert tone for Instant Messaging.</desc>
+	</setting>
+  	<setting name="Default Server" ref="CVC_IMDefaultServer" type="string">
+  	</setting>
+  	<setting name="Presence login type" ref="CVC_IMPresenceLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network On app." value="autohome"/>
+		<option name="Start-up Manual" value="manual"/>
+  	</setting>
+  	<setting name="IM login type" ref="CVC_IMLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network" value="autohome"/>
+		<option name="Start-up" value="start"/>
+		<option name="Manual" value="manual"/>
+  	</setting>
+</feature>
+ <data>
+ </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_NokiaPCInternetAccess.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Nokia PC Internet Access" ref="CVC_NokiaPCInternetAccess">
+<desc>Customizations of PC application "Nokia PC Internet Access"</desc>
+    <setting name="Customer logo file" ref="CVC_NokiaPCInternetAccessFile" type="file">
+      <desc>Customer logo file. Format: Portable Network Graphics with transparent background. Size 280x40.</desc>
+    </setting>
+
+		<setting name="Customer defined URL" ref="CVC_NokiaPCInternetAccessURL" type="string">
+			<desc>NPCIA autolaunches the default web browser of the PC. Default starting page of the browser can be set through NPCIA (when browser is launched by NPCIA)</desc>
+		</setting>
+
+		<setting name="Customer Care contact info" ref="CVC_NokiaPCInternetAccessCustomerCareInfo" type="string">
+			<desc>Located in in NPCIAs’ ‘Settings’ view. Can be phone number and/or link to operator webpage.</desc>
+		</setting>
+		
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_OperatorLogo.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Operator Logo" ref="CVC_OperatorLogo">
+<desc>The Nokia E75 supports color logos in addition to the traditional black and white customer logos. Customer logos may be predefined in the default settings for the device or downloaded by the user. The customer logo is stored together with the MNC and MCC info of the home network in the device and will be displayed when the user is in the home network. The customer logo replaces the standard customer name.</desc>
+    <setting name="Operator Logo File" ref="CVC_OperatorLogoPath" type="file">
+      <desc>Operator logo file. Format: BMP or SVG. Maximum size 134x33 pixels. Name must be Logo_MCC_MNC_PROG.svg or Logo_MCC_MNC_PROG.bmp, where MCC and MNC are mobile country code and mobile network code.</desc>
+    </setting>
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_Preinstalled.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,117 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+	<feature name="Pre-installed Content" ref="CVC_PreinstalledContent">
+		<desc>Customer-defined pre-installed content. Please note that the total size of the User Data Area content size must not exceed 5 Mbytes.</desc>
+		<setting maxOccurs="6" name="Pre-Installed MMS Messages" ref="CVC_PreInstalledMMSs" type="sequence">
+			<desc>Max 6 mms, max size 35K. Binary format (encoding according to MMS encapsulation specification)</desc>
+			<setting name="Pre-Installed MMS" ref="CVC_PreInstalledMMS" type="file">
+				<desc>Pre-Installed MMS</desc>
+			</setting>
+		</setting>
+		<setting name="Pre-Installed Images" ref="CVC_PreInstalledImagesFolder" type="folder">
+			<desc>Pre-Installed Images. Size up to 5MP (2560x1920 pixels), format JPEG. No EXIF data allowed</desc>
+		</setting>
+		<setting name="Pre-Installed Streaming links" ref="CVC_PreInstalledStreamingLinksFolder" type="folder">
+			<desc>Pre-Installed Streaming links. Format is .ram file.</desc>
+		</setting>
+		<setting name="Pre-Installed Music Clips" ref="CVC_PreInstalledMusicClipsFolder" type="folder">
+			<desc>Pre-Installed Music Clips.</desc>
+		</setting>
+		<setting name="Pre-Installed Video Clips" ref="CVC_PreInstalledVideoClipsFolder" type="folder">
+			<desc>Pre-Installed Video Clips.</desc>
+		</setting>
+		<setting name="Default ringtone in General Profile" ref="CVC_DefaultRingtoneFile" type="file">
+			<desc>Default Ringtone in General Profile. Any supported media file.</desc>
+		</setting>
+		<setting name="Default Message Alert tone in General Profile" ref="CVC_DefaultMessageToneFile" type="file">
+			<desc>Default ringtone for incoming message event in General Profile. Any supported media file.</desc>
+		</setting>
+		<setting name="Default Video Call tone in General Profile" ref="CVC_DefaultVideoCallToneFile" type="file">
+			<desc>Default ringtone for video call event in General Profile. Any supported media file.</desc>
+		</setting>
+		<setting name="Pre-Installed Themes" ref="CVC_PreInstalledThemesFolder" type="folder">
+			<desc>Pre-Installed Themes. Format is Theme project archive zip file with extesion .tpf, containing the theme project and main .tdf file.</desc>
+		</setting>
+		<setting name="Application pre-Installed to User Data Area" ref="CVC_PreInstalledUDAApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+		</setting>
+		<setting name="Application pre-Installed to Memory Card" ref="CVC_PreInstalledMMCApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian	sisgned .sis file or Java MIDP .jar + .jad. Ensure that application	did pass Simbian Signed or Java Verified acceptance.</desc>
+		</setting>
+		<setting name="Pre-loaded (bundled) application installable by end-user." ref="CVC_BundledApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-loaded to device. Offerecd for installation to the end-user. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+		</setting>
+		<setting name="Symbian Certificates" ref="CVC_CertificatesSymbian" type="sequence">
+			<desc>Symbian certificates for trusted software installations.
+			</desc>
+			<setting name="Symbian Certificate file" ref="CVC_SymbianCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.</desc>
+			</setting>
+			<setting name="Trusted installation of native Symbian OS applications" ref="CVC_AllowSWInstall" type="boolean">
+				<desc>Allows installation of native Symbian OS applications (on/off)</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+		<setting name="Java MIDP2 Certificates" ref="CVC_CertificatesMIDP" type="sequence">
+			<desc>Java MIDP certificates for trusted software installations.
+			</desc>
+			<setting name="Java Certificate file" ref="CVC_JavaCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.
+				</desc>
+			</setting>
+			<setting name="Trusted Domain" ref="CVC_TrustedDomain" type="selection">
+				<desc>Trusted application domain: Customer or Third-party.
+				</desc>
+				<option name="Customer" value="Customer"/>
+				<option name="Third Party" value="Third Party"/>
+			</setting>
+		</setting>
+		<setting name="Internet Certificates" ref="CVC_CertificatesInternet" type="sequence">
+			<desc>Certificates for Internet services: SSL/TLS (HTTPS,SecureIMAP, etc.) connections.</desc>
+			<setting name="Internet Certificate file" ref="InternetCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.
+				</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+	</feature>
+
+<data>
+
+
+<CVC_PreinstalledContent>
+
+
+<CVC_PreInstalledImagesFolder>
+</CVC_PreInstalledImagesFolder>
+
+<CVC_PreInstalledStreamingLinksFolder>
+</CVC_PreInstalledStreamingLinksFolder>
+
+<CVC_PreInstalledMusicClipsFolder>
+</CVC_PreInstalledMusicClipsFolder>
+
+<CVC_PreInstalledVideoClipsFolder>
+</CVC_PreInstalledVideoClipsFolder>
+
+<CVC_PreInstalledThemesFolder>
+</CVC_PreInstalledThemesFolder>
+
+<CVC_PreInstalledUDAApplicationsFolder>
+</CVC_PreInstalledUDAApplicationsFolder>
+
+<CVC_PreInstalledMMCApplicationsFolder>
+</CVC_PreInstalledMMCApplicationsFolder>
+
+<CVC_BundledApplicationsFolder>
+</CVC_BundledApplicationsFolder>
+
+</CVC_PreinstalledContent>
+
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_RightSoftkey.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Right Softkey Customization" ref="CVC_RSK">
+    <confml:desc>The right soft key (RSK) in idle mode can be configured to launch a customer defined application or URL. The RSK label can be branded with a graphic only if it is a URL. The left soft key (LSK) is always a text string and is not customizable. The end user is able to personalize both the left and right soft keys.</confml:desc>
+    <confml:setting name="Right Softkey Customization" ref="CVC_ActiveIdleRSKCustomization" type="boolean">
+      <confml:desc>Right Softkey Customization</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey caption" ref="CVC_ActiveIdleRSKText" type="string">
+      <confml:desc>Right Softkey caption text (if RSK is not customized as image). 12 characters max (5 for Chinese variants).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey image" ref="CVC_ActiveIdleRSKImage" type="file">
+      <confml:desc>Size: 115 x 22 pixels Format: SVGT (preferred) or BMP</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey image BMP mask" ref="CVC_ActiveIdleRSKImageBMPMask" type="file">
+      <confml:desc>Right softkey BMP mask. Applicable only if BMP format is used.</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey target URL" ref="CVC_ActiveIdleRSKTargetURL" type="string">
+      <confml:desc>Right Softkey target URL (if target is defined as a web site).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey target Application UID" ref="CVC_ActiveIdleRSKTargetAppUID" type="string">
+      <confml:desc>Right Softkey target Application UID (if target is an application). Format is a hexadecimal number (0x00000000).</confml:desc>
+    </confml:setting>
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_StartupShutdownAnimations.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="Operator Startup Animation">
+	<confml:feature name="Operator Startup Animation" ref="CVC_StartupAnimationSequence">
+		<confml:desc>Startup animation. The customer specific startup element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Startup Animation Duration, seconds" ref="CVC_StartupAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Startup Audio" ref="CVC_StartupAnimationTone" type="file">
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+
+		</confml:setting>
+		<confml:setting name="Startup Frames Location" ref="CVC_StartupFrameLocation" type="folder">
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:feature name="Operator Shutdown Animation" ref="CVC_ShutdownAnimationSequence">
+		<confml:desc>Shutdown animation. The customer specific shutdown element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Shutdown Animation Duration" ref="CVC_ShutdownAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Shutdown Audio" ref="CVC_ShutdownAnimationTone" type="file">
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Shutdown Frames Location" ref="CVC_ShutdownFrameLocation" type="folder">
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+		<confml:CVC_StartupAnimationSequence>
+			<confml:CVC_StartupAnimationDuration>3000</confml:CVC_StartupAnimationDuration>
+			<confml:CVC_StartupAnimationTone>
+			</confml:CVC_StartupAnimationTone>
+			<confml:CVC_StartupFrameLocation>
+			</confml:CVC_StartupFrameLocation>
+		</confml:CVC_StartupAnimationSequence>
+		<confml:CVC_ShutdownAnimationSequence>
+			<confml:CVC_ShutdownAnimationDuration>3000</confml:CVC_ShutdownAnimationDuration>
+			<confml:CVC_ShutdownAnimationTone>
+			</confml:CVC_ShutdownAnimationTone>
+			<confml:CVC_ShutdownFrameLocation>
+			</confml:CVC_ShutdownFrameLocation>
+		</confml:CVC_ShutdownAnimationSequence>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_Streaming.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_streaming">
+	<feature name="Streaming Settings" ref="CVC_streaming">
+		<desc>Streaming Settings</desc>
+		<setting name="Use proxy" ref="CVC_streamingUseProxy" type="selection">
+			<desc>Use proxy for streaming</desc>
+			<option name="Yes" value="Yes"/>
+			<option name="No" value="No"/>
+		</setting>
+		<setting name="Proxy server address" ref="CVC_streamingProxyServerAddress" type="string">
+			<desc>Programmed (max.length 1000 characters)</desc>
+		</setting>
+		<setting name="Proxy port number" ref="CVC_streamingProxyPortNumber" type="int">
+			<desc>Programmed (1-9999)</desc>
+		</setting>
+		<setting name="Default access point" ref="CVC_streamingAccessPoint" type="string">
+			<desc>Programmed (max.length 100 characters)</desc>
+		</setting>
+		<setting name="Online time" ref="CVC_streamingOnlineTime" type="selection">
+			<desc>Limit for online time spent in streaming</desc>			
+			<option name="Unlimited" value="Unlimited"/>
+			<option name="User defined" value="UD"/>
+		</setting>
+		<setting name="User defined time" ref="CVC_streamingOnlineTimeValue" type="int">
+			<desc>User-selectable value for online streaming time (if limiting is enabled)</desc>
+			<desc>(1 – 30 minutes)</desc>
+		</setting>
+		<setting name="Lowest UDP port" ref="CVC_streamingLowestUDPPort" type="int">
+			<desc>1024 (equal or smaller than Highest UDP port) (default 6970)</desc>
+		</setting>
+		<setting name="Highest UDP port" ref="CVC_streamingHighestUDPPort" type="int">
+			<desc>65535 (equal or bigger than Lowest UDP port)(default 32000)</desc>
+		</setting>
+		<setting name="GPRS bandwidth" ref="CVC_streamingGPRSBandwidth" type="selection">
+			<desc>GPRS bandwidth limit for streaming</desc>
+			<option name="9.05 kbit/s" value="9"/>
+			<option name="13.40 kbit/s" value="13"/>
+			<option name="18.10 kbit/s" value="18"/>
+			<option name="27.15 kbit/s" value="27"/>
+			<option name="40.20 kbit/s" value="40"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined GPRS bandwidth" ref="CVC_streamingGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 99.99 kbps)</desc>
+		</setting>
+		<setting name="EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidth" type="selection">
+			<desc>EGPRS bandwidth limit for streaming</desc>
+			<option name="44.80 kbit/s" value="44"/>
+			<option name="59.20 kbit/s" value="59"/>
+			<option name="89.60 kbit/s" value="89"/>
+			<option name="108.80 kbit/s" value="108"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 199.99 kbps)</desc>
+		</setting>
+		<setting name="UMTS bandwidth" ref="CVC_streamingUMTSBandwidth" type="selection">
+			<desc>UMTS bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined UMTS bandwidth" ref="CVC_streamingUMTSBandwidthValue" type="real">
+			<desc>User defined (5 – 999.99 kbps)</desc>
+		</setting>
+		<setting name="WLAN bandwidth" ref="CVC_streamingWLANBandwidth" type="selection">
+			<desc>WLAN bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="768.00 kbit/s" value="768"/>
+			<option name="1.05 Mbit/s" value="1050"/>
+			<option name="1.43 Mbit/s" value="1430"/>
+			<option name="1.92 Mbit/s" value="1920"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined WLAN bandwidth" ref="CVC_streamingWLANBandwidthValue" type="real">
+			<desc>User defined (kbps)</desc>
+		</setting>
+		<setting name="HSDPA bandwidth" ref="CVC_streamingHSDPABandwidth" type="selection">
+			<desc>HSDPA bandwidth limit for streaming</desc>
+			<option name="600.00 kbit/s" value="600"/>
+			<option name="1.20 Mbit/s" value="1200"/>
+			<option name="1.80 Mbit/s" value="1800"/>
+			<option name="2.40 Mbit/s" value="2400"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="3.60 Mbit/s" value="3600"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined HSDPA bandwidth" ref="CVC_streamingHSDPABandwidthValue" type="real">
+			<desc>User defined (5 – 3999.99 kbps)</desc>
+		</setting>
+	</feature>
+	<data>
+		<CVC_streaming>
+			<CVC_streamingUseProxy>No</CVC_streamingUseProxy>
+			<CVC_streamingProxyServerAddress/>
+			<CVC_streamingProxyPortNumber>554</CVC_streamingProxyPortNumber>
+			<CVC_streamingAccessPoint/>
+			<CVC_streamingOnlineTime>Unlimited</CVC_streamingOnlineTime>
+			<CVC_streamingOnlineTimeValue>1</CVC_streamingOnlineTimeValue>
+			<CVC_streamingLowestUDPPort>6970</CVC_streamingLowestUDPPort>
+			<CVC_streamingHighestUDPPort>32000</CVC_streamingHighestUDPPort>
+			<CVC_streamingGPRSBandwidth>40</CVC_streamingGPRSBandwidth>
+			<CVC_streamingGPRSBandwidthValue>5</CVC_streamingGPRSBandwidthValue>
+			<CVC_streamingEGPRSBandwidth>89</CVC_streamingEGPRSBandwidth>
+			<CVC_streamingEGPRSBandwidthValue>5</CVC_streamingEGPRSBandwidthValue>
+			<CVC_streamingUMTSBandwidth>384</CVC_streamingUMTSBandwidth>
+			<CVC_streamingUMTSBandwidthValue>5</CVC_streamingUMTSBandwidthValue>
+			<CVC_streamingWLANBandwidth>1430</CVC_streamingWLANBandwidth>
+			<CVC_streamingWLANBandwidthValue>5</CVC_streamingWLANBandwidthValue>
+			<CVC_streamingHSDPABandwidth>user</CVC_streamingHSDPABandwidth>
+			<CVC_streamingHSDPABandwidthValue>5</CVC_streamingHSDPABandwidthValue>
+		</CVC_streaming>
+	</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_SyncML.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_SyncML">
+	<feature name="SyncML Settings" ref="CVC_SyncML">
+		<desc>SyncML Settings.</desc>
+		<setting name="Sync profile name" ref="CVC_SMLSyncProfileName" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+		<setting name="Server version" ref="CVC_SMLServerVersion" type="selection">
+			<desc>1.1, 1.2 (default)</desc>
+			<option name="1.2" value="1.2"/>
+			<option name="1.1" value="1.1"/>
+		</setting>
+		<setting name="Server ID" ref="CVC_SMLServerID" type="string">
+			<desc>Server ID</desc>
+		</setting>
+		<setting name="Data bearer" ref="CVC_SMLDataBearer" type="selection">
+			<desc>Data bearer for server connection</desc>
+			<option name="Internet" value="Internet"/>
+			<option name="Bluetooth" value="BT"/>
+		</setting>
+<!-- if Data bearer = internet-->
+		<setting name="Access point" ref="CVC_SMLAccessPoint" type="selection">
+			<desc>Access point to use for server connetion</desc>
+			<option name="Always ask" value="ask"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="Host Address" ref="CVC_SMLHostAddress" type="string">
+			<desc>Maximum length 150 characters.</desc>
+		</setting>
+		<setting name="Port" ref="CVC_SMLPort" type="int">
+			<desc>80 (default), 1-65535</desc>
+		</setting>
+		<setting name="User name" ref="CVC_SMLUserName" type="string">
+			<desc>Server account: username</desc>
+		</setting>
+		<setting name="Password" ref="CVC_SMLPassword" type="string">
+			<desc>Server account: password</desc>
+		</setting>
+		<setting name="Allow sync requests" ref="CVC_SMLAllowSyncRequests" type="selection">
+			<desc>Policy for sync requests</desc>
+			<option name="Automatically accept" value="auto"/>
+			<option name="Ask first" value="ask"/>
+			<option name="Not allowed" value="no"/>
+		</setting>
+		<setting name="Network user name" ref="CVC_SMLNetworkUserName" type="string">
+			<desc>Username for Access Point connection</desc>
+		</setting>
+		<setting name="Network password" ref="CVC_SMLNetworkPassword" type="string">
+			<desc>Password for Access Point connection</desc>
+		</setting>
+		<setting name="Syncronisation type" ref="CVC_SMLSyncronisationType" type="selection">
+			<desc>Type of syncronization</desc>
+			<option name="Both ways" value="both"/>
+			<option name="To server only" value="server"/>
+			<option name="To phone only" value="phone"/>
+		</setting>
+	</feature>
+	
+	<feature name="SyncML Data Syncronization" ref="CVC_SyncMLDataSync">
+
+		<setting name="Syncronize Contacts" ref="CVC_SyncMLContacts" type="boolean">
+			<desc>Include Contacts in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Calendar" ref="CVC_SyncMLCalendar" type="boolean">
+			<desc>Include Calendar in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Notes" ref="CVC_SyncMLNotes" type="boolean">
+			<desc>Include Notes in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize E-mail" ref="CVC_SyncMLSyncEmail" type="boolean">
+			<desc>Include E-mail in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Music" ref="CVC_SyncMLMusicMetadata" type="boolean">
+			<desc>Include Music in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize MSyncService" ref="CVC_SyncMLMSyncService" type="boolean">
+			<desc>Include MSyncService in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Images" ref="CVC_SyncMLImage" type="boolean">
+			<desc>Include Images in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Synchronize MMS" ref="CVC_SyncMLMMS" type="boolean">
+			<desc>Include MMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Video" ref="CVC_SyncMLVideo" type="boolean">
+			<desc>Include Video in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize SMS" ref="CVC_SyncMLSMS" type="boolean">
+			<desc>Include SMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Bookmarks" ref="CVC_SyncMLBookmarks" type="boolean">
+			<desc>Include Bookmarks in Sync ON/OFF</desc>
+		</setting>
+	</feature>
+
+
+
+
+	<feature name="SyncML Remote Databases" ref="CVC_SyncMLDataSyncRemoteDatabases">
+
+		<setting name="Remote database for Contacts" ref="CVC_SyncMLDataSyncRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Calendar" ref="CVC_SyncMLCalendarRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Notes" ref="CVC_SyncMLNotesRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for E-mail" ref="CVC_SyncMLSyncEmailRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Music" ref="CVC_SyncMLMusicMetadataRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MSyncService" ref="CVC_SyncMLMSyncServiceRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Images" ref="CVC_SyncMLImageRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MMS" ref="CVC_SyncMLMMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Video" ref="CVC_SyncMLVideoRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for SMS" ref="CVC_SyncMLSMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Bookmarks" ref="CVC_SyncMLBookmarksRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+	</feature>
+
+
+<data>
+<CVC_SyncML>
+<CVC_SMLPort>80</CVC_SMLPort>
+</CVC_SyncML>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ThemeWallpaperScreensaver.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+
+  <feature name="Default Theme" ref="CVC_Theme_ref">
+    <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+    <setting name="Default Theme" ref="CVC_DefaultTheme_ref" type="file">
+      <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+    </setting>
+  </feature>
+
+    <feature name="Wallpaper" ref="CVC_Wallpaper">
+    <desc>Default wallpaper</desc>
+    <setting name="Wallpaper" ref="CVC_WallpaperFile" type="file">
+      <desc>Size: 240X234 pixels Format: SVGT (preferred) or BMP. 24 bit. The end user can select to change this to either a different single image or select multiple images to run in a wallpaper slide show.</desc>
+    </setting>
+  </feature>
+
+  <feature name="Screensaver" ref="CVC_Screensaver">
+    <desc>Screensaver</desc>
+    <setting name="Screensaver File" ref="CVC_ScreensaverFile" type="file">
+      <desc>Screensaver file. Format is animated GIF.</desc>
+    </setting>
+    <setting name="Animation Timeout (mins)" ref="CVC_AnimationTimeout" type="int">
+      <desc>Duration the animation will run before reverting to default screensaver in minutes. Min 1 minute, max 30 minutes.</desc>
+    </setting>
+    <setting name="Lights Timeout (secs)" ref="CVC_LightsTimeout" type="int">
+      <desc>Duration of display lights being turned on while the animation runs in seconds. 0 = no lights, max 30 seconds.</desc>
+    </setting>
+  </feature>
+<data>
+<CVC_Screensaver>
+<CVC_AnimationTimeout>3</CVC_AnimationTimeout>
+<CVC_LightsTimeout>15</CVC_LightsTimeout>
+</CVC_Screensaver>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_VoiceMailbox.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="Voice Mailbox Number " ref="CVC_VoiceMailboxNumbers">
+		<confml:desc>The device number of the customer’s voice mailbox may be programmed into the device during production or in service. Voice mailbox feature may be activated in two different ways: CSP (Customer Service Profile) support is enabled in product profile AND voice mailbox numbers can be found from customer’s SIM card</confml:desc>
+		<confml:setting name="Number for primary ALS line" ref="CVC_VoiceMailboxNumberPrimaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Number for secondary ALS line" ref="CVC_VoiceMailboxNumberSecondaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+    </confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/CVC_ZeroPlusSend.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="0+ Send" ref="CVC_ZeroPlusSend">
+		<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks.</confml:desc>
+		<confml:setting name="0+ Send" ref="CVC_ZeroPlusSend" type="boolean">
+			<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks. Default is off.</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/confml/cvc_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xlink="http://www.w3.org/1999/xlink">
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/cvc/cvc_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="confml/CVC_2DigitDialing.confml"/>
+  <xi:include href="confml/CVC_ActiveIdleNotifiers.confml"/>
+  <xi:include href="confml/CVC_ActiveIdleOther.confml"/>
+  <xi:include href="confml/CVC_CellInfoDisplay.confml"/>
+  <xi:include href="confml/CVC_CPHSALS.confml"/>
+  <xi:include href="confml/CVC_CustomerMenu.confml"/>
+  <xi:include href="confml/CVC_InstantMessaging.confml"/>
+  <xi:include href="confml/CVC_NokiaPCInternetAccess.confml"/>
+  <xi:include href="confml/CVC_OperatorLogo.confml"/>
+  <xi:include href="confml/CVC_Preinstalled.confml"/>
+  <xi:include href="confml/CVC_RightSoftkey.confml"/>
+  <xi:include href="confml/CVC_StartupShutdownAnimations.confml"/>
+  <xi:include href="confml/CVC_Streaming.confml"/>
+  <xi:include href="confml/CVC_SyncML.confml"/>
+  <xi:include href="confml/CVC_ThemeWallpaperScreensaver.confml"/>
+  <xi:include href="confml/CVC_VoiceMailbox.confml"/>
+  <xi:include href="confml/CVC_ZeroPlusSend.confml"/>
+  <xi:include href="confml/cvc_view.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+<configuration name="data" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/product/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+<configuration name="unknown" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/family/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="5250" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="confml/data.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/product.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<configuration name="product" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="assets/s60/root.confml" />
+<xi:include href="family/root.confml" />
+<xi:include href="family/product/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+  <xi:include href="Layer1/root.confml#/"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root2.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="Layer1/root.confml#/"/>
+  <xi:include href="Layer2/root.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root3.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="Layer1/root.confml#/"/>
+  <xi:include href="Layer2/root.confml#/"/>
+  <xi:include href="Layer3/root.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root4.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/1 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="Layer1/root.confml#/"/>
+  <xi:include href="Layer2/root.confml#/"/>
+  <xi:include href="Layer3/root.confml#/"/>
+  <xi:include href="Layer4/root.confml#/"/>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/project/root_cvc.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="product1" version="0.1">
+  <xi:include href="assets/s60/root.confml#/"/>
+  <xi:include href="family/root.confml#/"/>
+  <xi:include href="family/product/root.confml#/"/>
+  <confml:meta>
+    <confml:customer>Customer-independent</confml:customer>
+    <confml:date>2008-11-21</confml:date>
+    <confml:editor>Me</confml:editor>
+    <confml:id>cvc</confml:id>
+    <confml:owner>Me</confml:owner>
+    <confml:platform>S60</confml:platform>
+    <confml:product>P1</confml:product>
+    <confml:release>PR0</confml:release>
+    <confml:status>Draft</confml:status>
+    <confml:version>0.1</confml:version>
+  </confml:meta>
+  <confml:desc>Custom ConfMLs for P1</confml:desc>
+  <xi:include href="cvc/cvc_root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_confflattener.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,119 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+import copy
+
+import __init__	
+from genconfmlplugin import confflattener
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'project')
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+class TestGenconfmlPlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+        
+    def test_flat(self):
+        '''
+        Test that the configuration flattening works
+        '''
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        flat = p.create_configuration('flat.confml')
+        dview = config.get_default_view()
+        for fea in dview.get_features('**'):
+            newfea = copy.copy(fea._obj)
+            flat.add_feature(newfea, fea.namespace)
+        toview = flat.get_default_view()
+        for fea in toview.get_features('**'):
+            fromfea = dview.get_feature(fea.fqr)
+            if fromfea.get_value() != None:
+                fea.set_value(fromfea.get_value())
+        flat.close()
+        config.close()
+        
+        config = p.get_configuration('product.confml')
+        flat = p.get_configuration('flat.confml')
+        fdview = flat.get_default_view()
+        for fea in config.get_default_view().get_features('**'):
+            self.assertEquals(fea.get_value(),fdview.get_feature(fea.fqr).get_value())
+        
+        pass
+
+    def test_flat2(self):
+        '''
+        Test that the configuration flattening works
+        '''
+        fs = filestorage.FileStorage(testdata,"a")
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        confflat = confflattener.ConfigurationFlattener()
+        confflat.create_configuration(config, ['DNs/**'],"tempfile2.confml")
+        config = p.get_configuration('root_cvc.confml')
+        dview = config.get_default_view()
+        flat = p.get_configuration('tempfile2.confml')
+        fdview = flat.get_default_view()
+        for fea in fdview.get_features('**'):
+            self.assertEquals(fea.get_value(),dview.get_feature(fea.fqr).get_value())
+        dataconf = flat.get_configuration('tempfile2_data.confml')
+        fearefs = fdview.list_all_features()
+        for dataref in dataconf.list_all_datas():
+            self.assertTrue(dataref in fearefs,"%s not in %s" % (dataref,fearefs))
+
+    def test_flat3(self):
+        '''
+        Test that the configuration flattening works
+        '''
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        confflat = confflattener.ConfigurationFlattener()
+        confflat.create_configuration(config, ['Contacts/Contact'],"contacts_flat.confml")
+
+        config = p.get_configuration('product.confml')
+        dview = config.get_default_view()
+        flat = p.get_configuration('contacts_flat.confml')
+        fdview = flat.get_default_view()
+        for fea in fdview.get_features('**'):
+            self.assertEquals(fea.get_value(),dview.get_feature(fea.fqr).get_value())
+        dataconf = flat.get_configuration('contacts_flat_data.confml')
+        fearefs = fdview.list_all_features()
+        for dataref in dataconf.list_all_datas():
+            self.assertTrue(dataref in fearefs,"%s not in %s" % (dataref,fearefs))
+
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_gcfml_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,168 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__	
+from genconfmlplugin import genconfmlplugin
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'project')
+
+invalidxml_string = '<file xmlns="http://www.s60.com/xml/genconfml/1">'
+genconfgml_string = \
+'<file xmlns="http://www.s60.com/xml/genconfml/1" name="Setting/Data.xml" target="output">'\
+'  <setting ref="Setting/Settings"/>'\
+'  <setting ref="Setting/ContentSettings"/>'\
+'  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xi="http://www.w3.org/2001/xinclude">'\
+'    <xsl:output method="xml" indent="yes" encoding="UTF-8"/>'\
+'    <xsl:template match="configuration/data">'\
+'      <Variant>'\
+'        <xsl:copy-of select="Setting/Settings"/>'\
+'        <xsl:copy-of select="Setting/ContentSettings"/>'\
+'      </Variant>'\
+'    </xsl:template>'\
+'  </xsl:stylesheet>'\
+'</file>'
+
+
+
+class TestGenconfmlPlugin(unittest.TestCase):
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = os.path.join(ROOT_PATH, 'temp/output')
+
+    def test_example_parse_and_generate_prj2(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('root1.confml')
+        impls = plugin.get_impl_set(config,'\.gcfml$')
+        impls.output = self.output
+        impl = impls.get_implementations_by_file('Layer1/implml/feature1.gcfml')[0]
+        impls.generate()
+
+    def test_predefined_contacts_parse_and_generate(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config,'\.gcfml$')
+        impls.output = self.output
+        impl = impls.get_implementations_by_file('assets/s60/implml/predefinedcontacts.gcfml')[0]
+        impls.generate()
+
+    def test_write_element_fo_file(self):
+        '''
+        Fix this
+        '''
+        OUTFILE = os.path.join(ROOT_PATH, 'temp/elementfile.xml')
+        if not os.path.exists(os.path.join(ROOT_PATH, 'temp')):
+            os.makedirs(os.path.join(ROOT_PATH, 'temp'))
+        #fs = filestorage.FileStorage(testdata)
+        #p = api.Project(fs)
+        #config = p.get_configuration('product.confml')
+        #genconfml_plugin = genconfmlplugin.GenconfmlImpl(None, config)
+        element = ElementTree.fromstring('<test>kfkadl</test>')
+        
+        genconfmlplugin.write_element(element, OUTFILE)
+        self.assertTrue(os.path.exists(OUTFILE))
+        #out_file = open(output, 'r')
+        #out_file.write(xml.etree.ElementTree.tostring(element))
+        #out_file.close()
+        
+        
+        #resource = self.configuration.get_resource("elementfile.xml")
+        
+        
+    def test_parse_target(self):
+        etree = ElementTree.fromstring(genconfgml_string)
+        reader = genconfmlplugin.GenconfmlImplReader()
+        target = reader.parse_target(etree)
+        self.assertEquals(target,'output')
+
+    def test_parse_stylesheet(self):
+        etree = ElementTree.fromstring(genconfgml_string)
+        reader = genconfmlplugin.GenconfmlImplReader()
+        stylesheet = reader.parse_stylesheet(etree)
+        #print stylesheet
+        #FIX THIS
+        #self.assertEquals(stylesheet, etree.find("{%s}stylesheet" % 'http://www.w3.org/1999/XSL/Transform'))
+
+    def test_parse_name(self):
+        etree = ElementTree.fromstring(genconfgml_string)
+        reader = genconfmlplugin.GenconfmlImplReader()
+        name = reader.parse_name(etree)
+        self.assertEquals(name,'Setting/Data.xml')
+
+    def test_parse_subdir_without_definition(self):
+        etree = ElementTree.fromstring(genconfgml_string)
+        reader = genconfmlplugin.GenconfmlImplReader()
+        subdir = reader.parse_subdir(etree)
+        self.assertEquals(subdir, "")
+
+    def test_parse_subdir_with_definition(self):
+        etree = ElementTree.fromstring(genconfgml_string.replace("target=\"output\"", "subdir=\"include\""))
+        reader = genconfmlplugin.GenconfmlImplReader()
+        subdir = reader.parse_subdir(etree)
+        self.assertEquals(subdir, "include")
+
+    def test_parse_settings(self):
+        etree = ElementTree.fromstring(genconfgml_string)
+        reader = genconfmlplugin.GenconfmlImplReader()
+        settings = reader.parse_settings(etree)
+        self.assertEquals(settings[0],'Setting/Settings')
+        self.assertEquals(settings[1],'Setting/ContentSettings')
+        
+    def test_has_ref(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config,'\.gcfml$')
+        impls.output = self.output
+        impl = impls.get_implementations_by_file('assets/s60/implml/predefinedcontacts.gcfml')[0]
+        self.assertEquals(impl.get_refs(), ['Contacts.Contact'])
+        self.assertFalse(impl.has_ref(['ref1', 'ref2']))
+        self.assertTrue(impl.has_ref(['Contacts.Contact']))
+        self.assertTrue(impl.has_ref(['Contacts.Contact.FirstName']))
+        self.assertFalse(impl.has_ref(['Contacts.OtherSetting']))
+        
+    def test_list_output_files(self):
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config,'\.gcfml$')
+        impls.output = self.output
+        impl = impls.get_implementations_by_file('assets/s60/implml/predefinedcontacts.gcfml')[0]
+        self.assertEquals(impl.list_output_files(), ['output\\private\\2000BEE5\\predefinedcontacts.xml'])
+
+    
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_generation.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, unittest
+import __init__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+from testautomation.base_testcase import BaseTestCase
+from cone.public import exceptions, plugin, api, container
+
+def abspath(path):
+    return os.path.normpath(os.path.join(ROOT_PATH, path))
+
+class TestGenconfmlGeneration(BaseTestCase):
+    
+    def test_generate_gcfml_layer1(self): self._run_gen_test(1)
+    def test_generate_gcfml_layer2(self): self._run_gen_test(2)
+    # Related to the ignored file, see ticket #160: Sequence items with extension policy prefix are reversed
+    def test_generate_gcfml_layer3(self): self._run_gen_test(3, ignores=['feature2.txt'])
+    def test_generate_gcfml_layer4(self): self._run_gen_test(4)
+    
+    def _run_gen_test(self, layer, ignores=[]):
+        project_dir     = abspath('project')
+        config          = 'root%s.confml' % layer
+        output_dir      = abspath('temp/gen_output%s' % layer)
+        expected_dir    = abspath('expected/root%s' % layer)
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration(config)
+        impls = plugin.get_impl_set(config, 'gcfml$')
+        impls.output = output_dir
+        impls.generate()
+        
+        self.assert_dir_contents_equal(output_dir, expected_dir, ['.svn'] + ignores)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/unittest_xslttransformer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil, sys
+
+import __init__	
+from genconfmlplugin import xslttransformer
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+
+# Hardcoded value of testdata folder that must be under the current working dir
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'project')
+
+class TestGenconfmlPlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+        
+    def test_transform(self):
+        '''
+        Test that the xslt transformation works
+        '''
+        transformer = xslttransformer.XsltTransformer()
+        transformer.transform_lxml(os.path.join(ROOT_PATH,"xslt\cdcatalog.xml"), 
+                                 os.path.join(ROOT_PATH,"xslt\cdcatalog_ex1.xsl"), 
+                                 "testioutput.xml",
+                                 sys.getdefaultencoding())
+        os.unlink("testioutput.xml")
+
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,211 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<catalog>
+	<cd>
+		<title>Empire Burlesque</title>
+		<artist>Bob Dylan</artist>
+		<country>USA</country>
+		<company>Columbia</company>
+		<price>10.90</price>
+		<year>1985</year>
+	</cd>
+	<cd>
+		<title>Hide your heart</title>
+		<artist>Bonnie Tyler</artist>
+		<country>UK</country>
+		<company>CBS Records</company>
+		<price>9.90</price>
+		<year>1988</year>
+	</cd>
+	<cd>
+		<title>Greatest Hits</title>
+		<artist>Dolly Parton</artist>
+		<country>USA</country>
+		<company>RCA</company>
+		<price>9.90</price>
+		<year>1982</year>
+	</cd>
+	<cd>
+		<title>Still got the blues</title>
+		<artist>Gary Moore</artist>
+		<country>UK</country>
+		<company>Virgin records</company>
+		<price>10.20</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Eros</title>
+		<artist>Eros Ramazzotti</artist>
+		<country>EU</country>
+		<company>BMG</company>
+		<price>9.90</price>
+		<year>1997</year>
+	</cd>
+	<cd>
+		<title>One night only</title>
+		<artist>Bee Gees</artist>
+		<country>UK</country>
+		<company>Polydor</company>
+		<price>10.90</price>
+		<year>1998</year>
+	</cd>
+	<cd>
+		<title>Sylvias Mother</title>
+		<artist>Dr.Hook</artist>
+		<country>UK</country>
+		<company>CBS</company>
+		<price>8.10</price>
+		<year>1973</year>
+	</cd>
+	<cd>
+		<title>Maggie May</title>
+		<artist>Rod Stewart</artist>
+		<country>UK</country>
+		<company>Pickwick</company>
+		<price>8.50</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Romanza</title>
+		<artist>Andrea Bocelli</artist>
+		<country>EU</country>
+		<company>Polydor</company>
+		<price>10.80</price>
+		<year>1996</year>
+	</cd>
+	<cd>
+		<title>When a man loves a woman</title>
+		<artist>Percy Sledge</artist>
+		<country>USA</country>
+		<company>Atlantic</company>
+		<price>8.70</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Black angel</title>
+		<artist>Savage Rose</artist>
+		<country>EU</country>
+		<company>Mega</company>
+		<price>10.90</price>
+		<year>1995</year>
+	</cd>
+	<cd>
+		<title>1999 Grammy Nominees</title>
+		<artist>Many</artist>
+		<country>USA</country>
+		<company>Grammy</company>
+		<price>10.20</price>
+		<year>1999</year>
+	</cd>
+	<cd>
+		<title>For the good times</title>
+		<artist>Kenny Rogers</artist>
+		<country>UK</country>
+		<company>Mucik Master</company>
+		<price>8.70</price>
+		<year>1995</year>
+	</cd>
+	<cd>
+		<title>Big Willie style</title>
+		<artist>Will Smith</artist>
+		<country>USA</country>
+		<company>Columbia</company>
+		<price>9.90</price>
+		<year>1997</year>
+	</cd>
+	<cd>
+		<title>Tupelo Honey</title>
+		<artist>Van Morrison</artist>
+		<country>UK</country>
+		<company>Polydor</company>
+		<price>8.20</price>
+		<year>1971</year>
+	</cd>
+	<cd>
+		<title>Soulsville</title>
+		<artist>Jorn Hoel</artist>
+		<country>Norway</country>
+		<company>WEA</company>
+		<price>7.90</price>
+		<year>1996</year>
+	</cd>
+	<cd>
+		<title>The very best of</title>
+		<artist>Cat Stevens</artist>
+		<country>UK</country>
+		<company>Island</company>
+		<price>8.90</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Stop</title>
+		<artist>Sam Brown</artist>
+		<country>UK</country>
+		<company>A and M</company>
+		<price>8.90</price>
+		<year>1988</year>
+	</cd>
+	<cd>
+		<title>Bridge of Spies</title>
+		<artist>T`Pau</artist>
+		<country>UK</country>
+		<company>Siren</company>
+		<price>7.90</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Private Dancer</title>
+		<artist>Tina Turner</artist>
+		<country>UK</country>
+		<company>Capitol</company>
+		<price>8.90</price>
+		<year>1983</year>
+	</cd>
+	<cd>
+		<title>Midt om natten</title>
+		<artist>Kim Larsen</artist>
+		<country>EU</country>
+		<company>Medley</company>
+		<price>7.80</price>
+		<year>1983</year>
+	</cd>
+	<cd>
+		<title>Pavarotti Gala Concert</title>
+		<artist>Luciano Pavarotti</artist>
+		<country>UK</country>
+		<company>DECCA</company>
+		<price>9.90</price>
+		<year>1991</year>
+	</cd>
+	<cd>
+		<title>The dock of the bay</title>
+		<artist>Otis Redding</artist>
+		<country>USA</country>
+		<company>Atlantic</company>
+		<price>7.90</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Picture book</title>
+		<artist>Simply Red</artist>
+		<country>EU</country>
+		<company>Elektra</company>
+		<price>7.20</price>
+		<year>1985</year>
+	</cd>
+	<cd>
+		<title>Red</title>
+		<artist>The Communards</artist>
+		<country>UK</country>
+		<company>London</company>
+		<price>7.80</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Unchain my heart</title>
+		<artist>Joe Cocker</artist>
+		<country>USA</country>
+		<company>EMI</company>
+		<price>8.20</price>
+		<year>1987</year>
+	</cd>
+</catalog>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog_ex1.xsl	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<xsl:stylesheet version="1.0"
+	xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
+	<xsl:template match="/">
+		<html>
+			<body>
+				<h2>My CD Collection</h2>
+				<table border="1">
+					<tr bgcolor="#9acd32">
+						<th>Title</th>
+						<th>Artist</th>
+					</tr>
+					<tr>
+						<td>.</td>
+						<td>.</td>
+					</tr>
+				</table>
+			</body>
+		</html>
+	</xsl:template>
+</xsl:stylesheet>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/tests/xslt/cdcatalog_with_ex1.xml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<?xml-stylesheet type="text/xsl" href="cdcatalog_ex1.xsl"?>
+<catalog>
+	<cd>
+		<title>Empire Burlesque</title>
+		<artist>Bob Dylan</artist>
+		<country>USA</country>
+		<company>Columbia</company>
+		<price>10.90</price>
+		<year>1985</year>
+	</cd>
+	<cd>
+		<title>Hide your heart</title>
+		<artist>Bonnie Tyler</artist>
+		<country>UK</country>
+		<company>CBS Records</company>
+		<price>9.90</price>
+		<year>1988</year>
+	</cd>
+	<cd>
+		<title>Greatest Hits</title>
+		<artist>Dolly Parton</artist>
+		<country>USA</country>
+		<company>RCA</company>
+		<price>9.90</price>
+		<year>1982</year>
+	</cd>
+	<cd>
+		<title>Still got the blues</title>
+		<artist>Gary Moore</artist>
+		<country>UK</country>
+		<company>Virgin records</company>
+		<price>10.20</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Eros</title>
+		<artist>Eros Ramazzotti</artist>
+		<country>EU</country>
+		<company>BMG</company>
+		<price>9.90</price>
+		<year>1997</year>
+	</cd>
+	<cd>
+		<title>One night only</title>
+		<artist>Bee Gees</artist>
+		<country>UK</country>
+		<company>Polydor</company>
+		<price>10.90</price>
+		<year>1998</year>
+	</cd>
+	<cd>
+		<title>Sylvias Mother</title>
+		<artist>Dr.Hook</artist>
+		<country>UK</country>
+		<company>CBS</company>
+		<price>8.10</price>
+		<year>1973</year>
+	</cd>
+	<cd>
+		<title>Maggie May</title>
+		<artist>Rod Stewart</artist>
+		<country>UK</country>
+		<company>Pickwick</company>
+		<price>8.50</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Romanza</title>
+		<artist>Andrea Bocelli</artist>
+		<country>EU</country>
+		<company>Polydor</company>
+		<price>10.80</price>
+		<year>1996</year>
+	</cd>
+	<cd>
+		<title>When a man loves a woman</title>
+		<artist>Percy Sledge</artist>
+		<country>USA</country>
+		<company>Atlantic</company>
+		<price>8.70</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Black angel</title>
+		<artist>Savage Rose</artist>
+		<country>EU</country>
+		<company>Mega</company>
+		<price>10.90</price>
+		<year>1995</year>
+	</cd>
+	<cd>
+		<title>1999 Grammy Nominees</title>
+		<artist>Many</artist>
+		<country>USA</country>
+		<company>Grammy</company>
+		<price>10.20</price>
+		<year>1999</year>
+	</cd>
+	<cd>
+		<title>For the good times</title>
+		<artist>Kenny Rogers</artist>
+		<country>UK</country>
+		<company>Mucik Master</company>
+		<price>8.70</price>
+		<year>1995</year>
+	</cd>
+	<cd>
+		<title>Big Willie style</title>
+		<artist>Will Smith</artist>
+		<country>USA</country>
+		<company>Columbia</company>
+		<price>9.90</price>
+		<year>1997</year>
+	</cd>
+	<cd>
+		<title>Tupelo Honey</title>
+		<artist>Van Morrison</artist>
+		<country>UK</country>
+		<company>Polydor</company>
+		<price>8.20</price>
+		<year>1971</year>
+	</cd>
+	<cd>
+		<title>Soulsville</title>
+		<artist>Jorn Hoel</artist>
+		<country>Norway</country>
+		<company>WEA</company>
+		<price>7.90</price>
+		<year>1996</year>
+	</cd>
+	<cd>
+		<title>The very best of</title>
+		<artist>Cat Stevens</artist>
+		<country>UK</country>
+		<company>Island</company>
+		<price>8.90</price>
+		<year>1990</year>
+	</cd>
+	<cd>
+		<title>Stop</title>
+		<artist>Sam Brown</artist>
+		<country>UK</country>
+		<company>A and M</company>
+		<price>8.90</price>
+		<year>1988</year>
+	</cd>
+	<cd>
+		<title>Bridge of Spies</title>
+		<artist>T`Pau</artist>
+		<country>UK</country>
+		<company>Siren</company>
+		<price>7.90</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Private Dancer</title>
+		<artist>Tina Turner</artist>
+		<country>UK</country>
+		<company>Capitol</company>
+		<price>8.90</price>
+		<year>1983</year>
+	</cd>
+	<cd>
+		<title>Midt om natten</title>
+		<artist>Kim Larsen</artist>
+		<country>EU</country>
+		<company>Medley</company>
+		<price>7.80</price>
+		<year>1983</year>
+	</cd>
+	<cd>
+		<title>Pavarotti Gala Concert</title>
+		<artist>Luciano Pavarotti</artist>
+		<country>UK</country>
+		<company>DECCA</company>
+		<price>9.90</price>
+		<year>1991</year>
+	</cd>
+	<cd>
+		<title>The dock of the bay</title>
+		<artist>Otis Redding</artist>
+		<country>USA</country>
+		<company>Atlantic</company>
+		<price>7.90</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Picture book</title>
+		<artist>Simply Red</artist>
+		<country>EU</country>
+		<company>Elektra</company>
+		<price>7.20</price>
+		<year>1985</year>
+	</cd>
+	<cd>
+		<title>Red</title>
+		<artist>The Communards</artist>
+		<country>UK</country>
+		<company>London</company>
+		<price>7.80</price>
+		<year>1987</year>
+	</cd>
+	<cd>
+		<title>Unchain my heart</title>
+		<artist>Joe Cocker</artist>
+		<country>USA</country>
+		<company>EMI</company>
+		<price>8.20</price>
+		<year>1987</year>
+	</cd>
+</catalog>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/genconfmlplugin/xslttransformer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,168 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Configuration flattener
+'''
+
+
+import re
+import os
+import sys
+import codecs
+import logging
+import xml.parsers.expat
+import unittest, os, sys, pkg_resources
+
+pkg_resources.require('lxml')
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class XsltTransformer():
+    """
+    XSLT Transformer
+    """
+    
+    def _init(self,ref,configuration):
+        self.logger = logging.getLogger('cone.gcfml(%s)' % self.ref)
+
+
+    def transform_lxml(self, input, xslt, output, enc, linesep=os.linesep):
+      """
+      XSLT transform with lxml.
+      """
+      from lxml import etree
+      
+      if not enc:
+          enc = sys.getdefaultencoding()
+      try:
+          xslt_doc = etree.parse(xslt)
+          transform = etree.XSLT(xslt_doc)
+          
+          input_doc = etree.parse(input)
+          result = str(transform(input_doc))                   
+          postprocessed_result = post_process_result(result, enc, linesep)
+          
+          if not filter_file_writing(postprocessed_result):
+              write_string_to_file(postprocessed_result, output, enc)
+        
+      except Exception, e:
+          logging.getLogger('cone.gcfml').error('Failed to do XSLT transformation: %s' % e)
+          raise exceptions.ConeException('Failed to do XSLT transformation: %s' % (e))
+
+
+    def transform_4s(self, input, xslt, output, enc, linesep=os.linesep):
+      """
+      XSLT transform with 4Suite
+      """
+      from Ft.Xml.Xslt import Transform
+      from Ft.Xml.Xslt import Processor
+      from Ft.Xml import InputSource
+      from Ft.Lib.Uri import OsPathToUri  
+
+      
+      if not enc:
+          enc = sys.getdefaultencoding()
+      
+      try:
+          processor = Processor.Processor()
+          
+          srcAsUri = OsPathToUri(input)
+          source = InputSource.DefaultFactory.fromUri(srcAsUri)
+
+          ssAsUri = OsPathToUri(xslt)
+          transform = InputSource.DefaultFactory.fromUri(ssAsUri)
+
+          processor.appendStylesheet(transform)
+          result = processor.run(source)
+          
+          postprocessed_result = post_process_result(result, enc, linesep)
+          
+          if not filter_file_writing(postprocessed_result):
+              write_string_to_file(postprocessed_result, output, enc)
+        
+      except Exception, e:
+          logging.getLogger('cone.gcfml').error('Failed to do XSLT transformation: %s' % e)
+          raise exceptions.ConeException('Failed to do XSLT transformation: %s' % (e))
+
+def filter_file_writing(string):
+    """
+    Returns True if writing result file should be ignored.
+    """
+    string = string.rstrip('\n\r')
+    if string == '' or string == '<?xml version="1.0" encoding="UTF-16"?>' or \
+        string == '<?xml version="1.0" encoding="UTF-8"?>':
+        return True
+    
+    return False
+
+
+def post_process_result(string, enc, linesep):
+  """
+  Does post process for result from XSLT transform
+      - encoding
+      - removes extra line separators
+      - changes line separators
+  """
+  output_string = None
+  
+  try:
+      output_string = string.decode(enc)
+      if not output_string.startswith('<'):
+          output_string = '\n' + output_string
+      output_string = output_string.replace('<?xml version="1.0" encoding="UTF-16"?>', '<?xml version="1.0" encoding="UTF-16"?>\n\n')
+      output_string = output_string.replace('<?xml version="1.0" encoding="UTF-8"?>', '<?xml version="1.0" encoding="UTF-8"?>\n\n')
+      output_string = output_string.replace('\n\n','\n')
+      output_string = output_string.replace('\n', linesep)
+      output_string+= linesep
+  except Exception, e:
+      logging.getLogger('cone.gcfml').error('Cannot post process result: %s \nException: %s' % (string, e))
+      raise exceptions.ConeException('Cannot post process result: %s \nException: %s' % (string, e))
+  
+  return output_string
+
+def write_string_to_file(string, output, enc):
+  """
+  Writes string to file
+  """
+  try:
+      outfile = os.path.abspath(output)
+      
+      if not os.path.exists(os.path.dirname(outfile)):
+          os.makedirs(os.path.dirname(outfile))
+          
+      fl = codecs.open(outfile, 'w', enc)
+      fl.write(string)
+      fl.close()
+      
+  except Exception, e:
+      logging.getLogger('cone.gcfml').error('Cannot write Element to file (%s). Exception: %s' % (output, e))
+      raise exceptions.ConeException('Cannot write Element to file (%s). Exception: %s' % (output, e))
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeGenconfmlPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path,sys
+from setuptools import setup, find_packages
+from genconfmlplugin import __version__
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(os.path.join(ROOT_PATH,'lib'))
+
+setup(
+    name = "conegenconfmlplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "genconfml.tests.collect_suite",
+	install_requires = ['lxml>=2.2.2'],
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Configuration Tool GenConfml plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['gcfml = genconfmlplugin.genconfmlplugin:GenconfmlImplReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_exceptions.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+from cone.public import exceptions
+
+
+# ============================================================================
+# Writer exceptions
+# ============================================================================
+
+class HcrWriterError(exceptions.ConeException):
+    pass
+
+class DuplicateRecordError(HcrWriterError):
+    pass
+
+class ValueNotInRangeError(HcrWriterError):
+    pass
+
+class TooLargeLsdDataError(HcrWriterError):
+    pass
+
+# ============================================================================
+# Reader exceptions
+# ============================================================================
+
+class HcrReaderError(exceptions.ParseError):
+    pass
+
+class InvalidHcrDataSizeError(HcrReaderError):
+    pass
+
+class InvalidHcrHeaderError(HcrReaderError):
+    pass
+
+class InvalidLsdSectionOffsetError(HcrReaderError):
+    pass
+
+class NoVersionInRepositoryError(HcrReaderError):
+    pass
+
+class NoReadOnlyAttributeInRepositoryError(HcrReaderError):
+    pass
+
+
+class InvalidRecordLsdPositionError(HcrReaderError):
+    pass
+
+class InvalidRecordValueTypeError(HcrReaderError):
+    pass
+
+
+
+# ============================================================================
+# HCRML parser exceptions
+# ============================================================================
+
+class HcrmlParserError(exceptions.ParseError):
+    pass
+
+class NoCategoryUIDInHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoRefInHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoTypeAttributeInSettingHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoCategoryNameInHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoNameAttributeInSettingHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoIdAttributeInSettingHcrmlFileError(HcrmlParserError):
+    pass
+
+class NoTypeDefinedInOutPutTagError(HcrmlParserError):
+    pass
+
+class InvalidTypeDefinedInOutPutTagError(HcrmlParserError):
+    pass
+
+class NoCategoryNameDefinedInCategoryTagError(HcrmlParserError):
+    pass
+
+class NoCategoryUidDefinedInCategoryTagError(HcrmlParserError):
+    pass
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_header.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,51 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+from struct import pack, unpack
+from hcrplugin.hcr_exceptions import InvalidHcrHeaderError
+
+class HcrHeader(object):
+    """
+    """
+    HEADER_FMT = '<4sHHIII12x'
+    HEADER_SIGNATURE = 'HCRf'
+    def __init__(self):
+        self.version    = 0
+        self.flags      = 0
+        self.nrecords   = 0
+        self.lsd_offset = 0
+        self.lsd_size   = 0
+
+    def loads(self, headerstr):
+        if len(headerstr) != 32:
+            raise InvalidHcrHeaderError('Invalid length of header data %r' % headerstr)
+        
+        result = unpack(self.HEADER_FMT, headerstr)
+        if not result[0] == self.HEADER_SIGNATURE:
+            raise InvalidHcrHeaderError('Invalid HCR signature in %r' % headerstr)
+        self.version    = result[1]
+        self.flags      = result[2]
+        self.nrecords   = result[3]
+        self.lsd_offset = result[4]
+        self.lsd_size   = result[5]
+        
+
+    def dumps(self):
+        return pack(self.HEADER_FMT, self.HEADER_SIGNATURE, self.version, 
+                                    self.flags, 
+                                    self.nrecords, 
+                                    self.lsd_offset,
+                                    self.lsd_size)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,151 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import logging
+import __init__
+from hcrplugin.hcrrepository import HcrRecord, HcrRepository
+from struct import pack, unpack
+from hcrplugin.hcr_writer import VALUE_TYPE_MAP,VALUE_TYPES_WITH_LSD,VALUE_TYPES_UNSIGNED_INT
+from hcrplugin.hcr_header import HcrHeader
+from hcrplugin.hcr_exceptions import *
+
+
+class HcrReader(object):
+    
+    def parse_repository_from_bindata(self, data):
+        """
+        @return: HcrRepository object constructed from the given binary data.
+        """
+        header_data = data[:32]
+        header = HcrHeader()
+        header.loads(header_data)
+        
+        expected_len = 32 + header.nrecords * 20 + header.lsd_size
+        if len(data) < expected_len:
+            raise InvalidHcrDataSizeError("File size is %d, expected at least %d based on header" \
+                                          % (len(data), expected_len))
+        
+        expected_lsd_offset = 32 + header.nrecords * 20
+        if header.lsd_offset != expected_lsd_offset: 
+            raise InvalidLsdSectionOffsetError("LSD offset is %d, expected %d" \
+                                               % (header.lsd_offset, expected_lsd_offset))
+        
+        records = []
+        for i in xrange(header.nrecords):
+            record_offset =  32 + i * 20
+            record_data = data[record_offset:record_offset+20]
+            record,lsd_pos = self.parse_record_from_bindata(record_data)
+            if lsd_pos != None:
+                if lsd_pos[0] > header.lsd_size or (lsd_pos[0] + lsd_pos[1]) > header.lsd_size:
+                    raise InvalidRecordLsdPositionError(
+                        "LSD offset of record %d (category=%d, element=%d) is %r, but LSD section size is %d" \
+                        % (i, record.category_id, record.element_id, lsd_pos, header.lsd_size))
+                lsd_offset = lsd_pos[0] + header.lsd_offset
+                lsd_data = data[lsd_offset:lsd_offset+lsd_pos[1]]
+                record.value = self.parse_record_value_from_lsd_bindata(record.type,lsd_data)
+            records.append(record)
+                
+        return HcrRepository(records,header.version,header.flags)
+
+    def parse_record_from_bindata(self, data):
+        """
+        @return: Tuple: (record, lsd_pos) where
+            record  = HcrRecord object constructed from the given binary data.
+            lsd_pos = The position of the record's data in the LSD section in the
+                      form of a tuple (offset, size), or None if the record does
+                      not have any data in the LSD section.
+        """
+        
+        if len(data) != 20:
+            raise HcrReaderError("Invalid record length: %d, expected 20" % len(data))
+        
+        result = unpack("<IIIHH",data[:16])
+        
+        category_id = result[0]
+        element_id = result[1]
+        value_type = result[2]
+        flag = result[3]
+        lsd_len = result[4]
+        
+        
+        
+        for key,val in VALUE_TYPE_MAP.iteritems():
+            if val == value_type:
+                value_type = key
+                break
+        if value_type not in VALUE_TYPE_MAP:
+            raise InvalidRecordValueTypeError("Invalid value type:%X" % value_type)
+        
+        value = None
+        lsd_pos = None
+        if value_type in VALUE_TYPES_WITH_LSD:
+            lsd_offset = unpack("<I",data[16:])[0]
+            lsd_pos = (lsd_offset,lsd_len)
+        else:
+            if value_type in VALUE_TYPES_UNSIGNED_INT:
+                format = "<I"
+            elif value_type == HcrRecord.VALTYPE_INT8:
+                format = "<bxxx"
+            elif value_type == HcrRecord.VALTYPE_INT16:
+                format = "<hxx"
+            else:
+                format = "<i"
+            
+            value = unpack(format, data[16:])[0]
+                
+            if value_type == HcrRecord.VALTYPE_BOOL:
+                value = bool(value)
+                
+            
+        
+        record = HcrRecord(value_type,value,category_id,element_id,flag)
+
+        return record,lsd_pos
+        
+    
+    def parse_record_value_from_lsd_bindata(self, record_type, data):
+        """
+        @return: The record value parsed from the given binary data in the LSD section.
+        @param type: The HCRML type of the record whose LSD data is to be parsed.
+        """
+        if record_type == HcrRecord.VALTYPE_TEXT8:
+            return data.decode("utf-8")
+        
+        elif record_type == HcrRecord.VALTYPE_BIN_DATA:
+            return data 
+
+        elif record_type == HcrRecord.VALTYPE_ARRAY_INT32:
+            if len(data) % 4 != 0:
+                raise InvalidRecordLsdPositionError("Int32 array requires an amount of LSD data that is divisible by 4 (data with size %d was given)" % len(data))
+            return list(unpack("<%di"%(len(data)/4), data))
+
+        elif record_type == HcrRecord.VALTYPE_ARRAY_UINT32:
+            if len(data) % 4 != 0:
+                raise InvalidRecordLsdPositionError("Uint32 array requires an amount of LSD data that is divisible by 4 (data with size %d was given)" % len(data))
+            return list(unpack("<%dI"%(len(data)/4), data))
+
+        elif record_type == HcrRecord.VALTYPE_INT64:
+            if len(data) != 8:
+                raise InvalidRecordLsdPositionError("Int64 requires LSD data size to be 8 bytes (%d given)" % len(data))
+            return unpack("<q",data)[0]
+
+        elif record_type == HcrRecord.VALTYPE_UINT64:
+            if len(data) != 8:
+                raise InvalidRecordLsdPositionError("Uint64 requires LSD data size to be 8 bytes (%d given)" % len(data))
+            return unpack("<Q",data)[0]
+        
+        else:
+            return None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcr_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,217 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import logging
+import __init__
+  
+
+from struct import pack, unpack
+
+from cone.public import exceptions,plugin,utils,api
+from hcrplugin.hcrrepository import HcrRecord
+from hcrplugin.hcr_exceptions import *
+from hcrplugin.hcr_header import HcrHeader
+
+# Dictionary for mapping the HCRML value types to their
+# implementation values
+VALUE_TYPE_MAP = {
+    HcrRecord.VALTYPE_INT32         : 0x00000001,
+    HcrRecord.VALTYPE_INT16         : 0x00000002,
+    HcrRecord.VALTYPE_INT8          : 0x00000004,
+    HcrRecord.VALTYPE_BOOL          : 0x00000008,
+    HcrRecord.VALTYPE_UINT32        : 0x00000010,
+    HcrRecord.VALTYPE_UINT16        : 0x00000020,
+    HcrRecord.VALTYPE_UINT8         : 0x00000040,
+    HcrRecord.VALTYPE_LIN_ADDR      : 0x00000100,
+    HcrRecord.VALTYPE_BIN_DATA      : 0x00010000,
+    HcrRecord.VALTYPE_TEXT8         : 0x00020000,
+    HcrRecord.VALTYPE_ARRAY_INT32   : 0x00040000,
+    HcrRecord.VALTYPE_ARRAY_UINT32  : 0x00080000,
+    HcrRecord.VALTYPE_INT64         : 0x01000000,
+    HcrRecord.VALTYPE_UINT64        : 0x02000000,
+    }
+
+
+VALUE_TYPES_WITH_LSD = [
+    HcrRecord.VALTYPE_BIN_DATA,
+    HcrRecord.VALTYPE_TEXT8,
+    HcrRecord.VALTYPE_ARRAY_INT32,
+    HcrRecord.VALTYPE_ARRAY_UINT32,
+    HcrRecord.VALTYPE_INT64,
+    HcrRecord.VALTYPE_UINT64
+    ]
+
+VALUE_TYPES_UNSIGNED_INT = [
+    HcrRecord.VALTYPE_UINT32,
+    HcrRecord.VALTYPE_UINT16,
+    HcrRecord.VALTYPE_UINT8,
+    HcrRecord.VALTYPE_LIN_ADDR,
+    HcrRecord.VALTYPE_UINT64,
+    ]
+
+NUMERIC_VALUE_RANGES = {
+    HcrRecord.VALTYPE_INT32         : (-2**31,  2**31-1),
+    HcrRecord.VALTYPE_INT16         : (-2**15,  2**15-1),
+    HcrRecord.VALTYPE_INT8          : (-2**7,   2**7-1),
+    HcrRecord.VALTYPE_UINT32        : (0,       2**32-1),
+    HcrRecord.VALTYPE_UINT16        : (0,       2**16-1),
+    HcrRecord.VALTYPE_UINT8         : (0,       2**8-1),
+    HcrRecord.VALTYPE_LIN_ADDR      : (0,       2**32-1),
+    HcrRecord.VALTYPE_INT64         : (-2**63,  2**63-1),
+    HcrRecord.VALTYPE_UINT64        : (0,       2**64-1),
+    HcrRecord.VALTYPE_ARRAY_INT32   : (-2**31,  2**31-1),
+    HcrRecord.VALTYPE_ARRAY_UINT32  : (0,       2**32-1),
+}
+
+
+
+class HcrWriter(object):
+    
+    # Maximum size of LSD section data for one record
+    LSD_MAX_SIZE_PER_RECORD = 512
+    
+    def get_record_setting_id(self, record):
+        """
+        Return the setting ID value used for sorting the records in the repository.
+        """
+        return (record.category_id, record.element_id)
+    
+    def get_repository_bindata(self, repository):
+        """
+        @return: The binary data to write into a file for the given repository.
+        """
+        dup_ids = repository.get_duplicate_record_ids()
+        if len(dup_ids) > 0:
+            raise DuplicateRecordError("The repository contains the following duplicate records (category ID, element ID): %r" % dup_ids)
+        
+        header_data   = None
+        header_size   = 32
+        record_data   = []
+        records_size  = 0
+        lsd_data      = []
+        lsd_size      = 0
+        lsd_offset    = None
+        
+        # Generate the record and LSD section data
+        records = sorted(repository.records, key=self.get_record_setting_id)
+        for record in records:
+            lsd_pos = None
+            lsd = self.get_record_lsd_bindata(record)
+            if lsd != None:
+                # Store the position before adding the padding,
+                # because it shouldn't include the padding bytes
+                lsd_pos = (lsd_size, len(lsd))
+                lsd += self._get_padding(len(lsd))
+                lsd_data.append(lsd)
+                lsd_size += len(lsd)
+            
+            rdata = self.get_record_bindata(record, lsd_pos)
+            record_data.append(rdata)
+            records_size += len(rdata)
+        
+        lsd_offset = header_size + records_size
+        
+        header = HcrHeader()
+        header.version = repository.version
+        header.flags = repository.flags
+        header.nrecords = len(repository.records)
+        header.lsd_offset = lsd_offset
+        header.lsd_size = lsd_size
+        
+        header_data = header.dumps()
+        if len(header_data) != header_size:
+            raise RuntimeError("Internal logic error! Header size is %d and not %d as it should be!" % (len(header_data), header_size))
+        
+        output = []
+        output.append(header_data)
+        output.extend(record_data)
+        output.extend(lsd_data)
+        output = ''.join(output)
+        if len(output) % 4 != 0:
+            raise RuntimeError("Internal logic error! Output size is not divisible by 4 (%d)" % (len(output)))
+        
+        return output
+    
+    def _get_padding(self, size, padding_char='\x00'):
+        if size % 4 == 0:   amount = 0
+        else:               amount = 4 - (size % 4)
+        return amount * padding_char
+    
+    
+    def get_record_bindata(self, record, lsd_pos=None):
+        """
+        @param lsd_pos: The position of the record's data in the Large
+            Setting Data section. Should be a tuple: (offset, size).
+        @return: The binary data to write for the given record object.
+        """
+        self._check_value_range(record)
+        
+        if record.type in VALUE_TYPES_WITH_LSD:
+            RECORD_FMT = "<IIIHHI"
+            return pack(RECORD_FMT,record.category_id,record.element_id,VALUE_TYPE_MAP[record.type],record.flags,lsd_pos[1],lsd_pos[0])
+        else:
+            if record.type in VALUE_TYPES_UNSIGNED_INT:
+                RECORD_FMT = "<IIIHHI"
+            else:
+                RECORD_FMT = "<IIIHHi"
+            return pack(RECORD_FMT,record.category_id,record.element_id,VALUE_TYPE_MAP[record.type],record.flags,0,record.value)
+        
+    
+    def get_record_lsd_bindata(self, record):
+        """
+        @return: The binary data to write into the Large Setting Data
+            section for the given setting, or None if an entry in the
+            LSD section is not necessary.
+        """
+        result = None
+        
+        if record.type == HcrRecord.VALTYPE_TEXT8:
+            result = record.value.encode("utf-8")
+        
+        elif record.type == HcrRecord.VALTYPE_BIN_DATA:
+            result = record.value 
+
+        elif record.type == HcrRecord.VALTYPE_ARRAY_INT32:
+            result = pack("<%di"%len(record.value),*record.value)
+
+        elif record.type == HcrRecord.VALTYPE_ARRAY_UINT32:
+            result = pack("<%dI"%len(record.value),*record.value)
+
+        elif record.type == HcrRecord.VALTYPE_INT64:
+            result = pack("<q",record.value)
+
+        elif record.type == HcrRecord.VALTYPE_UINT64:
+            result = pack("<Q",record.value)
+        
+        if result != None:
+            if len(result) > self.LSD_MAX_SIZE_PER_RECORD:
+                msg = "Data size for value in record (category=%d, element=%d) is too large: size %d bytes, but maximum is %d bytes" \
+                    % (record.category_id, record.element_id, len(result), self.LSD_MAX_SIZE_PER_RECORD)
+                raise TooLargeLsdDataError(msg)
+        return result
+    
+    def _check_value_range(self, record):
+        if record.type in NUMERIC_VALUE_RANGES:
+            range = NUMERIC_VALUE_RANGES[record.type]
+            
+            values = record.value
+            if not isinstance(values, list): values = [values]
+            
+            for val in values:
+                if val < range[0] or val > range[1]:
+                    msg = "Value in record (category=%d, element=%d) is invalid for its type ('%s'): %d is not in the range %d-%d" \
+                        % (record.category_id, record.element_id, record.type, val, range[0], range[1])
+                    raise ValueNotInRangeError(msg)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrml_parser.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,389 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+
+
+import re
+import os
+import sys
+import logging
+import xml.parsers.expat
+import codecs
+from hcrplugin.hcr_exceptions import *
+from hcrplugin.hcrrepository import HcrRecord, HcrRepository
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin.header_writer import *
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class HcrmlImpl(plugin.ImplBase):
+    """
+    <class description>
+    """
+    
+    IMPL_TYPE_ID = "hcrml"
+
+    def __init__(self, resource_ref, configuration):
+        plugin.ImplBase.__init__(self, resource_ref, configuration)
+        self.logger = logging.getLogger('cone.hcrml(%s)' % resource_ref)
+        self.configuration = configuration
+        self.hcrml_file = resource_ref
+
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation. 
+        @return: 
+        """
+        outputfile = self.__get_output_filename()
+        if outputfile != None:
+            # Create the path to the output file
+            output_path = os.path.dirname(outputfile)
+            if output_path != '' and not os.path.exists(output_path):
+                os.makedirs(output_path)
+        
+        # For output type 'hcr', write the binary repository file
+        if self.output_obj.type == 'hcr':
+            self.logger.info("Generating binary repository to '%s'" % outputfile)
+            writer = HcrWriter()
+            repo = self.output_obj.get_hcr_repository()
+            data = writer.get_repository_bindata(repo)
+            f = open(outputfile,'wb')
+            try:        f.write(data)
+            finally:    f.close()
+        elif self.output_obj.type == 'header':
+            self.logger.info("Generating header file to '%s'" % outputfile)
+            writer = HeaderWriter(outputfile, self.output_obj)
+            writer.write()
+        elif self.output_obj.type == None:
+            # The HCRML file contains no <output> element, so no output should
+            # be generated
+            pass
+
+    def get_refs(self):
+        return self.refs
+    
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        fname = self.__get_output_filename()
+        return [fname] if fname else []
+    
+    def __get_output_filename(self):
+        if self.output_obj.file != None:
+            return os.path.normpath(os.path.join(self.output, self.output_obj.file))
+        else:
+            return None
+
+
+class HcrmlReader(plugin.ReaderBase):
+    NAMESPACE = 'http://www.symbianfoundation.org/xml/hcrml/1'
+    FILE_EXTENSIONS = ['hcrml']
+    
+    def __init__(self, resource_ref, configuration):
+        self.configuration = configuration
+        self.hcrml_file = resource_ref
+        self.refs = []
+        self.namespaces = [self.NAMESPACE]
+        self.doc = None
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = HcrmlReader(resource_ref, configuration)
+        reader.doc = etree
+        
+        impl = HcrmlImpl(resource_ref, configuration)
+        impl.output_obj = reader.read_hcrml_output()
+        impl.refs = reader.refs
+        return impl
+
+    def read_hcrml_output(self, ignore_includes=False):
+        output = Output()
+        
+        # There should only be one <output> element, so use find()
+        out_elem = self.doc.find("{%s}output" % self.namespaces[0])
+        if out_elem != None:
+            version = out_elem.get('version')
+            read_only = out_elem.get('readOnly')
+            file = out_elem.get('file')
+            type = out_elem.get('type')
+            
+            if type == None or type == '':
+                raise NoTypeDefinedInOutPutTagError("Type attribute missing in hcrml file")
+            
+            if type not in ('hcr', 'header'): 
+               raise InvalidTypeDefinedInOutPutTagError("Type attribute invalid in hcrml file: %s" % type)
+           
+            output.version = version
+            output.read_only = read_only
+            output.file = file
+            output.type = type
+         
+            # An <output> element may contain <include> elements for including other
+            # HCRML files, so read and include categories from those
+            if not ignore_includes:
+                included_files = self.read_hcrml_includes(out_elem)
+                read_categories = self.read_categories_from_hcrml_files(included_files)
+                output.categories.extend(read_categories)
+            
+         
+        """ output tag is not mandatory, but there should be some categories included """
+        for cat_elem in self.doc.getiterator("{%s}category" % self.namespaces[0]):
+            category = self.read_hrcml_category(cat_elem)
+            output.categories.append(category)
+        return output 
+    
+    def read_hcrml_includes(self, output_elem):
+        """
+        Read all <include> elements under an <output> element.
+        @return: List of other HCRML files to include.
+        """
+        result = []
+        
+        include_refs = []
+        for include_elem in output_elem.findall("{%s}include" % self.namespaces[0]):
+            ref = include_elem.get('ref')
+            if ref != None: include_refs.append(ref)
+        
+        if include_refs:
+            # There are include refs, construct the list of files that should
+            # be included
+            all_files = self.configuration.list_resources()
+            included_files = []
+            for ref in include_refs:
+                files_by_ref = self.filter_file_list_by_include_ref(all_files, ref)
+                result.extend(files_by_ref)
+        
+        # Make sure that no file is in the list more than once
+        result = list(set(result))
+        return result
+        
+    def read_categories_from_hcrml_files(self, files):
+        """
+        Read all categories from the list of the given HCRML files.
+        """
+        categories = []
+        
+        for file in files:
+            # Skip the current file
+            if os.path.normpath(file) == os.path.normpath(self.hcrml_file):
+                continue
+            
+            # Read the <output> element and append its categories to the result list
+            reader = HcrmlReader(file, self.configuration)
+            reader.doc = self._read_xml_doc_from_resource(file, self.configuration)
+            # Read the output element, but ignore includes, since we are
+            # currently reading from inside an include
+            output_obj = reader.read_hcrml_output(ignore_includes=True)
+            categories.extend(output_obj.categories)
+            
+        return categories
+            
+    def read_hrcml_category(self,cat_elem):
+        category_uid = cat_elem.get('uid')
+        if category_uid == None or category_uid == '':
+           raise NoCategoryUIDInHcrmlFileError("No category uid attribute implemented in hcrml file!")
+        name = cat_elem.get('name')
+        if name == None or name == '':
+           raise NoCategoryNameInHcrmlFileError("No category name attribute implemented in hcrml file!")
+        category = Category()
+        category.name = name
+        try:
+            category.category_uid = long(category_uid)
+        except ValueError:
+            category.category_uid = long(category_uid, 16)
+        category.xml_elem = cat_elem  
+        for setting_elem in cat_elem.getiterator("{%s}setting" % self.namespaces[0]):
+             setting = self.read_hcrml_setting(setting_elem)
+             category.settings.append(setting)
+        return category
+            
+
+    def read_hcrml_setting(self,setting_elem):
+        
+        ref = setting_elem.get('ref')
+        if ref == None or ref == '':
+            raise NoRefInHcrmlFileError("No ref in setting tag attribute implemented in hcrml file!")
+        else:
+            self.refs.append(ref)
+        type = setting_elem.get('type')
+        if type == None or type == '':
+            raise NoTypeAttributeInSettingHcrmlFileError("No type in setting tag attribute implemented in hcrml file ref: %s" % ref )
+        name = setting_elem.get('name')
+        if name == None or name == '':
+            raise NoNameAttributeInSettingHcrmlFileError("No type in setting tag attribute implemented in hcrml file ref: %s" % ref )
+        id = setting_elem.get('id')
+        if id == None or id == '':
+            raise NoIdAttributeInSettingHcrmlFileError("No id in setting tag attribute implemented in hcrml file ref: %s" % ref )
+
+        comment = setting_elem.get('comment')
+        if comment == None:
+            comment = ''
+            
+        
+        setting = Setting(self.configuration)
+        setting.comment = comment
+        setting.name = name
+        setting.ref = ref
+        try:
+            setting.id = long(id)
+        except ValueError:
+            setting.id = long(id, 16)
+        setting.type = type
+        setting.xml_elem = setting_elem
+        for flag_elem in setting_elem.getiterator("{%s}flags" % self.namespaces[0]):
+             flag = self.read_hrcml_flags(setting_elem)
+             setting.flag = flag
+        return setting
+
+    def read_hrcml_flags(self,flag_elem):
+         Uninitialised = flag_elem.get('Uninitialised') 
+         Modifiable = flag_elem.get('Modifiable')
+         Persistent = flag_elem.get('Persistent')
+         flag = Flag()
+         flag.Uninitialised = Uninitialised
+         flag.Modifiable = Modifiable
+         flag.Persistent = Persistent
+         return flag
+     
+    def filter_file_list_by_include_ref(self, files, ref):
+        pattern = ref + '$'
+        pattern = pattern.replace('.', r'\.')
+        pattern = pattern.replace('*', '.*')
+        pattern = '(^|.*/)' + pattern
+        result = []
+        for file in files:
+            if re.match(pattern, file.replace('\\', '/')) != None:
+                result.append(file)
+        return result
+
+
+class Flag(object):
+    def __init__(self):
+        self.Uninitialised = 0
+        self.Modifiable    = 0
+        self.Persistent    = 0
+
+class Setting(object):
+    def __init__(self,configuration):
+        self.name   = None
+        self.ref    = None
+        self.type   = None
+        self.id = None
+        self.flag = None
+        self.comment = ''
+        self.configuration = configuration
+        
+    @property
+    def value(self):
+        dview = self.configuration.get_default_view()
+        feature = dview.get_feature(self.ref)
+        value = feature.get_value()
+        
+        if self.type in (HcrRecord.VALTYPE_ARRAY_INT32, HcrRecord.VALTYPE_ARRAY_UINT32):
+            # Convert string values to numbers
+            value = map(lambda x: self.__str_to_long(x), value)
+        elif self.type == HcrRecord.VALTYPE_BIN_DATA and feature.get_type() == 'string':
+            value = self.__hex_to_bindata(value)
+        return value
+    
+    def __str_to_long(self, str_value):
+        try:
+            return long(str_value)
+        except ValueError:
+            return long(str_value, 16)
+    
+    def __hex_to_bindata(self, hexdata):
+        orig_hexdata = hexdata
+        hexdata = hexdata.replace(' ', '').replace('\r', '').replace('\n', '').replace('\t', '')
+        if len(hexdata) % 2 != 0:
+            raise ValueError("Failed to convert %r into binary data: String length %d (whitespace stripped) is not divisible by 2", orig_hexdata, len(hexdata))
+        for c in hexdata:
+            if c not in "0123456789abcdefABCDEF":
+                raise ValueError("Failed to convert %r into binary data: Not a valid hex string", hexdata)
+        
+        temp = []
+        for i in xrange(len(hexdata) / 2):
+            start = i * 2
+            end   = start + 2 
+            temp.append(chr(int(hexdata[start:end], 16)))
+        return ''.join(temp)
+
+class Category(object):
+    def __init__(self):
+        self.name   = None
+        self.category_uid    = None
+        self.settings = []
+    
+    def get_hcr_records(self):
+        """
+        Return a list of HcrRecord objects created based on this category's settings.
+        """
+        result = []
+        for setting in self.settings:
+            record = HcrRecord(setting.type, setting.value, self.category_uid, setting.id)
+            flag = setting.flag
+            if flag:
+                record.flags = 0
+                if flag.Uninitialised == '1':   record.flags |= HcrRecord.FLAG_UNINITIALIZED
+                if flag.Modifiable == '1':      record.flags |= HcrRecord.FLAG_MODIFIABLE
+                if flag.Persistent == '1':      record.flags |= HcrRecord.FLAG_PERSISTENT
+            result.append(record)
+        return result 
+        
+
+class Output(object):
+    def __init__(self):
+        self.file = None
+        self.type = None
+        self.version = None
+        self.read_only = None
+        self.categories = []
+    
+    def get_hcr_records(self):
+        """
+        Return a list of HcrRecord objects created based on this output object's categories.
+        """
+        result = []
+        for category in self.categories:
+            result.extend(category.get_hcr_records())
+        return result
+    
+    def get_hcr_repository(self):
+        """
+        Return a HcrRepository object created based on this output.
+        
+        The type of this Output object should be 'hcr', otherwise and an exception is raised.
+        """
+        if self.type != 'hcr':
+            raise RuntimeError("get_hcr_repository() called on an Output object with type '%s' (should be 'hcr')" % self.type)
+        
+        return HcrRepository(self.get_hcr_records())
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/hcrrepository.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,137 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import logging
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+
+class HcrRepository(object):
+    FLAG_READ_ONLY    = 1
+    FLAG_NON_VOLATILE = 2
+    FLAG_BOOT_ONLY    = 4
+    
+    def __init__(self, records, version=1, flags=FLAG_READ_ONLY):
+        self.records = records
+        self.version = version
+        self.flags   = flags
+    
+    def count_records(self, category_id, element_id):
+        """
+        Return the number of records in the repository with the given
+        setting ID (category ID - element ID pair).
+        """
+        count = 0
+        for r in self.records:
+            if r.category_id == category_id and r.element_id == element_id:
+                count += 1
+        return count
+    
+    def get_duplicate_record_ids(self):
+        """
+        Return a list of duplicate record IDs in the repository.
+        The list contains tuples of the form (category_id, element_id).
+        """
+        result = []
+        for r in self.records:
+            count = self.count_records(r.category_id, r.element_id)
+            record_id = (r.category_id, r.element_id)
+            if count > 1 and record_id not in result:
+                result.append(record_id)
+        return result
+    
+    def __repr__(self):
+        buf = ["HcrRepository(version=%r, flags=%r, records=[" % (self.version, self.flags)]
+        if len(self.records) > 0:
+            buf.append('\n')
+            for record in sorted(self.records):
+                buf.append("    %r,\n" % record)
+        buf.append('])')
+        return ''.join(buf)
+    
+    def __eq__(self, other):
+        return sorted(self.records) == sorted(other.records) \
+            and self.version == other.version \
+            and self.flags == other.flags
+    
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+class HcrRecord(object):
+    # Record value types used in HCRML
+    VALTYPE_INT32           = 'int32'
+    VALTYPE_INT16           = 'int16'
+    VALTYPE_INT8            = 'int8'
+    VALTYPE_BOOL            = 'bool'
+    VALTYPE_UINT32          = 'uint32'
+    VALTYPE_UINT16          = 'uint16'
+    VALTYPE_UINT8           = 'uint8'
+    VALTYPE_LIN_ADDR        = 'linaddr'
+    VALTYPE_BIN_DATA        = 'bindata'
+    VALTYPE_TEXT8           = 'text8'
+    VALTYPE_ARRAY_INT32     = 'arrayint32'
+    VALTYPE_ARRAY_UINT32    = 'arrayuint32'
+    VALTYPE_INT64           = 'int64'
+    VALTYPE_UINT64          = 'uint64'
+    
+    FLAG_UNINITIALIZED = 1
+    FLAG_MODIFIABLE    = 2
+    FLAG_PERSISTENT    = 4
+
+
+    def __init__(self, type, value, category_id, element_id, flags=0):
+        # Check the value type
+        val_types = []
+        for name, val in self.__class__.__dict__.iteritems():
+            if name.startswith('VALTYPE_'):
+                val_types.append(val)
+        if type not in val_types:
+            raise ValueError("Invalid HCRML record type '%s'" % type)
+        
+        self.type           = type
+        self.value          = value
+        self.category_id    = category_id
+        self.element_id     = element_id
+        self.flags          = flags
+
+    def __repr__(self):
+        return 'HcrRecord(type=%r, value=%r, category_id=%r, element_id=%r, flags=%r)' \
+            % (self.type, self.value, self.category_id, self.element_id, self.flags)
+    
+    def __lt__(self, other):
+        # Note:
+        # The < operator is implemented purely for the sake of sorting records
+        # in unit tests for comparison, the sorting is NOT the one used when
+        # actually writing the records to file
+        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
+        for attr_name in attrs_to_check:
+            x = getattr(self, attr_name)
+            y = getattr(other, attr_name)
+            if x < y:       return True
+            elif x == y:    continue # Equal, so need to check the next one
+            else:           return False
+        return False
+    
+    def __eq__(self, other):
+        attrs_to_check = ['type', 'value', 'category_id', 'element_id', 'flags']
+        for attr_name in attrs_to_check:
+            x = getattr(self, attr_name)
+            y = getattr(other, attr_name)
+            if x != y: return False
+        return True
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/header_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+
+class HeaderWriter(object):
+    def __init__(self,output_file, output_obj):
+        self.output_obj = output_obj
+        self.output_file = output_file
+
+    def write(self):
+        header_guard = os.path.basename(self.output_file).upper()
+        header_guard = header_guard.replace('/', '_').replace('\\', '_').replace('.', '_')
+        lines = [
+            "#ifndef %s" % header_guard,
+            "#define %s" % header_guard,
+            "",
+            "#include <hcr.h>",
+            "",
+        ]
+        
+        # Sort by category UID to make testing easier
+        categories = sorted(self.output_obj.categories, key=lambda c: c.category_uid)
+        for i, category in enumerate(categories):
+            lines.append('const HCR::TCategoryUid %s = 0x%08X;' % (category.name, category.category_uid))
+            lines.append('')
+            
+            # Again, sort for testability
+            settings = sorted(category.settings, key=lambda s: s.id)
+            max_name_len = max([len(s.name) for s in settings])
+            format = "const HCR::TElementId %%-%ds = 0x%%08X;" % max_name_len
+            for setting in settings:
+                if setting.comment: lines.append("// %s" % setting.comment)
+                lines.append(format % (setting.name, setting.id))
+            
+            if i + 1 != len(categories):
+                lines.append('')
+                lines.append('// ' + 70 * '-')
+                lines.append('')
+            
+        lines.extend([
+            "",
+            "#endif",
+        ])
+        
+        f = open(self.output_file, 'wb')
+        try:        f.write(os.linesep.join(lines))
+        finally:    f.close()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
Binary file configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_dat/hcr.dat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/multi_header/multi_header.h	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+#ifndef MULTI_HEADER_H
+#define MULTI_HEADER_H
+
+#include <hcr.h>
+
+const HCR::TCategoryUid KTest1Category = 0x10001234;
+
+const HCR::TElementId KInt8Setting       = 0x00000000;
+// Test setting 2
+const HCR::TElementId KUint32Setting     = 0x00000001;
+const HCR::TElementId KInt32ArraySetting = 0x00000002;
+const HCR::TElementId KBinDataSetting    = 0x00000003;
+
+// ----------------------------------------------------------------------
+
+const HCR::TCategoryUid KTest2Category = 0x20001234;
+
+const HCR::TElementId KLinAddrSetting     = 0x00000000;
+const HCR::TElementId KInt64Setting       = 0x00000001;
+const HCR::TElementId KUint32ArraySetting = 0x00000002;
+const HCR::TElementId KText8Setting       = 0x00000003;
+
+// ----------------------------------------------------------------------
+
+const HCR::TCategoryUid KTest3Category = 0x30001234;
+
+const HCR::TElementId KBoolSetting = 0x00000000;
+
+#endif
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_dat/hcr.dat has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/expected/single_header/test1.h	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+#ifndef TEST1_H
+#define TEST1_H
+
+#include <hcr.h>
+
+const HCR::TCategoryUid KTest1Category = 0x10001234;
+
+const HCR::TElementId KInt8Setting       = 0x00000000;
+// Test setting 2
+const HCR::TElementId KUint32Setting     = 0x00000001;
+const HCR::TElementId KInt32ArraySetting = 0x00000002;
+const HCR::TElementId KBinDataSetting    = 0x00000003;
+
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/generate_repo.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+"""
+Script for generating expected data for the tests where output
+is written to a file.
+"""
+
+import os, unittest
+import __init__
+
+from testautomation.utils import hex_to_bindata
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin import hcr_exceptions
+    
+def generate_repository(file_path, records):
+    dir = os.path.dirname(file_path)
+    if dir != '' and not os.path.exists(dir):
+        os.makedirs(dir)
+    
+    writer = HcrWriter()
+    repo = HcrRepository(records)
+    f = open(file_path, "wb")
+    try:        f.write(writer.get_repository_bindata(repo))
+    finally:    f.close()
+    
+    print "Generated '%s' with %d records" % (file_path, len(records))
+
+def generate_expected_data():
+    records = []
+    category = 0x10001234
+    records.append(HcrRecord(HcrRecord.VALTYPE_INT32, 0, category, 0))
+    records.append(HcrRecord(HcrRecord.VALTYPE_INT32, 0, category, 1))
+    records.append(HcrRecord(HcrRecord.VALTYPE_INT32, 0, category, 2))
+
+    generate_repository("generated/expected/project/hcr.dat", records)
+    
+    # --------------------------------------------------------------
+    
+    records = []
+    category = 0x10001234
+    records.append(HcrRecord(HcrRecord.VALTYPE_INT8, 125, category, 0))
+    records.append(HcrRecord(HcrRecord.VALTYPE_UINT32, 4000000000, category, 1))
+    records.append(HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32, [-1, -20, -300, -4000, -50000], category, 2))
+    records.append(HcrRecord(HcrRecord.VALTYPE_BIN_DATA, hex_to_bindata('00112233 DEADBEEF CAFE 50'), category, 3))
+    
+    category = 0x20001234
+    records.append(HcrRecord(HcrRecord.VALTYPE_LIN_ADDR, 0x10203040, category, 0))
+    records.append(HcrRecord(HcrRecord.VALTYPE_INT64, 1234567890123456789, category, 1))
+    records.append(HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, [1, 20, 300, 4000, 50000], category, 2))
+    records.append(HcrRecord(HcrRecord.VALTYPE_TEXT8, u'100\u20ac', category, 3))
+    
+    category = 0x30001234
+    records.append(HcrRecord(HcrRecord.VALTYPE_BOOL, False, category, 0))
+
+    generate_repository("generated/expected/multifile_project/hcr.dat", records)
+
+if __name__ == "__main__":
+    generate_expected_data()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+<feature ref="HcrTest1" name="HCR test 1">
+	<setting ref="Int8Setting" name="Int8 setting" type="int" />
+	<setting ref="Uint32Setting" name="Uint32 setting" type="int" />
+	<setting ref="Int32ArraySetting" name="Int32 array setting" type="sequence">
+		<setting ref="Value" name="Element value" type="int"/>
+	</setting>
+	<setting ref="BinDataSetting" name="Binary data setting" type="string"/>
+</feature>
+
+<data>
+	<HcrTest1>
+		<Int8Setting>125</Int8Setting>
+		<Uint32Setting>4000000000</Uint32Setting>
+		
+		<Int32ArraySetting template="true">
+			<Value>0</Value>
+		</Int32ArraySetting>
+		<Int32ArraySetting><Value>-1</Value></Int32ArraySetting>
+		<Int32ArraySetting><Value>-20</Value></Int32ArraySetting>
+		<Int32ArraySetting><Value>-300</Value></Int32ArraySetting>
+		<Int32ArraySetting><Value>-4000</Value></Int32ArraySetting>
+		<Int32ArraySetting><Value>-50000</Value></Int32ArraySetting>
+		
+		<BinDataSetting>00112233 DEADBEEF CAFE 50</BinDataSetting>
+	</HcrTest1>
+</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test2.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+<confml:feature ref="HcrTest2" name="HCR test 2">
+	<confml:setting ref="LinAddrSetting" name="Linear address setting" type="int"/>
+	<confml:setting ref="Int64Setting" name="Int64 setting" type="int"/>
+	<confml:setting ref="Uint32ArraySetting" name="Uint32 array setting" type="sequence">
+		<confml:setting ref="Value" name="Element value" type="int"/>
+	</confml:setting>
+	<confml:setting ref="TextSetting" name="Text setting" type="string"/>
+</confml:feature>
+
+<confml:data>
+    <confml:HcrTest2>
+        <confml:LinAddrSetting>0x10203040</confml:LinAddrSetting>
+        <confml:Int64Setting>1234567890123456789</confml:Int64Setting>
+        
+        <confml:Uint32ArraySetting template="true">
+            <confml:Value>0</confml:Value>
+        </confml:Uint32ArraySetting>
+        <confml:Uint32ArraySetting><confml:Value>1</confml:Value></confml:Uint32ArraySetting>
+        <confml:Uint32ArraySetting><confml:Value>20</confml:Value></confml:Uint32ArraySetting>
+        <confml:Uint32ArraySetting><confml:Value>300</confml:Value></confml:Uint32ArraySetting>
+        <confml:Uint32ArraySetting><confml:Value>4000</confml:Value></confml:Uint32ArraySetting>
+        <confml:Uint32ArraySetting><confml:Value>50000</confml:Value></confml:Uint32ArraySetting>
+        
+        <confml:TextSetting>100€</confml:TextSetting>
+    </confml:HcrTest2>
+</confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/confml/test3.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+<confml:feature ref="HcrTest3" name="HCR test 3">
+	<confml:setting ref="BoolSetting" name="Bool setting" type="boolean"/>
+</confml:feature>
+
+<confml:data>
+    <confml:HcrTest3>
+        <confml:BoolSetting>false</confml:BoolSetting>
+    </confml:HcrTest3>
+</confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/hcr_dat.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+  <output file="hcr.dat" type="hcr" version="1" readOnly="1">
+    <include ref="*.hcrml"/>
+  </output>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/multi_header.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+  <output file="multi_header.h" type="header">
+    <include ref="*.hcrml"/>
+  </output>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test1.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+<output file="test1.h" type="header">
+  <category name="KTest1Category" uid="0x10001234">
+    <setting ref="HcrTest1.Int8Setting"             name="KInt8Setting"         type="int8"         id="0x0"/>
+    <setting ref="HcrTest1.Uint32Setting"           name="KUint32Setting"       type="uint32"       id="0x1" comment="Test setting 2"/>
+    <setting ref="HcrTest1.Int32ArraySetting.Value" name="KInt32ArraySetting"   type="arrayint32"   id="0x2"/>
+    <setting ref="HcrTest1.BinDataSetting"          name="KBinDataSetting"      type="bindata"      id="0x3"/>
+  </category>
+</output>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test2.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+<output file="test2.h" type="header">
+  <category name="KTest2Category" uid="0x20001234">
+    <setting ref="HcrTest2.LinAddrSetting"           name="KLinAddrSetting"      type="linaddr"      id="0"/>
+    <setting ref="HcrTest2.Int64Setting"             name="KInt64Setting"        type="int64"        id="1"/>
+    <setting ref="HcrTest2.Uint32ArraySetting.Value" name="KUint32ArraySetting"  type="arrayuint32"  id="2"/>
+    <setting ref="HcrTest2.TextSetting"              name="KText8Setting"        type="text8"        id="3"/>
+  </category>
+</output>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/implml/test3.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+  <category name="KTest3Category" uid="0x30001234">
+    <setting ref="HcrTest3.BoolSetting" name="KBoolSetting" type="bool" id="0">
+      <flags Uninitialised="1" Modifiable="0" Persistent="1"/>
+    </setting>
+  </category>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/layer1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="confml/test1.confml"/>
+  <xi:include href="confml/test2.confml"/>
+  <xi:include href="confml/test3.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/multifile_project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="layer1/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/confml/hcrexample.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" name="hcrexample">
+  <feature ref="hcrexample" name="Hardware configuration">
+    <desc>example hardware configuration repository confml</desc>
+    <setting ref="DebounceInterval" name="DebounceInterval" type="int"/>
+    <setting ref="GPIO_1" name="GPIO_1" type="int"/>
+    <setting ref="GPIO_2" name="GPIO_2" type="int"/>
+  </feature>
+  <data>
+    <hcrexample>
+      <DebounceInterval>0</DebounceInterval>
+      <GPIO_1>0</GPIO_1>
+      <GPIO_2>0</GPIO_2>
+    </hcrexample>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/implml/example.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+<output file="hcr.dat" type="hcr">
+  <category name="KCatGPIO" uid="0x10001234">
+    <setting ref="hcrexample.DebounceInterval" name="KElmGPIO_DebounceInterval" type="int32" id="0"/>
+    <setting ref="hcrexample.GPIO_1" name="KElmGPIO_1" type="int32" id="1" comment="Pin1"/>
+    <setting ref="hcrexample.GPIO_2" name="KElmGPIO_2" type="int32" id="2" comment="Pin2"/>
+  </category>
+</output>
+</hcr>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/project/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcr_header.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,90 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import __init__
+
+from testautomation.utils import hex_to_bindata
+
+from hcrplugin import hcr_header
+from hcrplugin.hcr_exceptions import InvalidHcrHeaderError
+
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+
+class TestHCRHeader(unittest.TestCase):
+    def test_hcr_header_dumps_empty(self):
+        hcrh = hcr_header.HcrHeader()
+        self.assertEquals(len(hcrh.dumps()), 32)
+        expected_data = hex_to_bindata(
+            "48435266 0000 0000 00000000 00000000"+\
+            "00000000 000000000000000000000000")
+        self.assertEquals(hcrh.dumps(), expected_data)
+
+    def test_hcr_header_loads_empty(self):
+        hcrh = hcr_header.HcrHeader()
+        try:
+            hcrh.loads('')
+            self.fail('parsing of empty string succeeded?')
+        except InvalidHcrHeaderError:
+            pass
+
+    def test_hcr_header_loads_invalid_signature(self):
+        hcrh = hcr_header.HcrHeader()
+        try:
+            hcrh.loads(32*' ')
+            self.fail('parsing of empty string succeeded?')
+        except InvalidHcrHeaderError:
+            pass
+
+    def test_hcr_header_loads_zero(self):
+        hcrh = hcr_header.HcrHeader()
+        header_data = hex_to_bindata(
+            "48435266 0000 0000 00000000 00000000"+\
+            "00000000 000000000000000000000000")
+        hcrh.loads(header_data)
+        self.assertEquals(hcrh.version, 0)
+        self.assertEquals(hcrh.flags, 0)
+        self.assertEquals(hcrh.nrecords, 0)
+        self.assertEquals(hcrh.lsd_offset, 0)
+        self.assertEquals(hcrh.lsd_size, 0)
+
+    def test_hcr_header_dumps_some_data(self):
+        hcrh = hcr_header.HcrHeader()
+        hcrh.version = 5
+        hcrh.flags = 6
+        hcrh.nrecords = 10
+        hcrh.lsd_offset = 18
+        hcrh.lsd_size = 32
+        expected_data = hex_to_bindata(
+            "48435266 0500 0600 0A000000 12000000"+\
+            "20000000 000000000000000000000000")
+        self.assertEquals(hcrh.dumps(), expected_data)
+
+    def test_hcr_header_loads_some_data(self):
+        hcrh = hcr_header.HcrHeader()
+        header_data = hex_to_bindata(
+            "48435266 0500 0600 0A000000 12000000"+\
+            "20000000 000000000000000000000000")
+        hcrh.loads(header_data)
+        self.assertEquals(hcrh.version, 5)
+        self.assertEquals(hcrh.flags, 6)
+        self.assertEquals(hcrh.nrecords, 10)
+        self.assertEquals(hcrh.lsd_offset, 18)
+        self.assertEquals(hcrh.lsd_size, 32)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_impl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,153 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, unittest
+import __init__
+from cone.public import plugin
+from hcrplugin.hcrml_parser import HcrmlReader
+
+def impl_from_resource(resource_ref, configuration):
+    """
+    Read a HCRML implementation from the given resource in a configuration.
+    """
+    doc_root = plugin.ReaderBase._read_xml_doc_from_resource(resource_ref, configuration)
+    return HcrmlReader.read_impl(resource_ref, configuration, doc_root)
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+NAMESPACE = 'http://www.symbianfoundation.org/xml/hcrml/1'
+
+TEST_HCRML_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="%s">
+  <output file="test.h" type="header">
+    <category name="KTestCategory" uid="0x11223344">
+      <setting ref="Feature1.Setting1" name="F1S1" type="int32" id="0"/>
+      <setting ref="Feature1.Setting2" name="F1S2" type="int32" id="1"/>
+      <setting ref="Feature2.Setting1" name="F2S1" type="int32" id="2"/>
+      <setting ref="Feature2.Setting2" name="F2S2" type="int32" id="3"/>
+    </category>
+  </output>
+</hcr>
+""" % NAMESPACE
+
+HCR_DAT_HCRML_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="%s">
+  <output file="sys/data/hcr.dat" type="hcr">
+    <include ref="*.hcrml"/>
+  </output>
+</hcr>
+""" % NAMESPACE
+
+NO_OUTPUT_HCRML_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="%s">
+  <category name="KTestCategory2" uid="0x44332211">
+    <setting ref="Feature3.Setting1" name="F3S1" type="int32" id="0x10"/>
+    <setting ref="Feature3.Setting2" name="F3S2" type="int32" id="0x20"/>
+  </category>
+</hcr>
+""" % NAMESPACE
+
+class Dummy(object):
+    pass
+
+class DummyConfiguration(object):
+    RESOURCES = {
+        'layer1/test.hcrml'         : TEST_HCRML_DATA,
+        'layer2/no_output.hcrml'    : NO_OUTPUT_HCRML_DATA,
+        'layer4/hcr_dat.hcrml'      : HCR_DAT_HCRML_DATA,
+    }
+    
+    def list_resources(self):
+        return sorted(self.RESOURCES.keys())
+    
+    def get_resource(self, res_ref):
+        res = Dummy()
+        res.read = lambda: self.RESOURCES[res_ref]
+        res.close = lambda: None
+        return res
+    
+    def get_default_view(self):
+        view = Dummy()
+        feature = Dummy()
+        feature.get_value = lambda: 0
+        view.get_feature = lambda ref: feature
+        return view
+
+class TestHcrmlImpl(unittest.TestCase):
+    
+    def test_has_ref(self):
+        impl = impl_from_resource('layer1/test.hcrml', DummyConfiguration())
+        self.assertTrue(impl.has_ref(['Feature1.Setting1']))
+        self.assertTrue(impl.has_ref(['Feature1.Setting2']))
+        self.assertTrue(impl.has_ref(['Feature2.Setting1']))
+        self.assertTrue(impl.has_ref(['Feature2.Setting2']))
+        self.assertTrue(impl.has_ref(['Feature1.Setting1', 'foo.bar']))
+        self.assertTrue(impl.has_ref(['Feature1.Setting1', 'Feature1.Setting2']))
+        
+        self.assertFalse(impl.has_ref([]))
+        self.assertFalse(impl.has_ref(['foo.bar']))
+        self.assertFalse(impl.has_ref(['Feature1.Setting3']))
+        self.assertFalse(impl.has_ref(['x.y.z', 'foo.bar']))
+        self.assertFalse(impl.has_ref(['Feature3.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature3.Setting2']))
+        
+        impl = impl_from_resource('layer2/no_output.hcrml', DummyConfiguration())
+        self.assertFalse(impl.has_ref([]))
+        self.assertFalse(impl.has_ref(['foo.bar']))
+        self.assertFalse(impl.has_ref(['Feature1.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature1.Setting2']))
+        self.assertFalse(impl.has_ref(['Feature2.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature2.Setting2']))
+        self.assertTrue(impl.has_ref(['Feature3.Setting1']))
+        self.assertTrue(impl.has_ref(['Feature3.Setting2']))
+        
+        
+        # hcr_dat.hcrml includes test.hcrml and no_output.hcrml, but it should
+        # not say that it has the setting references specified in those files
+        impl = impl_from_resource('layer4/hcr_dat.hcrml', DummyConfiguration())
+        repo = impl.output_obj.get_hcr_repository()
+        # Check that the hcr_dat.hcrml implementation does contain the
+        # records
+        self.assertEquals(len(repo.records), 6)
+        # Check that it doesn't report that it has the references
+        self.assertFalse(impl.has_ref([]))
+        self.assertFalse(impl.has_ref(['foo.bar']))
+        self.assertFalse(impl.has_ref(['Feature1.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature1.Setting2']))
+        self.assertFalse(impl.has_ref(['Feature2.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature2.Setting2']))
+        self.assertFalse(impl.has_ref(['Feature3.Setting1']))
+        self.assertFalse(impl.has_ref(['Feature3.Setting2']))
+        
+        
+    def test_list_output_files(self):
+        output_dir = 'some/test/output'
+        
+        impl = impl_from_resource('layer1/test.hcrml', DummyConfiguration())
+        impl.set_output_root(output_dir)
+        self.assertEquals(
+            impl.list_output_files(),
+            [os.path.normpath(os.path.join(output_dir, 'test.h'))])
+        
+        impl = impl_from_resource('layer4/hcr_dat.hcrml', DummyConfiguration())
+        impl.set_output_root(output_dir)
+        self.assertEquals(
+            impl.list_output_files(),
+            [os.path.normpath(os.path.join(output_dir, 'sys/data/hcr.dat'))])
+        
+        impl = impl_from_resource('layer2/no_output.hcrml', DummyConfiguration())
+        impl.set_output_root(output_dir)
+        self.assertEquals(impl.list_output_files(), [])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,249 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import __init__
+import re
+import logging
+import xml.parsers.expat
+import codecs
+from hcrplugin.hcr_exceptions import *
+from hcrplugin.hcrrepository import HcrRecord, HcrRepository
+from hcrplugin.hcrml_parser import *
+
+
+from testautomation.utils import hex_to_bindata
+
+
+from cone.public import api, exceptions
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+from cone.public import exceptions,plugin,utils,api
+
+
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+NAMESPACE = 'http://www.symbianfoundation.org/xml/hcrml/1'
+
+
+class DummyConfiguration(object):
+    RESOURCES = {
+        'layer1/dummy.hcrml'    : '<hcr xmlns="%s"><category name="Cat0" uid="0"/></hcr>' % NAMESPACE,
+        'layer1/dummy1.hcrml'   : '<hcr xmlns="%s"><category name="Cat1" uid="1"/></hcr>' % NAMESPACE,
+        'layer2/dummy2.hcrml'   : '<hcr xmlns="%s"><category name="Cat2" uid="2"/></hcr>' % NAMESPACE,
+        'layer2/dummy3.hcrml'   : '<hcr xmlns="%s"><category name="Cat3" uid="3"/></hcr>' % NAMESPACE,
+        'layer3/dummy.gcfml'    : '',
+        'layer3/dummy.crml'     : '',
+        'layer4/dummy.ruleml'   : '',
+        'layer4/hcr_dat.hcrml'  : '<hcr xmlns="%s"><output file="some/test/hcr.dat" type="hcr"><include ref="*.hcrml"/></output></hcr>' % NAMESPACE,
+    }
+    
+    def list_resources(self):
+        return sorted(self.RESOURCES.keys())
+    
+    def get_resource(self, res_ref):
+        class DummyResource(object):
+            def __init__(self, data):   self.data = data
+            def read(self):             return self.data
+            def close(self):            pass
+        return DummyResource(self.RESOURCES[res_ref])
+
+
+class TestHCRHeader(unittest.TestCase):
+
+    def setUp(self):
+        self.reader = HcrmlReader(None, None)
+
+    def test_read_hcrml_output(self):
+        xml = '<hcr xmlns="%s"><output file="some/test/file.h" type="header"/></hcr>' % NAMESPACE
+        self.reader.doc = ElementTree.fromstring(xml)
+        output = self.reader.read_hcrml_output()
+        self.assertEquals(output.type, 'header')
+        self.assertEquals(output.file, 'some/test/file.h')
+        self.assertEquals(output.version, None)
+        self.assertEquals(output.read_only, None)
+        self.assertEquals(output.categories, [])
+    
+    def _run_test_read_invalid_hcrml_output(self, xml, expected_exception):
+        try:
+            self.reader.doc = ElementTree.fromstring(xml)
+            self.reader.read_hcrml_output()
+            self.fail("Expected exception not raised!")
+        except expected_exception:
+            pass
+    
+    def test_read_invalid_hcrml_output(self):
+        xml = '<hcr xmlns="%s"><output file="some/test/file.h"/></hcr>' % NAMESPACE
+        self._run_test_read_invalid_hcrml_output(xml, NoTypeDefinedInOutPutTagError)
+        
+        xml = '<hcr xmlns="%s"><output file="some/test/file.h" type="foobar"/></hcr>' % NAMESPACE
+        self._run_test_read_invalid_hcrml_output(xml, InvalidTypeDefinedInOutPutTagError)
+        
+    
+    def test_read_hcrml_output_with_include(self):
+        config = DummyConfiguration()
+        resource_ref =  'layer4/hcr_dat.hcrml'
+        
+        self.reader = HcrmlReader(resource_ref, config)
+        self.reader.doc = ElementTree.fromstring(config.get_resource(resource_ref).read())
+        output = self.reader.read_hcrml_output()
+        self.assertEquals(output.type, 'hcr')
+        self.assertEquals(output.file, 'some/test/hcr.dat')
+        self.assertEquals(
+            sorted([cat.category_uid for cat in output.categories]),
+            sorted([0, 1, 2, 3]))
+
+    
+    def test_read_hcrml_output_with_overlapping_includes(self):
+        config = DummyConfiguration()
+        resource_ref =  'layer4/hcr_dat.hcrml'
+        
+        XML = """<hcr xmlns="%s">
+            <output file="hcr.dat" type="hcr">
+                <include ref="dummy.hcrml"/>
+                <include ref="dummy2.hcrml"/>
+                <include ref="layer1/*.hcrml"/>
+            </output>
+        </hcr>
+        """% NAMESPACE
+        
+        self.reader = HcrmlReader(resource_ref, config)
+        self.reader.doc = ElementTree.fromstring(XML)
+        output = self.reader.read_hcrml_output()
+        self.assertEquals(output.type, 'hcr')
+        self.assertEquals(output.file, 'hcr.dat')
+        self.assertEquals(
+            sorted([cat.category_uid for cat in output.categories]),
+            sorted([0, 1, 2]))
+
+    def test_read_hcrml_category(self):
+        xml = '<category name="KCatGPIO" uid="0x10001234"/>'
+        etree = ElementTree.fromstring(xml)
+        category = self.reader.read_hrcml_category(etree)
+        self.assertEquals(category.name, 'KCatGPIO')
+        self.assertEquals(category.category_uid, 0x10001234)
+    
+    def _run_test_read_invalid_hcrml_category(self, xml, expected_exception):
+        try:
+            etree = ElementTree.fromstring(xml)
+            setting = self.reader.read_hrcml_category(etree)
+            self.fail("Expected exception not raised!")
+        except expected_exception:
+            pass
+    
+    def test_read_invalid_hcrml_category(self):
+        xml = '<category name="KCatGPIO"/>'
+        self._run_test_read_invalid_hcrml_category(xml, NoCategoryUIDInHcrmlFileError)
+        xml = '<category uid="0x10001234"/>'
+        self._run_test_read_invalid_hcrml_category(xml, NoCategoryNameInHcrmlFileError)
+
+    def test_read_hcrml_setting(self):
+        xml = '<setting ref="hcrexample.DebounceInterval" name="KElmGPIO_DebounceInterval" type="int32" id="0"/>'
+        etree = ElementTree.fromstring(xml)
+        setting = self.reader.read_hcrml_setting(etree)
+        self.assertEquals(setting.ref, 'hcrexample.DebounceInterval')
+        self.assertEquals(setting.name, 'KElmGPIO_DebounceInterval')
+        self.assertEquals(setting.type, 'int32')
+        self.assertEquals(setting.id, 0)
+    
+    def _run_test_read_invalid_hcrml_setting(self, xml, expected_exception):
+        try:
+            etree = ElementTree.fromstring(xml)
+            setting = self.reader.read_hcrml_setting(etree)
+            self.fail("Expected exception not raised!")
+        except expected_exception:
+            pass
+    
+    def test_read_invalid_hcrml_setting(self):
+        xml = '<setting name="xyz" type="int32" id="0"/>'
+        self._run_test_read_invalid_hcrml_setting(xml, NoRefInHcrmlFileError)
+        
+        xml = '<setting ref="x.y" name="xyz" id="0"/>'
+        self._run_test_read_invalid_hcrml_setting(xml, NoTypeAttributeInSettingHcrmlFileError)
+        
+        xml = '<setting ref="x.y" type="int32" id="0"/>'
+        self._run_test_read_invalid_hcrml_setting(xml, NoNameAttributeInSettingHcrmlFileError)
+        
+        xml = '<setting ref="x.y" name="xyz" type="int32"/>'
+        self._run_test_read_invalid_hcrml_setting(xml, NoIdAttributeInSettingHcrmlFileError)
+
+        
+
+    def test_read_hcrml_flag(self):
+        xml = '<flags Uninitialised="0" Modifiable="0" Persistent="0"/>'
+        etree = ElementTree.fromstring(xml)
+        flag = self.reader.read_hrcml_flags(etree)
+        self.assertEquals(flag.Uninitialised, '0')
+        self.assertEquals(flag.Modifiable, '0')
+        self.assertEquals(flag.Persistent, '0')
+        
+    def test_filter_file_list_by_include_ref(self):
+        lst = [
+            'layer1/dummy.hcrml',
+            'dummy.hcrml',
+            'layer1/dummy1.hcrml',
+            'layer2/dummy2.hcrml',
+            'layer2/dummy3.hcrml',
+            'layer3/test_dummy.hcrml',
+            'layer3/dummy.gcfml',
+            'layer3/dummy.crml',
+            'layer4/hcr_dat.hcrml',
+        ]
+        
+        filt = self.reader.filter_file_list_by_include_ref
+        
+        self.assertEquals(sorted(filt(lst, '*.hcrml')), sorted([
+            'dummy.hcrml',
+            'layer1/dummy.hcrml',
+            'layer1/dummy1.hcrml',
+            'layer2/dummy2.hcrml',
+            'layer2/dummy3.hcrml',
+            'layer3/test_dummy.hcrml',
+            'layer4/hcr_dat.hcrml',]))
+        
+        self.assertEquals(sorted(filt(lst, 'dummy.hcrml')), sorted([
+            'dummy.hcrml',
+            'layer1/dummy.hcrml',]))
+        
+        self.assertEquals(sorted(filt(lst, 'dummy*.hcrml')), sorted([
+            'dummy.hcrml',
+            'layer1/dummy.hcrml',
+            'layer1/dummy1.hcrml',
+            'layer2/dummy2.hcrml',
+            'layer2/dummy3.hcrml',]))
+        
+        self.assertEquals(sorted(filt(lst, 'layer1/*')), sorted([
+            'layer1/dummy.hcrml',
+            'layer1/dummy1.hcrml',]))
+        
+        self.assertEquals(sorted(filt(lst, 'layer4/*')), sorted([
+            'layer4/hcr_dat.hcrml']))
+        
+        self.assertEquals(sorted(filt(lst, 'hcr_dat.hcrml')), sorted([
+            'layer4/hcr_dat.hcrml']))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrml_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, unittest
+import __init__
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin import hcr_exceptions
+from cone.public import api, plugin
+from testautomation.base_testcase import BaseTestCase
+
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestHCRMLWrite(BaseTestCase):
+    def _run_generate_test(self, project_dir, output_dir, expected_dir, hcrml_file):
+        project_dir = os.path.join(ROOT_PATH, project_dir)
+        output_dir = os.path.join(ROOT_PATH, output_dir)
+        if expected_dir != None:
+            expected_dir = os.path.join(ROOT_PATH, expected_dir)
+        
+        self.remove_if_exists(output_dir)
+        
+        prj = api.Project(api.Storage.open(project_dir))
+        config = prj.get_configuration('root.confml')
+        impls = plugin.ImplFactory.get_impls_from_file(hcrml_file, config)
+        self.assertEquals(len(impls), 1)
+        impl = impls[0]
+        impl.set_output_root(output_dir)
+        impl.generate()
+        
+        if expected_dir != None:
+            self.assert_dir_contents_equal(expected_dir, output_dir, ['.svn'])
+        else:
+            self.assertFalse(os.path.exists(output_dir))
+    
+    def test_create_hcr_dat_from_single_hcrml_file(self):
+        self._run_generate_test(
+            project_dir     = 'project',
+            output_dir      = 'output/single_dat',
+            expected_dir    = 'expected/single_dat',
+            hcrml_file      = 'implml/example.hcrml')
+    
+    def test_create_hcr_dat_from_multiple_hcrml_files(self):
+        self._run_generate_test(
+            project_dir     = 'multifile_project',
+            output_dir      = 'output/multi_dat',
+            expected_dir    = 'expected/multi_dat',
+            hcrml_file      = 'layer1/implml/hcr_dat.hcrml')
+    
+    def test_create_header_from_single_hcrml_file(self):
+        self._run_generate_test(
+            project_dir     = 'multifile_project',
+            output_dir      = 'output/single_header',
+            expected_dir    = 'expected/single_header',
+            hcrml_file      = 'layer1/implml/test1.hcrml')
+    
+    def test_create_header_from_multiple_hcrml_files(self):
+        self._run_generate_test(
+            project_dir     = 'multifile_project',
+            output_dir      = 'output/multi_header',
+            expected_dir    = 'expected/multi_header',
+            hcrml_file      = 'layer1/implml/multi_header.hcrml')
+    
+    def test_create_nothing_from_outputless_hcrml_file(self):
+        self._run_generate_test(
+            project_dir     = 'multifile_project',
+            output_dir      = 'output/no_output',
+            expected_dir    = None, # Check that there is no output
+            hcrml_file      = 'layer1/implml/test3.hcrml')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_hcrrepository.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,145 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+
+import __init__
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from cone.public import api
+
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestHcrRepository(unittest.TestCase):
+    def test_repository_equality(self):
+        self.assertTrue(HcrRepository([], 1, 1) == HcrRepository([], 1, 1))
+        self.assertFalse(HcrRepository([], 1, 1) == HcrRepository([], 2, 1))
+        self.assertFalse(HcrRepository([], 1, 1) == HcrRepository([], 1, 2))
+        
+        self.assertTrue(HcrRepository([], 1, 1) != HcrRepository([], 1, 2))
+        
+        # Records the same, but in different order
+        r1 = HcrRepository([
+                HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+                HcrRecord(HcrRecord.VALTYPE_INT8,       25, 20, 62, 41),
+                HcrRecord(HcrRecord.VALTYPE_BIN_DATA,   10, 20, 31, 40),
+                HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 83, 41),
+                HcrRecord(HcrRecord.VALTYPE_UINT64,     10, 21, 30, 40)],
+                version=1, flags=1)
+        r2 = HcrRepository([
+                HcrRecord(HcrRecord.VALTYPE_UINT64,     10, 21, 30, 40),
+                HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+                HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 83, 41),
+                HcrRecord(HcrRecord.VALTYPE_BIN_DATA,   10, 20, 31, 40),
+                HcrRecord(HcrRecord.VALTYPE_INT8,       25, 20, 62, 41),
+                ],
+                version=1, flags=1)
+        self.assertTrue(r1 == r2)
+        self.assertEquals(repr(r1), repr(r2))
+        
+        r1.version = 2
+        self.assertFalse(r1 == r2)
+        r1.version = 1
+        self.assertTrue(r1 == r2)
+        r1.flags = 3
+        self.assertFalse(r1 == r2)
+        r1.flags = 1
+        self.assertTrue(r1 == r2)
+        
+        r1.records.append(HcrRecord(HcrRecord.VALTYPE_LIN_ADDR, 1, 2, 3, 4))
+        self.assertFalse(r1 == r2)
+        
+    def test_get_duplicate_records(self):
+        r = HcrRepository([
+                HcrRecord(HcrRecord.VALTYPE_INT8, 162, 1, 1, 93),
+                HcrRecord(HcrRecord.VALTYPE_INT8, 172, 1, 2, 41),
+                HcrRecord(HcrRecord.VALTYPE_TEXT8, 182, 1, 3, 40),
+                HcrRecord(HcrRecord.VALTYPE_INT8, 192, 2, 1, 41),
+                HcrRecord(HcrRecord.VALTYPE_UINT32, 202, 2, 2, 40)],
+                version=1, flags=1)
+        
+        self.assertEquals(r.get_duplicate_record_ids(), [])
+        
+        r.records.append(HcrRecord(HcrRecord.VALTYPE_UINT16, 212, 1, 1, 142))
+        self.assertEquals(r.get_duplicate_record_ids(), [(1, 1)])
+        
+        r.records.append(HcrRecord(HcrRecord.VALTYPE_UINT64, 105, 1, 1, 142))
+        self.assertEquals(r.get_duplicate_record_ids(), [(1, 1)])
+        
+        r.records.append(HcrRecord(HcrRecord.VALTYPE_UINT64, 222, 2, 2, 32))
+        self.assertEquals(r.get_duplicate_record_ids(), [(1, 1), (2, 2)])
+        
+        r.records.append(HcrRecord(HcrRecord.VALTYPE_TEXT8, 232, 3, 1, 32))
+        self.assertEquals(r.get_duplicate_record_ids(), [(1, 1), (2, 2)])
+
+class TestHCRRecord(unittest.TestCase):
+
+    def test_create_record_with_valid_type(self):
+        r = HcrRecord(HcrRecord.VALTYPE_INT16, 1234, 1, 2, 3)
+        self.assertEquals(r.type, HcrRecord.VALTYPE_INT16)
+        self.assertEquals(r.value, 1234)
+        self.assertEquals(r.category_id, 1)
+        self.assertEquals(r.element_id, 2)
+        self.assertEquals(r.flags, 3)
+
+    def test_create_record_with_invalid_type(self):
+        try:
+            r = HcrRecord('foobar_type', 0, 0, 0, 0)
+            self.fail("Creating a foobar_type record succeeded!")
+        except ValueError:
+            pass
+    
+    def test_record_equality(self):
+        self.assertTrue(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93)  == HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93))
+        
+        self.assertFalse(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) == HcrRecord(HcrRecord.VALTYPE_INT16, 10, 20, 30, 93))
+        self.assertFalse(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) == HcrRecord(HcrRecord.VALTYPE_INT8,   2, 20, 30, 93))
+        self.assertFalse(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) == HcrRecord(HcrRecord.VALTYPE_INT8,  10,  2, 30, 93))
+        self.assertFalse(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) == HcrRecord(HcrRecord.VALTYPE_INT8,  10, 20,  2, 93))
+        self.assertFalse(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) == HcrRecord(HcrRecord.VALTYPE_INT8,  10, 20, 30, 2))
+        
+        self.assertTrue(HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93) != HcrRecord(HcrRecord.VALTYPE_INT8,  10, 20, 30, 2))
+        
+        r1 = HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93)
+        r2 = HcrRecord(HcrRecord.VALTYPE_INT8, 10, 20, 30, 93)
+        self.assertEquals(repr(r1), repr(r2))
+        r2.value = 12
+        self.assertNotEquals(repr(r1), repr(r2))
+    
+    def test_record_sorting(self):
+        records1 = [
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       25, 20, 62, 41),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+            HcrRecord(HcrRecord.VALTYPE_BIN_DATA,   10, 20, 31, 40),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 83, 41),
+            HcrRecord(HcrRecord.VALTYPE_UINT64,     10, 21, 30, 40),
+            ]
+
+        records2 = [
+            HcrRecord(HcrRecord.VALTYPE_BIN_DATA,   10, 20, 31, 40),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       25, 20, 62, 41),
+            HcrRecord(HcrRecord.VALTYPE_UINT64,     10, 21, 30, 40),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 83, 41),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       10, 20, 30, 93),
+            ]
+        
+        self.assertNotEquals(records1, records2)
+        self.assertEquals(sorted(records1), sorted(records2))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_read_write_record.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,308 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+When editing the hex data in the test cases, this may come in handy:
+
+1. Start the Python command line interpreter
+2. Paste the following lines there:
+
+from struct import pack, unpack
+bin2hex = lambda d: ''.join("%02X" % ord(c) for c in d)
+hexpack = lambda fmt, *args: bin2hex(pack(fmt, *args))
+hex2bin = lambda h: ''.join([chr(int(h[i*2:i*2+2], 16)) for i in xrange(len(h)/2)])
+hexunpack = lambda fmt, data: unpack(fmt, hex2bin(data))
+
+Now you can get the hex representation for any format supported by
+struct.pack() easily. For example, formatting a little-endian unsigned short:
+
+>>> hexpack('<H', 1234)
+'D204'
+
+...and conversely:
+
+>>> hexunpack('<H', 'D204')
+(1234,)
+"""
+
+import unittest
+import os, shutil
+import sys
+import __init__
+
+from testautomation.utils import hex_to_bindata
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin.hcr_reader import HcrReader
+
+class TestReadWriteHcrRecords(unittest.TestCase):
+    
+    def setUp(self):
+        self.writer = HcrWriter()
+        self.reader = HcrReader()
+    
+    def _run_test_read_write_record_no_lsd(self, record, record_bindata):
+        self.assertEquals(self.writer.get_record_bindata(record, None), record_bindata)
+        self.assertEquals(self.writer.get_record_lsd_bindata(record), None)
+        
+        parsed_record, parsed_lsd_pos = self.reader.parse_record_from_bindata(record_bindata)
+        self.assertEquals(parsed_record.type,           record.type)
+        self.assertEquals(parsed_record.value,          record.value)
+        self.assertEquals(parsed_record.category_id,    record.category_id)
+        self.assertEquals(parsed_record.element_id,     record.element_id)
+        self.assertEquals(parsed_record.flags,          record.flags)
+        self.assertEquals(parsed_lsd_pos,               None)
+        
+        self.assertEquals(self.reader.parse_record_value_from_lsd_bindata(parsed_record.type, None), None)
+    
+    def _run_test_read_write_record_with_lsd(self, record, record_bindata, lsd_pos, lsd_bindata):
+        self.assertEquals(self.writer.get_record_bindata(record, lsd_pos), record_bindata)
+        self.assertEquals(self.writer.get_record_lsd_bindata(record), lsd_bindata)
+        
+        
+        parsed_record, parsed_lsd_pos = self.reader.parse_record_from_bindata(record_bindata)
+        self.assertEquals(parsed_record.type,           record.type)
+        self.assertEquals(parsed_record.category_id,    record.category_id)
+        self.assertEquals(parsed_record.element_id,     record.element_id)
+        self.assertEquals(parsed_record.flags,          record.flags)
+        self.assertEquals(parsed_lsd_pos,               lsd_pos)
+        
+        self.assertEquals(self.reader.parse_record_value_from_lsd_bindata(record.type, lsd_bindata), record.value)
+    
+    # -------------------------------------------------------------------------
+    #
+    # -------------------------------------------------------------------------
+
+    def test_read_write_bool(self):
+        r = HcrRecord(HcrRecord.VALTYPE_BOOL, False, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 08000000 0500 0000 00000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_BOOL, True, 0xDEADBEEF, 0xBAADF00D, 0xCAFE)
+        d = hex_to_bindata("EFBEADDE 0DF0ADBA 08000000 FECA 0000 01000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_int8(self):
+        r = HcrRecord(HcrRecord.VALTYPE_INT8, -2**7, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 04000000 0500 0000 80FFFFFF")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT8, 122, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 04000000 0500 0000 7A000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT8, 2**7-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 04000000 0500 0000 7F000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_uint8(self):
+        r = HcrRecord(HcrRecord.VALTYPE_UINT8, 0, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 40000000 0500 0000 00000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT8, 234, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 40000000 0500 0000 EA000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT8, 2**8-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 40000000 0500 0000 FF000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_int16(self):
+        r = HcrRecord(HcrRecord.VALTYPE_INT16, -2**15, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 02000000 0500 0000 0080FFFF")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT16, 12345, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 02000000 0500 0000 39300000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT16, 2**15-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 02000000 0500 0000 FF7F0000")
+        self._run_test_read_write_record_no_lsd(r, d)
+
+    def test_read_write_uint16(self):
+        r = HcrRecord(HcrRecord.VALTYPE_UINT16, 0, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 20000000 0500 0000 00000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT16, 43215, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 20000000 0500 0000 CFA80000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT16, 2**16-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 20000000 0500 0000 FFFF0000")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_int32(self):
+        r = HcrRecord(HcrRecord.VALTYPE_INT32, -2**31, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 01000000 0500 0000 00000080")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT32, 1234567890, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 01000000 0500 0000 D2029649")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT32, 2**31-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 01000000 0500 0000 FFFFFF7F")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_uint32(self):
+        r = HcrRecord(HcrRecord.VALTYPE_UINT32, 0, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 10000000 0500 0000 00000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT32, 3123456789, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 10000000 0500 0000 152B2CBA")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_UINT32, 2**32-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 10000000 0500 0000 FFFFFFFF")
+        self._run_test_read_write_record_no_lsd(r, d)
+    
+    def test_read_write_linaddr(self):
+        r = HcrRecord(HcrRecord.VALTYPE_LIN_ADDR, 0, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 00010000 0500 0000 00000000")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_LIN_ADDR, 3123456789, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 00010000 0500 0000 152B2CBA")
+        self._run_test_read_write_record_no_lsd(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_LIN_ADDR, 2**32-1, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 00010000 0500 0000 FFFFFFFF")
+        self._run_test_read_write_record_no_lsd(r, d)
+
+
+
+    def test_read_write_int64(self):
+        lsd_pos = (1234, 8)
+
+        record = HcrRecord(HcrRecord.VALTYPE_INT64, -2**63, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000001 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("0000 0000 0000 0080")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        record = HcrRecord(HcrRecord.VALTYPE_INT64, 9211026413402420220, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000001 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("FC73 978B B823 D47F")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        record = HcrRecord(HcrRecord.VALTYPE_INT64, 2**63-1, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000001 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("FFFF FFFF FFFF FF7F")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+    
+    def test_read_write_uint64(self):
+        lsd_pos = (1234, 8)
+        record = HcrRecord(HcrRecord.VALTYPE_UINT64, 0, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000002 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("0000 0000 0000 0000")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        record = HcrRecord(HcrRecord.VALTYPE_UINT64, 10746170304040729876, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000002 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("14FD 32B4 F410 2295")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        record = HcrRecord(HcrRecord.VALTYPE_UINT64, 2**64-1, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000002 0500 0800 D2040000")
+        lsd_data = hex_to_bindata("FFFF FFFF FFFF FFFF")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+    def test_read_write_arrayint32(self):
+        arr = []
+        lsd_pos = (1234, 0)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000400 0500 0000 D2040000")
+        lsd_data = ""
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        arr = [1234]
+        lsd_pos = (1234, 4)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000400 0500 0400 D2040000")
+        lsd_data = hex_to_bindata("D2040000")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        arr = [-2**31, 0, 1234567890, 2**31-1]
+        lsd_pos = (1234, 4*3)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000400 0500 0C00 D2040000")
+        lsd_data = hex_to_bindata("00000080 00000000 D2029649 FFFFFF7F")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+    
+    def test_read_write_arrayuint32(self):
+        arr = []
+        lsd_pos = (1234, 0)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000800 0500 0000 D2040000")
+        lsd_data = ""
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        arr = [1234]
+        lsd_pos = (1234, 4)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000800 0500 0400 D2040000")
+        lsd_data = hex_to_bindata("D2040000")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        arr = [0, 3123456789, 2**32-1]
+        lsd_pos = (1234, 4*3)
+        record = HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, arr, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000800 0500 0C00 D2040000")
+        lsd_data = hex_to_bindata("00000000 152B2CBA FFFFFFFF")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+    def test_read_write_text8(self):
+        string = ''
+        lsd_pos = (1234, 0)
+        record = HcrRecord(HcrRecord.VALTYPE_TEXT8, string, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000200 0500 0000 D2040000")
+        lsd_data = ""
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        string = 'Hello world!!'
+        lsd_pos = (1234, 13)
+        record = HcrRecord(HcrRecord.VALTYPE_TEXT8, string, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000200 0500 0D00 D2040000")
+        lsd_data = "Hello world!!"
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        string = u'Cost 100€'
+        lsd_pos = (1234, 11)
+        record = HcrRecord(HcrRecord.VALTYPE_TEXT8, string, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000200 0500 0B00 D2040000")
+        lsd_data = "Cost 100" + hex_to_bindata("E2 82 AC")
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+    
+    def test_read_write_bindata(self):
+        data = ''
+        lsd_pos = (1234, 0)
+        record = HcrRecord(HcrRecord.VALTYPE_BIN_DATA, data, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000100 0500 0000 D2040000")
+        lsd_data = ""
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+
+        data = hex_to_bindata('00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF')
+        lsd_pos = (1234, 16)
+        record = HcrRecord(HcrRecord.VALTYPE_BIN_DATA, data, 12, 43, 5)
+        rec_data = hex_to_bindata("0C000000 2B000000 00000100 0500 1000 D2040000")
+        lsd_data = hex_to_bindata('00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF')
+        self._run_test_read_write_record_with_lsd(record, rec_data, lsd_pos, lsd_data)
+        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_read_write_repository.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,301 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+When editing the hex data in the test cases, this may come in handy:
+
+1. Start the Python command line interpreter
+2. Paste the following lines there:
+
+from struct import pack, unpack
+bin2hex = lambda d: ''.join("%02X" % ord(c) for c in d)
+hexpack = lambda fmt, *args: bin2hex(pack(fmt, *args))
+hex2bin = lambda h: ''.join([chr(int(h[i*2:i*2+2], 16)) for i in xrange(len(h)/2)])
+hexunpack = lambda fmt, data: unpack(fmt, hex2bin(data))
+
+Now you can get the hex representation for any format supported by
+struct.pack() easily. For example, formatting a little-endian unsigned short:
+
+>>> hexpack('<H', 1234)
+'D204'
+
+...and conversely:
+
+>>> hexunpack('<H', 'D204')
+(1234,)
+"""
+
+import unittest
+import os, shutil, random
+import sys
+import __init__
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+from testautomation.utils import hex_to_bindata
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin.hcr_reader import HcrReader
+from hcrplugin import hcr_exceptions
+
+class TestReadWriteHcrRepository(unittest.TestCase):
+
+    def setUp(self):
+        self.writer = HcrWriter()
+        self.reader = HcrReader()
+
+    def write_repo_assertion_failure_files(self, actual_data, expected_data, failure_report_dir, filename):
+        dir = os.path.join(ROOT_PATH, 'temp/repo_assertion_failure')
+        dir = os.path.normpath(os.path.join(dir, failure_report_dir))
+        if not os.path.exists(dir):
+            os.makedirs(dir)
+        
+        f = open(os.path.join(dir, "actual_" + filename), "wb")
+        try:        f.write(actual_data)
+        finally:    f.close()
+        
+        f = open(os.path.join(dir, "expected_" + filename), "wb")
+        try:        f.write(expected_data)
+        finally:    f.close()
+        
+        return dir
+    
+    def _run_test_read_write_repository(self, repo, repo_data, failure_report_dir):
+        """
+        Test reading and writing the repository using the given data.
+        
+        In case of a failure, the actual and expected data are written
+        to the given directory, so that they can be compared using e.g.
+        Beyond Compare.
+        
+        @param repo: The repository object to test.
+        @param repo_data: The expected binary data corresponding to the repository object.
+        @param failure_report_dir: The directory where files are written in case of
+            a failure. Note that this should be just e.g. 'empty_repo', the parent dirs
+            are appended automatically.
+        """
+        # Test writing
+        expected_data = repo_data
+        actual_data = self.writer.get_repository_bindata(repo)
+        if actual_data != expected_data:
+            dir = self.write_repo_assertion_failure_files(
+                actual_data, expected_data,
+                failure_report_dir, 'repo.dat')
+            self.fail("Actual and expected repository data are not equal!\n"+\
+                "See the files in '%s'" % dir)
+        
+        
+        # Test reading
+        expected_repo = repo
+        actual_repo = self.reader.parse_repository_from_bindata(repo_data)
+        if actual_repo != expected_repo:
+            dir = self.write_repo_assertion_failure_files(
+                repr(actual_repo), repr(expected_repo),
+                failure_report_dir, 'repo.txt')
+            self.fail("Actual and expected repository objects are not equal!\n"+\
+                "See the files in '%s'" % dir)
+    
+    # -------------------------------------------------------------------------
+    #
+    # -------------------------------------------------------------------------
+    
+    def test_read_write_empty_repository_1(self):
+        repo = HcrRepository([], version=2, flags=3)
+        repo_data = hex_to_bindata(
+            "48435266 0200 0300 00000000 20000000"+\
+            "00000000 000000000000000000000000")
+        
+        self._run_test_read_write_repository(repo, repo_data, 'empty_repo_1')
+        
+    def test_read_write_empty_repository_2(self):    
+        repo = HcrRepository([], version=0xBEEF, flags=0xCAFE)
+        repo_data = hex_to_bindata(
+            "48435266 EFBE FECA 00000000 20000000"+\
+            "00000000 000000000000000000000000")
+        
+        self._run_test_read_write_repository(repo, repo_data, 'empty_repo_2')
+    
+    # -------------------------------------------------------------------------
+    #
+    # -------------------------------------------------------------------------
+    
+    def test_read_write_repository_without_lsd(self):
+        records = [
+            HcrRecord(HcrRecord.VALTYPE_BOOL,       True,        1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8,       -123,        1, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT8,      204,         1, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT16,      -13423,      2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT16,     54321,       2, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT32,      -1000000000, 2, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT32,     4000000000,  3, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_LIN_ADDR,   0xAABBCCDD,  3, 2, 0),
+        ]
+        # Shuffle the records to make sure that they are sorted properly when writing
+        random.shuffle(records)
+        repo = HcrRepository(records, version=2, flags=3)
+        
+        h = hex_to_bindata
+        data = [
+            # Header
+            h("48435266 0200 0300 08000000 C0000000"),
+            h("00000000 000000000000000000000000"),
+            # Record section
+            h("01000000 01000000 08000000 0000 0000 01000000"), # bool
+            h("01000000 02000000 04000000 0000 0000 85FFFFFF"), # int8
+            h("01000000 03000000 40000000 0000 0000 CC000000"), # uint8
+            h("02000000 01000000 02000000 0000 0000 91CBFFFF"), # int16
+            h("02000000 02000000 20000000 0000 0000 31D40000"), # uint16
+            h("02000000 03000000 01000000 0000 0000 003665C4"), # int32
+            h("03000000 01000000 10000000 0000 0000 00286BEE"), # uint32
+            h("03000000 02000000 00010000 0000 0000 DDCCBBAA"), # linaddr
+        ]
+        repo_data = ''.join(data)
+        
+        self._run_test_read_write_repository(repo, repo_data, 'repo_without_lsd')
+    
+    # -------------------------------------------------------------------------
+    #
+    # -------------------------------------------------------------------------
+    
+    def test_read_write_repository_with_lsd(self):
+        records = [
+            HcrRecord(HcrRecord.VALTYPE_INT64,        9211026413402420220,  1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT64,       10746170304040729876, 1, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_TEXT8,        u'Cost 100€',         1, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_BIN_DATA,     'test test',          2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32,  [-2**31, 0, 2**31-1], 2, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, [0, 100000, 2**32-1], 2, 3, 0),
+        ]
+        # Shuffle the records to make sure that they are sorted properly when writing
+        random.shuffle(records)
+        repo = HcrRepository(records, version=2, flags=3)
+        
+        
+        # Record section size: 6 * 20 = 120
+        # LSD offset: 32 + 120 = 152
+        # LSD size:   8 + 8 + 12 + 12 + 12 + 12 = 64
+        h = hex_to_bindata
+        data = [
+            # Header
+            h("48435266 0200 0300 06000000 98000000"),
+            h("40000000 000000000000000000000000"),
+            # Record section
+            h("01000000 01000000 00000001 0000 0800 00000000"), # int64, lsd pos = (0, 8)
+            h("01000000 02000000 00000002 0000 0800 08000000"), # uint64, lsd pos = (8, 8)
+            h("01000000 03000000 00000200 0000 0B00 10000000"), # text8, lsd pos = (8 + 8, 11)
+            h("02000000 01000000 00000100 0000 0900 1C000000"), # bindata, lsd pos = (8 + 8 + 12, 9)
+            h("02000000 02000000 00000400 0000 0C00 28000000"), # arrayint32, lsd pos = (8 + 8 + 12 + 12, 12)
+            h("02000000 03000000 00000800 0000 0C00 34000000"), # arrayuint32, lsd pos = (8 + 8 + 12 + 12 + 12, 12)
+            # LSD section
+            h("FC73 978B B823 D47F"),          # 8 bytes
+            h("14FD 32B4 F410 2295"),          # 8 bytes
+            "Cost 100" + h("E2 82 AC 00"),     # 12 bytes
+            "test test" + h("00 00 00"),       # 12 bytes
+            h("00000080 00000000 FFFFFF7F"),   # 12 bytes
+            h("00000000 A0860100 FFFFFFFF"),   # 12 bytes
+        ]
+        
+        repo_data = ''.join(data)
+        
+        self._run_test_read_write_repository(repo, repo_data, 'repo_with_lsd')
+    
+    # -------------------------------------------------------------------------
+    #
+    # -------------------------------------------------------------------------
+    
+    def test_read_write_repository_with_all_record_types(self):
+        records = [
+            HcrRecord(HcrRecord.VALTYPE_BOOL,         True,                 1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8,         -123,                 1, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT8,        204,                  1, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT16,        -13423,               2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT16,       54321,                2, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT32,        -1000000000,          2, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT32,       4000000000,           3, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_LIN_ADDR,     0xAABBCCDD,           3, 2, 0),
+            
+            HcrRecord(HcrRecord.VALTYPE_INT64,        9211026413402420220,  4, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_UINT64,       10746170304040729876, 4, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_TEXT8,        u'Cost 100€',         4, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_TEXT8,        '',                   5, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_BIN_DATA,     'test test',          5, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_BIN_DATA,     '',                   5, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32,  [-2**31, 0, 2**31-1], 6, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_INT32,  [],                   6, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, [0, 100000, 2**32-1], 6, 3, 0),
+            HcrRecord(HcrRecord.VALTYPE_ARRAY_UINT32, [],                   7, 1, 0),
+            
+            HcrRecord(HcrRecord.VALTYPE_BOOL,         False,                8, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_TEXT8,        u'Hello world!!!',    8, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_TEXT8,        u'unpadded',          8, 3, 0),
+        ]
+        # Shuffle the records to make sure that they are sorted properly when writing
+        random.shuffle(records)
+        repo = HcrRepository(records, version=2, flags=3)
+        
+        # Record section size: 21 * 20 = 420
+        # LSD offset: 32 + 420 = 452
+        # LSD size:   8 + 8 + 12 + 12 + 12 + 12 + 16 + 8 = 88
+        h = hex_to_bindata
+        data = [
+            # Header
+            h("48435266 0200 0300 15000000 C4010000"),
+            h("58000000 000000000000000000000000"),
+            
+            # Record section
+            h("01000000 01000000 08000000 0000 0000 01000000"), # bool
+            h("01000000 02000000 04000000 0000 0000 85FFFFFF"), # int8
+            h("01000000 03000000 40000000 0000 0000 CC000000"), # uint8
+            h("02000000 01000000 02000000 0000 0000 91CBFFFF"), # int16
+            h("02000000 02000000 20000000 0000 0000 31D40000"), # uint16
+            h("02000000 03000000 01000000 0000 0000 003665C4"), # int32
+            h("03000000 01000000 10000000 0000 0000 00286BEE"), # uint32
+            h("03000000 02000000 00010000 0000 0000 DDCCBBAA"), # linaddr
+            
+            h("04000000 01000000 00000001 0000 0800 00000000"), # int64, lsd pos = (0, 8)
+            h("04000000 02000000 00000002 0000 0800 08000000"), # uint64, lsd pos = (8, 8)
+            h("04000000 03000000 00000200 0000 0B00 10000000"), # text8, lsd pos = (8 + 8, 11)
+            h("05000000 01000000 00000200 0000 0000 1C000000"), # text8, lsd pos = (8 + 8 + 12, 0)
+            h("05000000 02000000 00000100 0000 0900 1C000000"), # bindata, lsd pos = (8 + 8 + 12, 9)
+            h("05000000 03000000 00000100 0000 0000 28000000"), # bindata, lsd pos = (8 + 8 + 12 + 12, 0)
+            h("06000000 01000000 00000400 0000 0C00 28000000"), # arrayint32, lsd pos = (8 + 8 + 12 + 12, 12)
+            h("06000000 02000000 00000400 0000 0000 34000000"), # arrayint32, lsd pos = (8 + 8 + 12 + 12 + 12, 0)
+            h("06000000 03000000 00000800 0000 0C00 34000000"), # arrayuint32, lsd pos = (8 + 8 + 12 + 12 + 12, 12)
+            h("07000000 01000000 00000800 0000 0000 40000000"), # arrayuint32, lsd pos = (8 + 8 + 12 + 12 + 12 + 12, 0)
+            
+            h("08000000 01000000 08000000 0000 0000 00000000"), # bool
+            h("08000000 02000000 00000200 0000 0E00 40000000"), # text8, lsd pos = (8 + 8 + 12 + 12 + 12 + 12, 14)
+            h("08000000 03000000 00000200 0000 0800 50000000"), # text8, lsd pos = (8 + 8 + 12 + 12 + 12 + 12 + 16, 8)
+            
+            # LSD section
+            h("FC73 978B B823 D47F"),          # 8 bytes
+            h("14FD 32B4 F410 2295"),          # 8 bytes
+            "Cost 100" + h("E2 82 AC 00"),     # 12 bytes
+            "",
+            "test test" + h("00 00 00"),       # 12 bytes
+            "",
+            h("00000080 00000000 FFFFFF7F"),   # 12 bytes
+            "",
+            h("00000000 A0860100 FFFFFFFF"),   # 12 bytes
+            "",
+            "Hello world!!!" + h("00 00"),     # 16 bytes
+            "unpadded",                        # 8 bytes
+        ]
+        repo_data = ''.join(data)
+        
+        self._run_test_read_write_repository(repo, repo_data, 'repo_with_all_record_types')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_reader.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,194 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, unittest
+import __init__
+
+from testautomation.utils import hex_to_bindata
+
+from hcrplugin.hcr_reader import HcrReader
+from hcrplugin import hcr_exceptions
+from hcrplugin.hcrrepository import HcrRecord
+
+
+class TestHcrReader(unittest.TestCase):
+    def setUp(self):
+        self.reader = HcrReader()
+        
+    def test_read_repo_with_invalid_record_section_size(self):
+        # Record section size: 4 * 20 = 80
+        # LSD offset: 32 + 80 = 112
+        # LSD size:   0
+        data =  [
+            # Header
+            # Record count should be 4, but is 6 here
+            "48435266 0200 0300 06000000 70000000",
+            "00000000 000000000000000000000000",
+            # Record section
+            "01000000 01000000 08000000 0000 0000 01000000", # bool
+            "02000000 01000000 04000000 0000 0000 85FFFFFF", # int8
+            "03000000 01000000 40000000 0000 0000 CC000000", # uint8
+            "01000000 02000000 02000000 0000 0000 91CBFFFF", # int16
+        ]
+        data = ''.join(map(lambda x: hex_to_bindata(x), data))
+        
+        try:
+            self.reader.parse_repository_from_bindata(data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidHcrDataSizeError:
+            pass
+    
+    def test_read_repo_with_invalid_lsd_section_size(self):
+        # Record section size: 4 * 20 = 80
+        # LSD offset: 32 + 80 = 112
+        # LSD size:   0
+        data =  [
+            # Header
+            # LSD section size should be 0, but is 40 here
+            "48435266 0200 0300 04000000 70000000",
+            "28000000 000000000000000000000000",
+            # Record section
+            "01000000 01000000 08000000 0000 0000 01000000", # bool
+            "02000000 01000000 04000000 0000 0000 85FFFFFF", # int8
+            "03000000 01000000 40000000 0000 0000 CC000000", # uint8
+            "01000000 02000000 02000000 0000 0000 91CBFFFF", # int16
+        ]
+        data = ''.join(map(lambda x: hex_to_bindata(x), data))
+        
+        try:
+            self.reader.parse_repository_from_bindata(data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidHcrDataSizeError:
+            pass
+    
+    def test_read_repo_with_invalid_lsd_section_offset(self):
+        # Record section size: 2 * 20 = 40
+        # LSD offset: 32 + 40 = 72
+        # LSD size:   8 + 8 = 16
+        data = [
+            # Header, LSD offset here is 60
+            "48435266 0200 0300 02000000 3C000000",
+            "10000000 000000000000000000000000",
+            # Record section
+            "01000000 01000000 00000001 0000 0800 00000000", # int64, lsd pos = (0, 8)
+            "02000000 01000000 00000002 0000 0800 08000000", # uint64, lsd pos = (8, 8)
+            # LSD section
+            "FC73 978B B823 D47F",          # 8 bytes
+            "14FD 32B4 F410 2295",          # 8 bytes
+        ]
+        data = ''.join(map(lambda x: hex_to_bindata(x), data))
+        
+        try:
+            self.reader.parse_repository_from_bindata(data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidLsdSectionOffsetError:
+            pass
+    
+    def test_read_repo_with_invalid_lsd_pos_in_record(self):
+        # Record section size: 2 * 20 = 40
+        # LSD offset: 32 + 40 = 72
+        # LSD size:   8 + 8 = 16
+        data = [
+            # Header
+            "48435266 0200 0300 02000000 48000000",
+            "10000000 000000000000000000000000",
+            # Record section
+            "01000000 01000000 00000001 0000 0800 00000000", # int64, lsd pos = (0, 8)
+            "02000000 01000000 00000002 0000 0800 0C000000", # uint64, lsd pos = (12, 8), should be (8, 8)
+            # LSD section
+            "FC73 978B B823 D47F",          # 8 bytes
+            "14FD 32B4 F410 2295",          # 8 bytes
+        ]
+        data = ''.join(map(lambda x: hex_to_bindata(x), data))
+        
+        try:
+            self.reader.parse_repository_from_bindata(data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidRecordLsdPositionError:
+            pass
+    
+    def test_read_repo_with_invalid_record_value_type(self):
+        # Record section size: 2 * 20 = 40
+        # LSD offset: 32 + 40 = 72
+        # LSD size:   8 + 8 = 16
+        data = [
+            # Header
+            "48435266 0200 0300 02000000 48000000",
+            "10000000 000000000000000000000000",
+            # Record section
+            "01000000 01000000 00000001 0000 0800 00000000", # int64, lsd pos = (0, 8)
+            "02000000 01000000 DEADBEEF 0000 0800 0C000000", # invalid type
+            # LSD section
+            "FC73 978B B823 D47F",          # 8 bytes
+            "14FD 32B4 F410 2295",          # 8 bytes
+        ]
+        data = ''.join(map(lambda x: hex_to_bindata(x), data))
+        
+        try:
+            self.reader.parse_repository_from_bindata(data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidRecordValueTypeError:
+            pass
+    
+    def _run_test_read_record_with_invalid_lsd_size(self, value_type, lsd_data):
+        try:
+            self.reader.parse_record_value_from_lsd_bindata(value_type, lsd_data)
+            self.fail("Expected exception not raised")
+        except hcr_exceptions.InvalidRecordLsdPositionError:
+            pass
+    
+    def test_read_record_with_invalid_lsd_size_int64(self):
+        data = hex_to_bindata("0000 0000 0000 00")
+        self._run_test_read_record_with_invalid_lsd_size(HcrRecord.VALTYPE_INT64, data)
+    
+    def test_read_record_with_invalid_lsd_size_uint64(self):
+        data = hex_to_bindata("0000 0000 0000 00")
+        self._run_test_read_record_with_invalid_lsd_size(HcrRecord.VALTYPE_UINT64, data)
+    
+    def test_read_record_with_invalid_lsd_size_arrayint32(self):
+        data = hex_to_bindata("0000 0000 0000 00")
+        self._run_test_read_record_with_invalid_lsd_size(HcrRecord.VALTYPE_ARRAY_INT32, data)
+    
+    def test_read_record_with_invalid_lsd_size_arrayuint32(self):
+        data = hex_to_bindata("0000 0000 0000 00")
+        self._run_test_read_record_with_invalid_lsd_size(HcrRecord.VALTYPE_ARRAY_UINT32, data)
+    
+    
+    def test_read_record_with_invalid_data_size(self):
+        try:
+            self.reader.parse_record_from_bindata('1234')
+            self.fail("Parsing invalid record data succeeded!")
+        except hcr_exceptions.HcrReaderError:
+            pass
+    
+    def test_read_signed_integer_in_record(self):
+        #Test that padding bytes don't matter when reading the type
+        def check(record, data):
+            self.assertEquals(self.reader.parse_record_from_bindata(data)[0], record)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT8, -123, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 04000000 0500 0000 85FFFFFF")
+        check(r, d)
+        d = hex_to_bindata("0C000000 2B000000 04000000 0500 0000 85000000")
+        check(r, d)
+        
+        r = HcrRecord(HcrRecord.VALTYPE_INT16, -12345, 12, 43, 5)
+        d = hex_to_bindata("0C000000 2B000000 02000000 0500 0000 C7CFFFFF")
+        check(r, d)
+        d = hex_to_bindata("0C000000 2B000000 02000000 0500 0000 C7CF0000")
+        check(r, d)
+        
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/hcrplugin/tests/unittest_writer.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,111 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, unittest
+import __init__
+
+from hcrplugin.hcrrepository import HcrRepository, HcrRecord
+from hcrplugin.hcr_writer import HcrWriter
+from hcrplugin import hcr_exceptions
+
+class TestHcrWriter(unittest.TestCase):
+    def setUp(self):
+        self.writer = HcrWriter()
+    
+    def test_write_repo_with_duplicate_record(self):
+        records = [
+            HcrRecord(HcrRecord.VALTYPE_INT8, -123, 1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 124,  2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 66,   3, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, -72,  1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 171,  1, 2, 0),
+        ]
+        repo = HcrRepository(records, version=2, flags=3)
+        
+        try:
+            self.writer.get_repository_bindata(repo)
+        except hcr_exceptions.DuplicateRecordError:
+            pass
+
+    def test_record_sorting_by_setting_id(self):
+        records = [
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 3, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 2, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 1, 2, 0),
+            
+            ]
+
+        expected = [
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 1, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 1, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 2, 1, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 2, 2, 0),
+            HcrRecord(HcrRecord.VALTYPE_INT8, 10, 3, 1, 0),
+            ]
+        
+        self.assertEquals(sorted(records, key=self.writer.get_record_setting_id), expected)
+
+    def _run_test_write_record_with_invalid_value(self, record_type, record_value):
+        try:
+            record = HcrRecord(record_type, record_value, 0, 0, 0)
+            self.writer.get_record_bindata(record, (0, 0))
+            self.fail("Expected exception not thrown!")
+        except hcr_exceptions.ValueNotInRangeError, e:
+            pass
+
+    def test_write_numeric_record_with_invalid_value(self):
+        def test(record_type, bits, unsigned):
+            if unsigned:
+                value1 = -1
+                value2 = 2**bits
+            else:
+                value1 = -(2**(bits-1) + 1)
+                value2 = 2**(bits-1)
+            
+            if record_type in (HcrRecord.VALTYPE_ARRAY_INT32, HcrRecord.VALTYPE_ARRAY_UINT32):
+                value1 = [1, value1, 2]
+                value2 = [1, value2, 2]
+            
+            self._run_test_write_record_with_invalid_value(record_type, value1)
+            self._run_test_write_record_with_invalid_value(record_type, value2)
+        
+        test(HcrRecord.VALTYPE_INT8,            8,  False)
+        test(HcrRecord.VALTYPE_UINT8,           8,  True)
+        test(HcrRecord.VALTYPE_INT16,           16, False)
+        test(HcrRecord.VALTYPE_UINT16,          16, True)
+        test(HcrRecord.VALTYPE_INT32,           32, False)
+        test(HcrRecord.VALTYPE_UINT32,          32, True)
+        test(HcrRecord.VALTYPE_LIN_ADDR,        32, True)
+        test(HcrRecord.VALTYPE_INT64,           64, False)
+        test(HcrRecord.VALTYPE_UINT64,          64, True)
+        test(HcrRecord.VALTYPE_ARRAY_INT32,     32, False)
+        test(HcrRecord.VALTYPE_ARRAY_UINT32,    32, True)
+    
+    def test_write_value_with_too_large_lsd_data(self):
+        def test(record_type, value):
+            try:
+                record = HcrRecord(record_type, value, 0, 0, 0)
+                self.writer.get_record_lsd_bindata(record)
+                self.fail("Expected exception not raised!")
+            except hcr_exceptions.TooLargeLsdDataError:
+                pass
+        
+        test(HcrRecord.VALTYPE_ARRAY_INT32, [i for i in xrange(150)])
+        test(HcrRecord.VALTYPE_ARRAY_UINT32, [i for i in xrange(150)])
+        test(HcrRecord.VALTYPE_BIN_DATA, 513 * ' ')
+        test(HcrRecord.VALTYPE_TEXT8, 200 * u'\u20ac')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeHCRPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from hcrplugin import __version__
+
+setup(
+    name = "conehcrplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    author = "",
+    author_email = "",
+    description = "Configuration Engine Hardware configuration repository generation",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone, hcr",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = True,
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['hcrml = hcrplugin.hcrml_parser:HcrmlReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
+import pkg_resources 
+import sys,os
+
+try:
+  pkg_resources.require("Cone")
+except pkg_resources.DistributionNotFound:
+  ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+  sys.path.append(ROOT_PATH)
+  sys.path.append(os.path.join(ROOT_PATH,'..'))
+  sys.path.append(os.path.join(ROOT_PATH,'../..'))
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/SVGTBinEncode.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/ThirdPartyBitmap.pal	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,256 @@
+0x00000000
+0x00CCFFFF
+0x0099FFFF
+0x0066FFFF
+0x0033FFFF
+0x0000FFFF
+0x00FFCCFF
+0x00CCCCFF
+0x0099CCFF
+0x0066CCFF
+0x0033CCFF
+0x0000CCFF
+0x00FF99FF
+0x00CC99FF
+0x009999FF
+0x006699FF
+0x003399FF
+0x000099FF
+0x00FF66FF
+0x00CC66FF
+0x009966FF
+0x006666FF
+0x003366FF
+0x000066FF
+0x00FF33FF
+0x00CC33FF
+0x009933FF
+0x006633FF
+0x003333FF
+0x000033FF
+0x00FF00FF
+0x00CC00FF
+0x009900FF
+0x006600FF
+0x003300FF
+0x000000FF
+0x00FFFFCC
+0x00CCFFCC
+0x0099FFCC
+0x0066FFCC
+0x0033FFCC
+0x0000FFCC
+0x00FFCCCC
+0x00CCCCCC
+0x0099CCCC
+0x0066CCCC
+0x0033CCCC
+0x0000CCCC
+0x00FF99CC
+0x00CC99CC
+0x009999CC
+0x006699CC
+0x003399CC
+0x000099CC
+0x00FF66CC
+0x00CC66CC
+0x009966CC
+0x006666CC
+0x003366CC
+0x000066CC
+0x00FF33CC
+0x00CC33CC
+0x009933CC
+0x006633CC
+0x003333CC
+0x000033CC
+0x00FF00CC
+0x00CC00CC
+0x009900CC
+0x006600CC
+0x003300CC
+0x000000CC
+0x00FFFF99
+0x00CCFF99
+0x0099FF99
+0x0066FF99
+0x0033FF99
+0x0000FF99
+0x00FFCC99
+0x00CCCC99
+0x0099CC99
+0x0066CC99
+0x0033CC99
+0x0000CC99
+0x00FF9999
+0x00CC9999
+0x00999999
+0x00669999
+0x00339999
+0x00009999
+0x00FF6699
+0x00CC6699
+0x00996699
+0x00666699
+0x00336699
+0x00006699
+0x00FF3399
+0x00CC3399
+0x00993399
+0x00663399
+0x00333399
+0x00003399
+0x00FF0099
+0x00CC0099
+0x00990099
+0x00660099
+0x00330099
+0x00000099
+0x00FFFF66
+0x00CCFF66
+0x0099FF66
+0x0066FF66
+0x0033FF66
+0x0000FF66
+0x00FFCC66
+0x00CCCC66
+0x0099CC66
+0x0066CC66
+0x0033CC66
+0x0000CC66
+0x00FF9966
+0x00CC9966
+0x00999966
+0x00669966
+0x00339966
+0x00009966
+0x00FF6666
+0x00CC6666
+0x00996666
+0x00666666
+0x00336666
+0x00006666
+0x00FF3366
+0x00CC3366
+0x00993366
+0x00663366
+0x00333366
+0x00003366
+0x00FF0066
+0x00CC0066
+0x00990066
+0x00660066
+0x00330066
+0x00000066
+0x00FFFF33
+0x00CCFF33
+0x0099FF33
+0x0066FF33
+0x0033FF33
+0x0000FF33
+0x00FFCC33
+0x00CCCC33
+0x0099CC33
+0x0066CC33
+0x0033CC33
+0x0000CC33
+0x00FF9933
+0x00CC9933
+0x00999933
+0x00669933
+0x00339933
+0x00009933
+0x00FF6633
+0x00CC6633
+0x00996633
+0x00666633
+0x00336633
+0x00006633
+0x00FF3333
+0x00CC3333
+0x00993333
+0x00663333
+0x00333333
+0x00003333
+0x00FF0033
+0x00CC0033
+0x00990033
+0x00660033
+0x00330033
+0x00000033
+0x00FFFF00
+0x00CCFF00
+0x0099FF00
+0x0066FF00
+0x0033FF00
+0x0000FF00
+0x00FFCC00
+0x00CCCC00
+0x0099CC00
+0x0066CC00
+0x0033CC00
+0x0000CC00
+0x00FF9900
+0x00CC9900
+0x00999900
+0x00669900
+0x00339900
+0x00009900
+0x00FF6600
+0x00CC6600
+0x00996600
+0x00666600
+0x00336600
+0x00006600
+0x00FF3300
+0x00CC3300
+0x00993300
+0x00663300
+0x00333300
+0x00003300
+0x00FF0000
+0x00CC0000
+0x00990000
+0x00660000
+0x00330000
+0x00000000
+0x00EEEEEE
+0x00DDDDDD
+0x00BBBBBB
+0x00AAAAAA
+0x00888888
+0x00777777
+0x00555555
+0x00444444
+0x00222222
+0x00111111
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00FFFFFF
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/bmconv.exe has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/mifconv.exe has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/bin/xerces-c_2_6.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/generators.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,587 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Generator classes
+'''
+
+
+import re
+import os
+import sys
+import logging
+import subprocess
+import shutil
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+from cone.public import utils, exceptions
+
+class InvalidInputFileException(RuntimeError):
+    """
+    Exception thrown in case of an invalid input file list.
+    """
+    pass
+
+class OutputGenerator(object):
+    def __init__(self,outputpath,**kwargs):
+        self._configuration = None
+        self._subpath = ''
+        self._contentpath = ''
+        self._command = ''
+        self._inputs = []
+        for arg in kwargs.keys():
+            setattr(self, arg, kwargs[arg])
+        self._outputpath = outputpath
+
+    def __str__(self):
+        return "Generator for output %s: %s"  % (self.path,self.get_command())
+
+    def generate(self, context=None):
+        command = self.get_command()
+        if command:
+            return command.execute()
+        else:
+            return 0
+
+    def get_outputpath(self):
+        """
+        Get the confml ref value from configuration if the outputpath is actually a ref
+        """
+        if self._outputpath and ConfmlRefs.is_confml_ref(self._outputpath):
+             oref = ConfmlRefs.get_confml_ref(self._outputpath)
+             opath = self.configuration.get_default_view().get_feature(oref).get_value()
+             if opath == None: 
+                 logging.getLogger('cone.imageml').warning('Output path not set.')
+                 return self._outputpath 
+                 #raise exceptions.NotBound("Output path reference has no value %s" % oref)
+             (drive,opath) = os.path.splitdrive(opath)
+             opath = utils.resourceref.norm(opath)
+             opath = utils.resourceref.remove_begin_slash(opath)
+             return opath
+        else:
+             return self._outputpath
+
+    def set_outputpath(self, value): 
+        self._outputpath = value
+
+    def del_outputpath(self): 
+        self._outputpath = None
+
+    def get_subpath(self):
+        return self._subpath
+
+    def set_subpath(self, value): 
+        self._subpath = value
+
+    def del_subpath(self): 
+        self._subpath = None
+
+    def get_inputs(self): 
+        return self._inputs
+
+    def set_inputs(self, value): 
+        self._inputs = value
+
+    def del_inputs(self): 
+        self._inputs = []
+
+    def get_configuration(self): 
+        return self._configuration
+
+    def set_configuration(self, value): 
+        self._configuration= value
+        for input in self.inputs:
+            input.configuration = self.configuration
+
+    def del_configuration(self): 
+        self._configuration= None
+
+    @property
+    def path(self):
+        return utils.resourceref.join_refs([self.subpath, self.outputpath])
+
+    def get_command(self):
+        (_,ext) = os.path.splitext(self.path)
+        if ext == '.mbm':
+            return BmconvCommand(self)
+        elif ext == '.mif':
+            return MifconvCommand(self)
+        elif ext == '.gif':
+            return CopyCommand(self)
+        else:
+            return None
+    
+    def get_refs(self):
+        refs = []
+        for input in self.inputs:
+            refs.extend(input.get_refs())
+        return refs
+
+    configuration = property(get_configuration, set_configuration, del_configuration)
+    inputs = property(get_inputs, set_inputs, del_inputs)
+    outputpath = property(get_outputpath, set_outputpath, del_outputpath)
+    subpath = property(get_subpath, set_subpath, del_subpath)
+
+class Command(object):
+    def __init__(self,generator):
+        self._generator = generator
+        self._workdir = 'conversion_workdir'
+
+    def execute(self):
+        """ Execute this command """
+        pass
+
+    def get_command(self, input_files):
+        """ return the command as an array """
+        return []
+
+    def create_workdir(self, input_files):
+        """
+        Extract the necessary input files from storage to a working directory
+        @param input_files: The input files (a list of InputFile objects) 
+        """
+        if not os.path.exists(self._workdir):
+            os.makedirs(self._workdir)
+        
+        for file in input_files:
+            self.import_to_work(file.filename)
+
+    def clean_workdir(self):
+        """
+        Clean up working directory 
+        """
+        if os.path.exists(self._workdir):
+            shutil.rmtree(self._workdir)
+
+    def import_to_work(self,storage_filename):
+        """
+        Convert a storage filename to a work filename
+        """
+        workfile = self.workfilename(storage_filename)
+        res = self._generator.configuration.get_resource(storage_filename,"rb")
+        workfile = open(workfile,"wb")
+        workfile.write(res.read())
+        res.close()
+        workfile.close()
+
+    def workfilename(self,filename):
+        """
+        Convert a storage filename to a work filename
+        """
+        (_,workname) = os.path.split(filename)
+        return os.path.join(self.workdir,workname)
+
+    def quote_needed(self,str):
+        """
+        Add quotes around str if it has spaces
+        """
+        if str.split(' ',1) > 1:
+            return '"%s"' % str
+        else:
+            return str
+        
+    @property
+    def tool(self):
+        return ''
+
+    @property
+    def generator(self):
+        return self._generator
+
+    @property
+    def workdir(self):
+        return self._workdir
+    
+    def _get_filtered_input_files(self):
+        """
+        Get the list of InputFile objects and with ignored
+        (optional empty or invalid files) entries filtered out.
+        
+        Raise InvalidInputFileException if the input file list is invalid.
+        """
+        # Get all input files
+        input_files = []
+        for input in self.generator.inputs:
+            input_files.extend(input.files)
+        
+        # Check if all are empty
+        all_empty = True
+        for file in input_files:
+            if not file.is_empty():
+                all_empty = False
+                break
+        if all_empty:
+            return []
+        
+        # Create the filtered list
+        result = []
+        for file in input_files:
+            if file.is_empty():
+                if file.is_optional():
+                    # Optional file is empty: no error
+                    pass
+                else:
+                    raise InvalidInputFileException("Input file empty but not optional")
+            else:
+                if not file.is_valid():
+                    raise InvalidInputFileException("Invalid input file: '%s'" % file.path)
+                else:
+                    result.append(file)
+        return result 
+
+class BmconvCommand(Command):
+    def __init__(self,generator):
+        super(BmconvCommand, self).__init__(generator)
+
+    def execute(self):
+        """
+        Execute the command in the current working directory
+        """
+        input_files = self._get_filtered_input_files()
+        if len(input_files) == 0: return 0
+        self.create_workdir(input_files)
+        
+        if not os.path.exists(os.path.dirname(self.generator.path)):
+            os.makedirs(os.path.dirname(self.generator.path))
+        
+        command = self.get_command(input_files)
+        p = subprocess.Popen(command,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+        
+        # Wait for the process to return
+        out, err = [ e.splitlines() for e in p.communicate() ]
+        for outl in out:
+            if outl not in err:
+                logging.getLogger('cone.bmconv').info(outl)
+        for outl in err:
+            logging.getLogger('cone.bmconv').error(outl)
+        if p.returncode != 0:
+            logging.getLogger('cone.bmconv').error("Command returned with returncode %s: %s" % (p.returncode, ' '.join(command)))
+        else:
+            logging.getLogger('cone.bmconv').info("Command returned with returncode %s: %s" % (p.returncode, ' '.join(command)))
+        if p.returncode == 0:
+        	self.clean_workdir()
+        return p.returncode 
+
+    def get_command(self, input_files):
+        command = [self.tool]
+        """ Add palette file """
+        if hasattr(self._generator,'palette'):
+            command.append('/p%s' % os.path.abspath(self.generator.palette))
+
+        """ Add output file """
+        """ Add output file as compressed if needed """
+        if self.rom:
+            if self.compress:
+                command.append('/s')
+            else:
+                command.append('/r')
+        else:
+            pass
+        command.append(os.path.normpath(self.generator.path))
+        
+        
+        for inputfile in input_files:
+            depth = ''
+            if inputfile.depth:
+                depth = '/%s' % inputfile.depth
+            command.append('%s%s' % (depth,self.workfilename(inputfile.filename)))
+        return command
+
+    @property
+    def tool(self):
+        if hasattr(self._generator,'tool'):
+            return os.path.abspath(self._generator.tool)
+        elif hasattr(self._generator, 'tooldir'):
+            return os.path.abspath(os.path.join(self._generator.tooldir, 'bmconv'))
+        else:
+            return 'bmconv'
+
+    @property
+    def rom(self):
+        if hasattr(self._generator,'rom') and self._generator.rom.lower() == 'true':
+            return True
+        else:
+            return False
+
+    @property
+    def compress(self):
+        if hasattr(self._generator,'compress') and self._generator.compress.lower() == 'true':
+            return True
+        else:
+            return False
+
+class MifconvCommand(Command):
+    def __init__(self,generator):
+        super(MifconvCommand, self).__init__(generator)
+
+    def execute(self):
+        """
+        Execute the command in the current working directory
+        """
+        input_files = self._get_filtered_input_files()
+        if len(input_files) == 0: return 0
+        self.create_workdir(input_files)
+        
+        runenv = None
+        runshell = True
+        if os.path.dirname(self.tool):
+            runenv = {}
+            runenv['path'] = os.path.dirname(self.tool)
+            runshell = True
+        if not os.path.exists(os.path.dirname(self.generator.path)):
+            os.makedirs(os.path.dirname(self.generator.path))
+        
+        command = self.get_command(input_files)
+        p = subprocess.Popen(command,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE,
+                             env=runenv,
+                             shell=runshell)
+        
+        # Wait for the process to return
+        out, err = [ e.splitlines() for e in p.communicate() ]
+        for outl in out:
+            if outl not in err:
+                logging.getLogger('cone.mifconv').info(outl)
+        for outl in err:
+            logging.getLogger('cone.mifconv').error(outl)
+        if p.returncode != 0:
+            logging.getLogger('cone.mifconv').error("Command returned with returncode %s: %s" % (p.returncode, ' '.join(command)))
+        else:
+            logging.getLogger('cone.mifconv').info("Command returned with returncode %s: %s" % (p.returncode, ' '.join(command)))
+        if p.returncode == 0:
+	        self.clean_workdir()
+        return p.returncode 
+
+    def get_command(self, input_files):
+        command = [self.tool]
+        
+        """ Add output file """
+        command.append(os.path.normpath(self.generator.path))
+        
+        """ Add temp_path """
+        command.append("/t%s" % self.temppath)
+        
+        # Add tool directory if given
+        if hasattr(self._generator,'tooldir'):
+            command.append('/S%s' % os.path.abspath(self.generator.tooldir))
+        
+        """ Get input files """
+        for inputfile in input_files:
+            depth = 'c8'
+            if inputfile.depth:
+                depth = inputfile.depth
+            command.append('/%s' % depth)
+            command.append( '%s' % self.workfilename(inputfile.filename))
+        return command
+
+    @property
+    def tool(self):
+        if hasattr(self._generator,'tool'):
+            return os.path.abspath(self._generator.tool)
+        elif hasattr(self._generator, 'tooldir'):
+            return os.path.abspath(os.path.join(self._generator.tooldir, 'mifconv'))
+        else:
+            return 'mifconv'
+
+    @property
+    def temppath(self):
+        if hasattr(self._generator,'temp'):
+            return os.path.abspath(self._generator.temp)
+        else:
+            return self.workdir
+
+class CopyCommand(object):
+    def __init__(self,generator):
+        self._generator = generator
+
+    def execute(self):
+        pass
+
+    @property
+    def tool(self):
+        return 'copy'
+
+class InputFile(object):
+    def __init__(self,path,**kwargs):
+        self.configuration = None
+        self._depth = None
+        for arg in kwargs.keys():
+            if arg == 'depth':
+                # Special handling for depth ('depth' is a property that
+                # expands refs using '_depth' as the base)
+                self._depth = kwargs[arg]
+            else:
+                setattr(self, arg, kwargs[arg])
+        self._path= path
+
+    def get_input(self): 
+        """ 
+        Get the confml ref value from configuration if the outputpath is actually a ref 
+        """
+        if self._path and self.configuration is not None:
+            dview = self.configuration.get_default_view()
+            def expand(ref, index):
+                value = dview.get_feature(ref).get_original_value()
+                if value is None:   return ''
+                else:               return value
+            return utils.expand_delimited_tokens(self._path, expand)
+        else:
+            return self._path
+
+    def set_input(self, value): self._path = value
+
+    def del_input(self): self._path = None
+
+    @property 
+    def type(self):
+        return 'file'
+    
+    @property
+    def depth(self):
+        if self._depth and self.configuration:
+            dview = self.configuration.get_default_view()
+            return utils.expand_refs_by_default_view(self._depth, dview)
+        else:
+            return self._depth or ''
+
+    @property 
+    def files(self):
+        """ 
+        Return a list of file names 
+        """
+        return [self]
+        
+    @property 
+    def filename(self):
+        """ 
+        Return a the path to the layer specific filename
+        """ 
+        if self.configuration and self.path:
+            content = self.configuration.layered_content().flatten()
+            inputpath = self.path
+            return content.get(inputpath)
+        else:
+            return self.path
+
+    path = property(get_input, set_input, del_input, "The input 'path'.")
+    
+    def is_valid(self):
+        """
+        Return whether the input file is valid (not empty
+        and exists in project content).
+        """
+        return not self.is_empty() and self.filename
+    
+    def is_empty(self):
+        """
+        Return whether the input file is empty.
+        """
+        return self.path in ('', None)
+    
+    def is_optional(self):
+        """
+        Return whether the input file is optional.
+        """
+        return hasattr(self, 'optional') \
+            and self.optional.lower() in ('1', 't', 'true', 'yes', 'y')
+    
+    def get_refs(self):
+        return utils.extract_delimited_tokens(self._path)
+    
+    def __repr__(self):
+        return "InputFile(path=%r, optional=%r)" % (self._path, self.is_optional())
+
+class InputDir(InputFile):
+    def __init__(self,path,**kwargs):
+        super(InputDir,self).__init__(path,**kwargs)
+        self._files = []
+        self._include = None
+        self._exclude = None
+
+    def get_include(self): 
+        return self._include.get('pattern',[])
+
+    def set_include(self, value): 
+        self._include = value
+
+    def del_include(self): 
+        self._include = None
+
+    def get_exclude(self):
+        return self._exclude.get('pattern',[])
+
+    def set_exclude(self, value): 
+        self._exclude = value
+
+    def del_exclude(self): 
+        self._exclude = None
+
+    @property 
+    def type(self): 
+        return 'dir'
+
+    @property 
+    def files(self):
+        """ 
+        Return a list of file names under this directory definition
+        """ 
+        if self.configuration:
+            inputlist = []
+            content = self.configuration.layered_content().flatten()
+            contentfiles = content.keys()
+            
+            folderfiles = utils.resourceref.filter_resources(contentfiles, "^%s" % self.path)
+            for inputfilter in self.include:
+                folderfiles = utils.resourceref.filter_resources(folderfiles, inputfilter)
+            for excludefilter in self.exclude:
+                folderfiles = utils.resourceref.neg_filter_resources(folderfiles, excludefilter)
+            folderfiles.sort()
+            for filename in folderfiles:
+                inputlist.append(InputFile(filename, **self.__dict__))
+            return inputlist
+        else:
+            return []
+
+    include = property(get_include, set_include, del_include)
+    exclude = property(get_exclude, set_exclude, del_exclude)
+
+
+
+class ConfmlRefs(object):
+    
+    ref_pattern = re.compile('^\$\{(.*)\}$')
+
+    @classmethod
+    def is_confml_ref(cls, variableref):
+        """
+        
+        Returns true if the given variable ref is a confml reference
+        """
+        return cls.ref_pattern.match(variableref) != None
+
+    @classmethod
+    def get_confml_ref(cls, variableref):
+        """
+        
+        Returns true if the given variable ref is a confml reference
+        """
+        matchref = cls.ref_pattern.match(variableref)
+        if matchref:
+            return matchref.group(1)
+        else:
+            return None
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/imageml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,205 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+A plugin implementation for image selection from ConfigurationLayers.
+'''
+
+
+import re
+import os
+import sys
+import logging
+import shutil
+import xml.parsers.expat
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+            
+import __init__
+
+from cone.public import exceptions,plugin,utils,api
+from imageplugin.generators import OutputGenerator,InputFile,InputDir,InvalidInputFileException
+
+class ImageImpl(plugin.ImplBase):
+    """
+    ContentImpl plugin finds all image resources from each layer and copies
+    them to the output correctly. It follows the Configuration project override
+    rules, so that the topmost layer files override files on the previous layers.
+    """
+    
+    IMPL_TYPE_ID = "imageml"
+    
+    def __init__(self,ref,configuration):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.include = {}
+        self.exclude = {}
+        self.input = ""
+        self.desc = ""
+        self.output_file = ""
+        self.logger = logging.getLogger('cone.imageml(%s)' % self.ref)
+        self.errors = False
+
+    def get_include_pattern(self):
+        include_pattern = ""
+        if self.include.has_key('pattern'): 
+            include_pattern = self.include['pattern'][0] 
+        return include_pattern
+    
+    def get_exclude_pattern(self):
+        exclude_pattern = ""
+        if self.exclude.has_key('pattern'): 
+            exclude_pattern = self.exclude['pattern'][0] 
+        return exclude_pattern
+    
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        return []
+    
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        self.logger.info('Generating')
+        ret = True
+        for generator in self.generators:
+            self.logger.info(generator)
+            generator.subpath =  self.output
+            try:
+                ret = generator.generate() and ret
+            except InvalidInputFileException, e:
+                self.logger.error(e)
+        return ret
+    
+    def generate_layers(self,layers):
+        """
+        Generate the given Configuration layers.
+        """
+        return self.generate()
+    
+    def get_refs(self):
+        refs = []
+        for generator in self.generators:
+            refs.extend(generator.get_refs())
+        if refs:
+            return utils.distinct_array(refs)
+        else:
+            return None
+
+
+class ImageImplReader(plugin.ReaderBase):
+    """
+    Parses a single imageml implml file
+    """ 
+    NAMESPACE = 'http://www.s60.com/xml/imageml/1'
+    FILE_EXTENSIONS = ['imageml']
+    
+    INCLUDE_ATTR = ['pattern']
+    EXCLUDE_ATTR = ['pattern']
+    def __init__(self):
+        self.desc = None
+        self.output = None
+        self.input_dir = None
+        self.include = None
+        self.exclude = None
+        self.namespaces = [self.NAMESPACE]
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = ImageImplReader()
+        reader.desc = reader.parse_desc(etree)
+        reader.outputgenerators = reader.parse_outputs(etree)
+
+        impl = ImageImpl(resource_ref, configuration)
+        impl.desc = reader.desc
+        impl.generators = reader.outputgenerators
+        for generator in impl.generators:
+            generator.configuration = configuration
+        
+        return impl
+
+    def fromstring(self, xml_as_string):
+        etree = ElementTree.fromstring(xml_as_string)
+        self.desc = self.parse_desc(etree)
+        self.outputgenerators = self.parse_outputs(etree)
+        return
+
+    def parse_desc(self,etree):
+        desc = ""
+        desc_elem = etree.find("{%s}desc" % self.namespaces[0])
+        if desc_elem != None:
+            desc = desc_elem.text
+        return desc
+
+    def parse_input_include(self,etree):
+        include_elem = etree.findall("{%s}include" % self.namespaces[0])
+        include = {}
+        for f in include_elem:
+            for key in self.INCLUDE_ATTR:
+                # Add the attribute if it is found to include dict
+                include[key] = []
+                attr = f.get(key)
+                if attr: include[key].append((attr))
+        return include
+
+    def parse_input_exclude(self,etree):
+        elem = etree.findall("{%s}exclude" % self.namespaces[0])
+        exclude = {}
+        for f in elem:
+            for key in self.EXCLUDE_ATTR:
+                # Add the attribute if it is found
+                exclude[key] = []
+                attr = f.get(key)
+                if attr: exclude[key].append((attr))
+        return exclude
+
+    def parse_inputs(self,etree):
+        inputs = etree.findall("{%s}input" % self.namespaces[0])
+        inputlist = []
+        for input_elem in inputs:
+            if input_elem.get('dir'):
+                inputdir = InputDir(input_elem.get('dir'),**input_elem.attrib)
+                inputdir.include = self.parse_input_include(input_elem)
+                inputdir.exclude = self.parse_input_exclude(input_elem)
+                inputlist.append(inputdir)
+            elif input_elem.get('file'):
+                inputlist.append(InputFile(input_elem.get('file'),**input_elem.attrib))
+        return inputlist
+
+    def parse_outputs(self,etree):
+        outputs = etree.findall("{%s}output" % self.namespaces[0])
+        outputpath = ""
+        outputgenerators = []
+        for output_elem in outputs:
+            if output_elem.get('file'):
+                outputpath = output_elem.get('file')
+            generator = OutputGenerator(outputpath,**output_elem.attrib)
+            generator.inputs = self.parse_inputs(output_elem)
+            outputgenerators.append(generator)
+        return outputgenerators
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/product.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/CVC_StartupShutdownAnimations.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="Operator Startup Animation">
+	<confml:feature name="Operator Startup Animation" ref="CVC_StartupAnimationSequence">
+		<confml:desc>Startup animation. The customer specific startup element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Startup Animation Duration, seconds" ref="CVC_StartupAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Startup Audio" ref="CVC_StartupAnimationTone" type="file">
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Startup Frames Location" ref="CVC_StartupFrameLocation" type="folder">
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+	</confml:feature>
+	<confml:feature name="Operator Shutdown Animation" ref="CVC_ShutdownAnimationSequence">
+		<confml:desc>Shutdown animation. The customer specific shutdown element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Shutdown Animation Duration" ref="CVC_ShutdownAnimationDuration" type="int">
+			<confml:desc>Display time for still image is max 3 seconds, for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Shutdown Audio" ref="CVC_ShutdownAnimationTone" type="file">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+		</confml:setting>
+		<confml:setting name="Shutdown Frames Location" ref="CVC_ShutdownFrameLocation" type="folder">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+		<confml:CVC_StartupAnimationSequence>
+			<confml:CVC_StartupAnimationDuration>3000</confml:CVC_StartupAnimationDuration>
+			<confml:CVC_StartupAnimationTone>
+			</confml:CVC_StartupAnimationTone>
+			<confml:CVC_StartupFrameLocation>
+				<confml:localPath>UI/Start-up Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_StartupFrameLocation>
+		</confml:CVC_StartupAnimationSequence>
+		<confml:CVC_ShutdownAnimationSequence>
+			<confml:CVC_ShutdownAnimationDuration>3000</confml:CVC_ShutdownAnimationDuration>
+			<confml:CVC_ShutdownAnimationTone>
+				<confml:localPath/>
+				<confml:targetPath/>
+			</confml:CVC_ShutdownAnimationTone>
+			<confml:CVC_ShutdownFrameLocation>
+				<confml:localPath>UI/Shutdown Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_ShutdownFrameLocation>
+		</confml:CVC_ShutdownAnimationSequence>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+<data>
+    <StartupConfigurationSettings>
+      <StartupAnimationPath>Z:\\resource\\apps\\startup.mif</StartupAnimationPath>
+    </StartupConfigurationSettings>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/depth_from_ref_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="DepthFromRefTest" version="1">
+  <feature ref="DepthFromRefTest">
+    <setting ref="Depth" type="string"/>
+  </feature>
+  <data>
+    <DepthFromRefTest>
+      <Depth>c16</Depth>
+    </DepthFromRefTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/optional_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="OptionalTest" version="1">
+  <feature ref="OptionalTest">
+    <setting ref="EmptyString" type="string"/>
+    <setting ref="EmptyString2" type="string"/>
+  </feature>
+  <data>
+    <OptionalTest>
+      <EmptyString></EmptyString>
+      <EmptyString2></EmptyString2>
+    </OptionalTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/confml/startup.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,231 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="startup">
+  <feature name="CRUidStartup" ref="KCRUidStartup">
+    <desc/>
+    <setting name="Startup Reason" ref="KStartupReason" type="int">
+      <desc>Used by Starter to set the additional startup reason (lang switch, RFS, etc.)</desc>
+    </setting>
+    <setting name="Startup First Boot" ref="KStartupFirstBoot" type="int">
+      <desc>Used by Starter to check whether this is the first boot. The value is set by Startup Application.</desc>
+    </setting>
+    <setting name="Startup Sim Language" ref="KStartupSimLanguage" type="int">
+      <desc>Used by automatic language selection to store the last automatically selected language code.</desc>
+    </setting>
+  </feature>
+  <feature name="Startup Configuration Settings" ref="StartupSettings">
+    <desc/>
+    <setting name="SIMless Offline Mode" ref="SIMlessOfflineMode" type="selection">
+      <desc>Enable/disable the SIMless Offline mode. The value must reflect the Cellular Modem implementation.</desc>
+      <option name="Disable" value="0"/>
+      <option name="Enable" value="1"/>
+    </setting>
+    <setting name="Welcome Note Image" ref="WelcomeNoteImage" type="string">
+      <desc>The welcome note image (user selection in General Settings).</desc>
+    </setting>
+    <setting name="Welcome Note Text" ref="WelcomeNoteText" type="string">
+      <desc>The welcome note text (user selection in General Settings).</desc>
+    </setting>
+    <setting name="Welcome Note Type" ref="WelcomeNoteType" type="selection">
+      <desc>The welcome note type (user selection in General Settings).</desc>
+      <option name="Default" value="0"/>
+      <option name="Text" value="1"/>
+      <option name="Image" value="2"/>
+    </setting>
+    <setting name="Operator Note Image" ref="OperatorNoteImage" type="string">
+      <desc>The operator note image. Will overrule the user selection, if defined.</desc>
+    </setting>
+    <setting name="Operator Note Text" ref="OperatorNoteText" type="string">
+      <desc>The operator note text. Will overrule the user selection, if defined.</desc>
+    </setting>
+    <setting name="Plugin Timeout" ref="PluginTimeout" type="int">
+      <desc>Indicates the timeout for plug-in calls in milliseconds.</desc>
+    </setting>
+    <setting name="Startup Reset Counter" ref="KStartupResetCounter" type="int">
+      <desc>Indicates the amount of subsequent resets.</desc>
+    </setting>
+    <setting name="Reset Limit" ref="ResetLimit" type="int">
+      <desc>Indicates the maximum number of subsequent resets allowed.</desc>
+    </setting>
+    <setting name="Startup Animation Scaling" ref="KStartupAnimationScaling" type="int">
+      <desc>Indicates whether to try to scale the image to better fit the screen size or just use the target size of the animation as it is.&#13;
+The value is only used if the animation format supports enabling/disabling scaling.&#13;
+0 - disable scaling&#13;
+1 - enable scaling</desc>
+    </setting>
+    <setting name="Startup Tone Path" ref="StartupTonePath" type="string">
+      <desc>A string that defines the path to the startup tone MIDI file.</desc>
+    </setting>
+    <setting name="Startup Tone Volume" ref="StartupToneVolume" type="int">
+      <desc>The volume level used when playing the startup tone. Possible values range from 0 to 10.</desc>
+    </setting>
+    <setting name="Startup Operator Animation Scaling" ref="KStartupOperatorAnimationScaling" type="int">
+      <desc>Indicates whether to try to scale the image to better fit the screen size or just use the target size of the animation as it is.&#13;
+The value is only used if the animation format supports enabling/disabling scaling.&#13;
+0 - disable scaling&#13;
+1 - enable scaling</desc>
+    </setting>
+    <setting name="Operator Startup MIDI File" ref="OperatorStartupMIDIFile" type="string">
+      <desc>A string that defines the path to the operator specific startup tone MIDI file.</desc>
+    </setting>
+    <setting name="Shutdown Animation Scaling" ref="KShutdownAnimationScaling" type="int">
+      <desc>Indicates whether to try to scale the image to better fit the screen size or just use the target size of the animation as it is.&#13;
+The value is only used if the animation format supports enabling/disabling scaling.&#13;
+0 - disable scaling&#13;
+1 - enable scaling</desc>
+    </setting>
+  </feature>
+  <feature name="Starter Server Configuration" ref="KCRUidStarterConf">
+    <desc>Starter server configuration</desc>
+    <setting name="Starter Monitoring TimeLimit" readOnly="true" ref="KStarterMonitoringTimeLimit" type="int">
+      <desc>Used for determining if a component has been running for a long time or if it has been started just recently. This information is required when deciding whether to try to re-start the component if it dies for some reason. Key value is a time limit (in seconds) which determines whether the item has been started recently or a while ago.</desc>
+    </setting>
+    <setting name="Starter Startup Completion Time Limit" readOnly="true" ref="KStarterStartupCompletionTimeLimit" type="int"/>
+    <setting name="Starter Local Variantion Flags" readOnly="true" ref="KStarterLocalVariantionFlags" type="int"/>
+  </feature>
+  <feature name="Startup Configuration Settings" ref="StartupConfigurationSettings">
+    <setting name="Startup default time" ref="startupDefaultTime" type="string">
+      <desc>Default date and time value to propose to user during first boot.Format is YYYYMMDD:HHMMSS. The month and day values are offset from zero.Example: 20070000:090000 - 01.01.2007 09:00 AM.</desc>
+    </setting>
+    <setting name="Startup Animation Path" ref="StartupAnimationPath" type="string">
+      <desc>A string that defines the path and file name of the startup animation file. This is the first animation shown during the system start-up.The value is mandatory, and it has to be a file name and a path of a valid animation file.The animation file should be stored in a location where system applications have read access.Supported formats are SVG-T (.svg, .svgb), MIF (.mif) and GIF (.gif).The length of the startup animation should be 3 seconds.Example: Z:\\resource\\apps\\startup.svg</desc>
+    </setting>
+    <setting name="Startup Animation Frame Delay" ref="StartupAnimationFrameDelay" type="int">
+      <desc>A frame delay value in microseconds for fine-tuning the startup animation.The value is only used if:a) The animation file contains an animation format, which does not contain frame delay information in it (MIF), or b) The animation file contains a still image, and no startup tone has been specified, in which case this value defines how long the image is shown.</desc>
+    </setting>
+    <setting name="Startup Operator Animation Path" ref="StartupOperatorAnimationPath" type="string">
+      <desc>A string that defines the path and file name of the operator-specific startup animation file.The operator-specific startup animation is shown after the startup animation.The value is optional. If defined, it has to be a file name and a path of a valid animation file. The animation file should be stored in a location where system applications have read access. Supported formats are SVG-T (.svg, .svgb), MIF (.mif) and GIF (.gif). The length of the operator-specific startup animation should be 3-5 seconds. Animations longer than that may cause performance problems.Example: Z:\\resource\\apps\\operatorstartup.svg </desc>
+    </setting>
+    <setting name="Startup Operator Animation Frame Delay" ref="StartupOperatorAnimationFrameDelay" type="int">
+      <desc>A frame delay value in microseconds for fine-tuning the operator-specific startup animation. The value is only used if: a) The operator-specific startup animation file contains an animation format, which does not contain frame delay information in it (MIF), or b) The operator-specific startup animation file contains a still image, and no operator-specific startup tone has been specified, in which case this value defines how long the image is shown.</desc>
+    </setting>
+    <setting name="Startup Operator Tone Volume" ref="StartupOperatorToneVolume" type="int">
+      <desc>The volume level used when playing the operator-specific startup tone.Possible values range from 0 to 10. If the ringing tone is silent, the tone is not played.</desc>
+    </setting>
+    <setting name="Shutdown Animation Path" ref="ShutdownAnimationPath" type="string">
+      <desc>A string that defines the path and file name of the shutdown animation file. The shutdown animation is shown during the system shutdown. The value is optional. If defined, it has to be a file name and a path of a valid animation file. The animation file should be stored in a location where system applications have read access. Supported formats are SVG-T (.svg, .svgb), MIF (.mif) and GIF (.gif). The length of the shutdown animation should be at most 3 seconds. Example: Z:\\resource\\apps\\shutdown.svg</desc>
+    </setting>
+    <setting name="Shutdown Animation Frame Delay" ref="ShutdownAnimationFrameDelay" type="int">
+      <desc>A frame delay value in microseconds for fine-tuning the shutdown animation. The value is only used if: a) The shutdown animation file contains an animation format, which does not contain frame delay information in it (MIF), or b) The shutdown animation file contains a still image, and no shutdown tone has been specified, in which case this value defines how long the image is shown.</desc>
+    </setting>
+    <setting name="Shutdown Tone Path" ref="ShutdownTonePath" type="string">
+      <desc>A string that defines the path to the shutdown tone MIDI file.The tone is played at the same time as the shutdown animation is shown. The value is optional. The tone file should be stored in a location where system applications have read access.The shutdown tone should be at most 3 seconds long. The tone will be played to the end before continuing the shutdown.Example: Z:\\resource\\apps\\shutdown.wav </desc>
+    </setting>
+    <setting name="Shutdown Tone Volume" ref="ShutdownToneVolume" type="int">
+      <desc>The volume level used when playing the shutdown tone.Possible values range from 0 to 10.If the ringing tone is silent, the tone is not played.</desc>
+    </setting>
+  </feature>
+  <feature name="Startup Settings" ref="KCRUidStartupConf">
+    <setting name="Startup Queries" ref="KStartupQueries" type="selection">
+      <desc>Enable / disable startup queries (city, date, time)</desc>
+      <option name="Startup Queries Disabled" value="0"/>
+      <option name="Startup Queries Enabled" value="1"/>
+    </setting>
+    <setting name="Path of 1. Startup List Extension" ref="KStartupListExtension1Path" type="string">
+      <desc>String that defines the path to first startup list extension resource file. Empty values indicates that there is no startup list extension resource file.</desc>
+    </setting>
+    <setting name="Path of 2. Startup List Extension" ref="KStartupListExtension2Path" type="string">
+      <desc>String that defines the path to second startup list extension resource file. Empty values indicates that there is no startup list extension resource file.</desc>
+    </setting>
+  </feature>
+  <feature name="Starter Server Stored Values" ref="KCRUidStarterVals">
+    <desc/>
+    <setting name="Starter Stored Imsi" ref="KStarterStoredImsi" type="string"/>
+  </feature>
+  <data>
+    <KCRUidStartup>
+      <KStartupReason>100</KStartupReason>
+      <KStartupFirstBoot>0</KStartupFirstBoot>
+      <KStartupSimLanguage>0</KStartupSimLanguage>
+    </KCRUidStartup>
+    <StartupSettings>
+      <SIMlessOfflineMode>1</SIMlessOfflineMode>
+      <WelcomeNoteImage/>
+      <WelcomeNoteText/>
+      <WelcomeNoteType>0</WelcomeNoteType>
+      <OperatorNoteImage/>
+      <OperatorNoteText/>
+      <PluginTimeout>30000</PluginTimeout>
+      <KStartupResetCounter>0</KStartupResetCounter>
+      <ResetLimit>5</ResetLimit>
+      <KStartupAnimationScaling>0</KStartupAnimationScaling>
+      <StartupTonePath/>
+      <StartupToneVolume>4</StartupToneVolume>
+      <KStartupOperatorAnimationScaling>0</KStartupOperatorAnimationScaling>
+      <OperatorStartupMIDIFile/>
+      <KShutdownAnimationScaling>0</KShutdownAnimationScaling>
+    </StartupSettings>
+    <KCRUidStarterConf>
+      <KStarterMonitoringTimeLimit>60</KStarterMonitoringTimeLimit>
+      <KStarterStartupCompletionTimeLimit>20</KStarterStartupCompletionTimeLimit>
+      <KStarterLocalVariantionFlags>0x00000001</KStarterLocalVariantionFlags>
+    </KCRUidStarterConf>
+    <StartupConfigurationSettings>
+      <startupDefaultTime/>
+      <StartupAnimationPath>Z:\\resource\\apps\\startup.mbm</StartupAnimationPath>
+      <StartupAnimationFrameDelay>135000</StartupAnimationFrameDelay>
+      <StartupOperatorAnimationPath/>
+      <StartupOperatorAnimationFrameDelay>100000</StartupOperatorAnimationFrameDelay>
+      <StartupOperatorToneVolume>4</StartupOperatorToneVolume>
+      <ShutdownAnimationPath/>
+      <ShutdownAnimationFrameDelay>100000</ShutdownAnimationFrameDelay>
+      <ShutdownTonePath/>
+      <ShutdownToneVolume>4</ShutdownToneVolume>
+    </StartupConfigurationSettings>
+    <KCRUidStartupConf>
+      <KStartupQueries>1</KStartupQueries>
+      <KStartupListExtension1Path/>
+      <KStartupListExtension2Path/>
+    </KCRUidStartupConf>
+    <KCRUidStarterVals>
+      <KStarterStoredImsi/>
+    </KCRUidStarterVals>
+  </data>
+  <rfs>
+    <KCRUidStartup>
+      <KStartupReason>false</KStartupReason>
+      <KStartupFirstBoot>false</KStartupFirstBoot>
+      <KStartupSimLanguage>true</KStartupSimLanguage>
+    </KCRUidStartup>
+    <StartupSettings>
+      <SIMlessOfflineMode>false</SIMlessOfflineMode>
+      <WelcomeNoteImage>true</WelcomeNoteImage>
+      <WelcomeNoteText>true</WelcomeNoteText>
+      <WelcomeNoteType>true</WelcomeNoteType>
+      <OperatorNoteImage>false</OperatorNoteImage>
+      <OperatorNoteText>false</OperatorNoteText>
+      <PluginTimeout>false</PluginTimeout>
+      <KStartupResetCounter>false</KStartupResetCounter>
+      <ResetLimit>false</ResetLimit>
+      <KStartupAnimationScaling>false</KStartupAnimationScaling>
+      <StartupTonePath>false</StartupTonePath>
+      <StartupToneVolume>false</StartupToneVolume>
+      <KStartupOperatorAnimationScaling>false</KStartupOperatorAnimationScaling>
+      <OperatorStartupMIDIFile>false</OperatorStartupMIDIFile>
+      <KShutdownAnimationScaling>false</KShutdownAnimationScaling>
+    </StartupSettings>
+    <KCRUidStarterConf>
+      <KStarterMonitoringTimeLimit>false</KStarterMonitoringTimeLimit>
+      <KStarterStartupCompletionTimeLimit>false</KStarterStartupCompletionTimeLimit>
+      <KStarterLocalVariantionFlags>false</KStarterLocalVariantionFlags>
+    </KCRUidStarterConf>
+    <StartupConfigurationSettings>
+      <startupDefaultTime>false</startupDefaultTime>
+      <StartupAnimationPath>false</StartupAnimationPath>
+      <StartupAnimationFrameDelay>false</StartupAnimationFrameDelay>
+      <StartupOperatorAnimationPath>false</StartupOperatorAnimationPath>
+      <StartupOperatorAnimationFrameDelay>false</StartupOperatorAnimationFrameDelay>
+      <StartupOperatorToneVolume>false</StartupOperatorToneVolume>
+      <ShutdownAnimationPath>false</ShutdownAnimationPath>
+      <ShutdownAnimationFrameDelay>false</ShutdownAnimationFrameDelay>
+      <ShutdownTonePath>false</ShutdownTonePath>
+      <ShutdownToneVolume>false</ShutdownToneVolume>
+    </StartupConfigurationSettings>
+    <KCRUidStartupConf>
+      <KStartupQueries>false</KStartupQueries>
+      <KStartupListExtension1Path>false</KStartupListExtension1Path>
+      <KStartupListExtension2Path>false</KStartupListExtension2Path>
+    </KCRUidStartupConf>
+    <KCRUidStarterVals>
+      <KStarterStoredImsi>false</KStarterStoredImsi>
+    </KCRUidStarterVals>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame01.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame02.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame03.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame04.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame05.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame06.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame07.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame08.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame09.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame10.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame11.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame12.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame13.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame14.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame15.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame16.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame17.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame18.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame19.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/frame20.bmp has changed
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/UI/Start-up Animation/wakeup_sound.mp3 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/content/svg_files/icon.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448)  -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd" [
+	<!ENTITY ns_svg "http://www.w3.org/2000/svg">
+	<!ENTITY ns_xlink "http://www.w3.org/1999/xlink">
+]>
+<svg  version="1.1" baseProfile="tiny" id="Layer_1" xmlns="&ns_svg;" xmlns:xlink="&ns_xlink;" width="24" height="24"
+	 viewBox="-0.5 -0.5 15 15" xml:space="preserve">
+<g>
+	<rect fill="none" width="14" height="14"/>
+	<g>
+		<g>
+			<g>
+				<path fill="#FFFFFF" d="M2.368,3.68c-0.389,0.389-0.389,1.025,0,1.414l6.538,6.538c0.389,0.39,1.025,0.39,1.414,0l1.314-1.315
+					c0.389-0.389,0.389-1.024,0-1.414L5.098,2.364c-0.389-0.389-1.025-0.389-1.414,0L2.368,3.68z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FFFFFF" d="M0,7.75c0,0.55,0.45,1,1,1h12c0.55,0,1-0.45,1-1v-1.5c0-0.55-0.45-1-1-1H1c-0.55,0-1,0.45-1,1V7.75z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FFFFFF" d="M6.25,0c-0.55,0-1,0.45-1,1v12c0,0.55,0.45,1,1,1h1.5c0.551,0,1-0.45,1-1V1c0-0.55-0.449-1-1-1H6.25z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FFFFFF" d="M10.385,2.402c-0.396-0.38-1.041-0.373-1.43,0.016L2.417,8.955c-0.389,0.389-0.382,1.02,0.016,1.398
+					l1.236,1.182c0.397,0.381,1.041,0.373,1.43-0.016l6.538-6.539c0.389-0.389,0.383-1.018-0.016-1.398L10.385,2.402z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FF0000" d="M3.09,4.161c-0.097,0.097-0.097,0.256,0,0.354l6.326,6.315c0.098,0.098,0.257,0.098,0.354,0L10.83,9.77
+					c0.097-0.098,0.097-0.256,0-0.354L4.504,3.101c-0.097-0.097-0.256-0.097-0.354,0L3.09,4.161z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FF0000" d="M0.864,7.5c0,0.139,0.112,0.25,0.25,0.25h11.803c0.138,0,0.25-0.111,0.25-0.25v-1
+					c0-0.138-0.112-0.25-0.25-0.25H1.114c-0.138,0-0.25,0.112-0.25,0.25V7.5z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FF0000" d="M6.5,0.853c-0.138,0-0.25,0.112-0.25,0.25v11.752c0,0.138,0.112,0.25,0.25,0.25h1
+					c0.139,0,0.25-0.112,0.25-0.25V1.103c0-0.138-0.111-0.25-0.25-0.25H6.5z"/>
+			</g>
+		</g>
+	</g>
+	<g>
+		<g>
+			<g>
+				<path fill="#FF0000" d="M9.866,3.072C9.766,2.977,9.605,2.979,9.509,3.076L3.16,9.426C3.063,9.521,3.064,9.68,3.164,9.775
+					l1.084,1.037c0.1,0.095,0.26,0.093,0.357-0.004l6.349-6.351c0.098-0.097,0.096-0.254-0.004-0.35L9.866,3.072z"/>
+			</g>
+		</g>
+	</g>
+</g>
+</svg>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/depth_from_ref_test.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    
+    <output file="depth_from_ref_test_mbm.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input file="UI/Start-up Animation/frame01.bmp" depth="${DepthFromRefTest.Depth}"/>
+    </output>
+    
+    
+    <output file="depth_from_ref_test_mif.mif" tool='../bin/mifconv'>
+        <input file="svg_files/icon.svg" depth="${DepthFromRefTest.Depth}"/>
+    </output>
+
+</imageml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/optional_test.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    
+    <!-- === -->
+    <!-- MBM -->
+    <!-- === -->
+    
+    <!-- All input files empty: No error, should just generate no output -->
+    <output file="optional1_mbm.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input file="${OptionalTest.EmptyString}" depth="c24"/>
+		<input file="${OptionalTest.EmptyString}" depth="1" optional="true"/>
+    </output>
+    <!-- Empty optional input file: No error, should generate normally, just without the optional file -->
+    <output file="optional2_mbm.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input file="UI/Start-up Animation/frame01.bmp" depth="c24"/>
+		<input file="${OptionalTest.EmptyString}" depth="1" optional="true"/>
+    </output>
+    <!-- Invalid optional input file: Should give an error and generate no output -->
+    <output file="optional3_mbm.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input file="UI/Start-up Animation/frame01.bmp" depth="c24"/>
+		<input file="foo" depth="1" optional="true"/>
+    </output>
+    <!-- Empty non-optional input file: Should give an error and generate no output -->
+    <output file="optional4_mbm.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input file="UI/Start-up Animation/frame01.bmp" depth="c24"/>
+		<input file="${OptionalTest.EmptyString}" depth="1"/>
+    </output>
+    
+    
+    <!-- === -->
+    <!-- MIF -->
+    <!-- === -->
+    
+    <output file="optional1_mif.mif" tool='../bin/mifconv'>
+        <input file="${OptionalTest.EmptyString}" depth="c24"/>
+		<input file="${OptionalTest.EmptyString}" depth="1" optional="true"/>
+    </output>
+    <output file="optional2_mif.mif" tool='../bin/mifconv'>
+        <input file="svg_files/icon.svg" depth="c24"/>
+        <!-- Using EmptyString2 for get_refs() test case -->
+		<input file="${OptionalTest.EmptyString2}" depth="1" optional="true"/>
+    </output>
+    <output file="optional3_mif.mif" tool='../bin/mifconv'>
+        <input file="svg_files/icon.svg" depth="c24"/>
+		<input file="foo" depth="1" optional="true"/>
+    </output>
+    <output file="optional4_mif.mif" tool='../bin/mifconv'>
+        <input file="svg_files/icon.svg" depth="c24"/>
+		<input file="${OptionalTest.EmptyString2}" depth="1"/>
+    </output>
+
+</imageml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/startup_animation.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="startup.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv'>
+        <input dir="UI/Start-up Animation">
+            <include pattern="bmp$"/>
+            <exclude pattern=".svn"/>
+        </input>
+    </output>
+    <output file="nocompress.mbm" palette='../bin/ThirdPartyBitmap.pal' tool='../bin/bmconv' compress='false'>
+        <input dir="UI/Start-up Animation" depth="c8">
+            <include pattern="bmp$"/>
+            <exclude pattern=".svn"/>
+        </input>
+    </output>
+    <output file="${StartupConfigurationSettings.StartupAnimationPath}" tool='../bin/mifconv'> 
+        <input dir="${CVC_StartupAnimationSequence.CVC_StartupFrameLocation.localPath}" depth="c8">
+            <include pattern="bmp$"/>
+        </input>
+    </output>
+</imageml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/implml/startupmif_animation.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="startup_mif.mif" tool='../bin/mifconv'>
+        <input dir="svg_files">
+            <include pattern="svg$"/>
+        </input>
+    </output>
+</imageml>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/imageproject/variant/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_generators.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,143 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import __init__
+
+from imageplugin import imageml,generators
+from cone.public import api, exceptions, plugin
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+def impl_from_resource(resource_ref, configuration):
+    impls = plugin.ImplFactory.get_impls_from_file(resource_ref, configuration)
+    assert len(impls) == 1
+    return impls[0]
+
+class TestGenerator(unittest.TestCase):
+    def test_create_generator_with_output(self):
+        gen = generators.OutputGenerator('foo/bar')
+        self.assertEquals(gen.outputpath,'foo/bar')
+        gen.outputpath = 'foo/bar/test.confml'
+        self.assertEquals(gen.outputpath,'foo/bar/test.confml')
+        del gen.outputpath
+        self.assertEquals(gen.outputpath,None)
+
+
+    def test_generator_subpath_and_path(self):
+        gen = generators.OutputGenerator('foo/bar.mbm')
+        self.assertEquals(gen.subpath, '')
+        gen.subpath = 'test/foo'
+        self.assertEquals(gen.subpath, 'test/foo')
+        self.assertEquals(gen.path, 'test/foo/foo/bar.mbm')
+        self.assertTrue(isinstance(gen.get_command(), generators.BmconvCommand))
+        gen.outputpath = 'bar/test.mif'
+        self.assertTrue(isinstance(gen.get_command(), generators.MifconvCommand))
+        gen.outputpath = 'bar/test.gif'
+        self.assertTrue(isinstance(gen.get_command(), generators.CopyCommand))
+
+
+class TestInputFile(unittest.TestCase):
+    def test_create_inputfile(self):
+        input = generators.InputFile('foo/bar.bmb')
+        self.assertEquals(input.path,'foo/bar.bmb')
+        self.assertEquals(input.files[0].filename, 'foo/bar.bmb')
+        input.path = 'foo/bar/test.confml'
+        self.assertEquals(input.path,'foo/bar/test.confml')
+        del input.path
+        self.assertEquals(input.path,None)
+        
+
+    def test_create_inputfile_with_args(self):
+        input = generators.InputFile('foo/bar.bmb',depth="c8",test="juu")
+        self.assertEquals(input.path,'foo/bar.bmb')
+        self.assertEquals(input.depth,'c8')
+        self.assertEquals(input.test,'juu')
+
+class TestInputDir(unittest.TestCase):
+    def test_create_inputdir(self):
+        dir = generators.InputDir('foo/bar', dir='foo/bar',depth="c8")
+        self.assertEquals(dir.path,'foo/bar')
+        self.assertEquals(dir.depth,'c8')
+        self.assertEquals(dir.files, [])
+
+    def test_create_inputdir_and_get_files(self):
+        dir = generators.InputDir('imageproject/variant/content/UI/Start-up Animation')
+        dir.include = {'pattern' : 'bmp$'}
+        self.assertEquals(dir.files, [])
+
+class TestGeneratorFromProject(unittest.TestCase):
+    def test_create_generator_from_project(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"imageproject")))
+        config = prj.get_configuration('product.confml')
+        impl = impl_from_resource('variant/implml/startup_animation.imageml', config)
+        self.assertEquals(impl.generators[0].outputpath, 'startup.mbm')
+        self.assertEquals(impl.generators[0].configuration, config)
+        self.assertEquals(impl.generators[0].palette, '../bin/ThirdPartyBitmap.pal')
+        self.assertEquals(impl.generators[0].inputs[0].configuration, config)
+        self.assertEquals(impl.generators[0].inputs[0].path, 'UI/Start-up Animation')
+        self.assertEquals(impl.generators[0].inputs[0].type, 'dir')
+        self.assertEquals(impl.generators[1].outputpath, 'nocompress.mbm')
+        self.assertEquals(impl.generators[1].get_command().compress, False)
+        self.assertEquals(impl.generators[1].inputs[0].configuration, config)
+        self.assertEquals(impl.generators[1].inputs[0].path, 'UI/Start-up Animation')
+        self.assertEquals(impl.generators[1].inputs[0].type, 'dir')
+        self.assertEquals(len(impl.generators[1].inputs[0].files),20)
+        self.assertEquals(impl.generators[1].inputs[0].files[0].filename,'variant/content/UI/Start-up Animation/frame01.bmp')
+        self.assertEquals(impl.generators[1].inputs[0].files[0].path,'UI/Start-up Animation/frame01.bmp')
+        self.assertEquals(impl.generators[1].inputs[0].files[0].depth,'c8')
+        self.assertEquals(impl.generators[1].inputs[0].files[19].filename,'variant/content/UI/Start-up Animation/frame20.bmp')
+        self.assertEquals(impl.generators[1].inputs[0].files[19].depth,'c8')
+    
+    def test_create_generator_with_configurable_depth_from_project(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"imageproject")))
+        config = prj.get_configuration('product.confml')
+        impl = impl_from_resource('variant/implml/depth_from_ref_test.imageml', config)
+        self.assertEquals(impl.generators[0].inputs[0].depth, 'c16')
+        self.assertEquals(impl.generators[1].inputs[0].depth, 'c16')
+        
+        # Assert the the depth is actually used in the command
+        command_obj = impl.generators[0].get_command()
+        cmd = command_obj.get_command(command_obj._get_filtered_input_files())
+        self.assertEquals(len(cmd), 4)
+        self.assertEquals(cmd[3], r'/c16conversion_workdir\frame01.bmp')
+        
+        command_obj = impl.generators[1].get_command()
+        cmd = command_obj.get_command(command_obj._get_filtered_input_files())
+        self.assertEquals(len(cmd), 5)
+        self.assertEquals(cmd[3], '/c16')
+        self.assertEquals(cmd[4], r'conversion_workdir\icon.svg')
+    
+    def test_create_generator_with_invalid_output(self):
+        prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"imageproject")))
+        config = prj.get_configuration('product.confml')
+        impl = impl_from_resource('variant/implml/startup_animation.imageml', config)
+        impl.generators[0].outputpath = '${KCRUidStartup.StartupOperatorAnimationPath}'
+        try:
+            self.assertEquals(impl.generators[0].outputpath, '${KCRUidStartup.StartupOperatorAnimationPath}')
+            self.fail("Output path value should be none")
+        except exceptions.NotFound:
+            pass
+
+        try:
+            self.assertEquals(impl.generators[0].outputpath, '${KCRUidStartup.foobar}')
+            self.fail("Output path ref is invalid!")
+        except exceptions.NotFound:
+            pass
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_imageml_parseimpl.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,174 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil
+import sys
+import __init__
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+		
+from imageplugin import imageml
+
+
+imageml_string = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="startup.mbm">
+    	<input dir="UI/Start-up Animation">
+    		<include pattern="bmb$"/>
+            <exclude pattern=".svn"/>
+    	</input>
+    </output>
+    <output file="shutdown.mbm">
+        <input file="UI/graphics/icon1.bmb" depth="8" />
+        <input file="UI/graphics/icon2.bmb" depth="8" />
+        <input file="UI/graphics/icon3.bmb" depth="8" />
+        <input file="UI/graphics/icon4.bmb" depth="8" />
+    </output>
+</imageml>
+'''
+
+imageml_with_refs = \
+'''<?xml version="1.0" encoding="UTF-8"?>
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="${features.outputref}">
+        <input dir="${features.inputref}">
+            <include pattern="${features.inputfilter}"/>
+        </input>
+    </output>
+    <output file="${features.outputseqfile}">
+        <input file="${features.outputseq.file.localpath}">
+        </input>
+    </output>
+</imageml>
+'''
+input_dir= \
+'''<output xmlns="http://www.s60.com/xml/imageml/1" file="test.mbm">
+  <input dir="UI/Start-up Animation" depth="8" test="foo">
+    <include pattern="bmb$"/>
+    <exclude pattern=".svn"/>
+  </input>
+  <input dir="UI/Start-up Animation/masks" depth="2">
+    <include pattern="bmb$"/>
+  </input>
+</output>
+'''
+input_files = \
+'''<output xmlns="http://www.s60.com/xml/imageml/1" file="test.mbm">
+  <input file="UI/graphics/icon1.bmb" depth="8" />
+  <input file="UI/graphics/icon2.bmb" depth="8" />
+  <input file="UI/graphics/icon3.bmb" depth="8" />
+  <input file="UI/graphics/icon4.bmb" depth="8" />
+</output>
+'''
+
+class TestImagemlParseimpl(unittest.TestCase):    
+
+    def test_parse_output(self):
+        etree = ElementTree.fromstring(imageml_string)
+        reader = imageml.ImageImplReader()
+        outgens = reader.parse_outputs(etree)
+        self.assertEquals(outgens[0].outputpath,'startup.mbm')
+
+    def test_parse_input_include(self):
+        etree = ElementTree.fromstring(input_dir)
+        input = etree.find("{%s}input" % 'http://www.s60.com/xml/imageml/1')
+        reader = imageml.ImageImplReader()
+        include = reader.parse_input_include(input)
+        self.assertEquals(include,{'pattern': ['bmb$']})
+
+    def test_parse_input_exclude(self):
+        etree = ElementTree.fromstring(input_dir)
+        input = etree.find("{%s}input" % 'http://www.s60.com/xml/imageml/1')
+        reader = imageml.ImageImplReader()
+        include = reader.parse_input_exclude(input)
+        self.assertEquals(include,{'pattern': ['.svn']})
+
+    def test_parse_inputs_with_dir(self):
+        etree = ElementTree.fromstring(input_dir)
+        reader = imageml.ImageImplReader()
+        inputs = reader.parse_inputs(etree)
+        self.assertEquals(inputs[0].path,'UI/Start-up Animation')
+        self.assertEquals(inputs[0].type,'dir')
+        self.assertEquals(inputs[0].include, ['bmb$'])
+        self.assertEquals(inputs[0].exclude, ['.svn'])
+        self.assertEquals(inputs[0].depth,'8')
+        self.assertEquals(inputs[0].test,'foo')
+        self.assertEquals(inputs[1].path,'UI/Start-up Animation/masks')
+        self.assertEquals(inputs[1].depth,'2')
+
+    def test_parse_inputs_with_files(self):
+        etree = ElementTree.fromstring(input_files)
+        reader = imageml.ImageImplReader()
+        inputs = reader.parse_inputs(etree)
+        self.assertEquals(inputs[0].path,'UI/graphics/icon1.bmb')
+        self.assertEquals(inputs[0].depth,'8')
+        self.assertEquals(inputs[1].path,'UI/graphics/icon2.bmb')
+        self.assertEquals(inputs[1].depth,'8')
+        self.assertEquals(inputs[2].path,'UI/graphics/icon3.bmb')
+        self.assertEquals(inputs[2].depth,'8')
+        self.assertEquals(inputs[3].path,'UI/graphics/icon4.bmb')
+        self.assertEquals(inputs[3].depth,'8')
+
+    def test_parse_outputs(self):
+        etree = ElementTree.fromstring(imageml_string)
+        reader = imageml.ImageImplReader()
+        outputs = reader.parse_outputs(etree)
+        self.assertEquals(outputs[0].outputpath,'startup.mbm')
+        self.assertEquals(outputs[0].inputs[0].path,'UI/Start-up Animation')
+        self.assertEquals(outputs[0].inputs[0].type,'dir')
+        self.assertEquals(outputs[0].inputs[0].include,['bmb$'])
+        self.assertEquals(outputs[0].inputs[0].exclude,['.svn'])
+        self.assertEquals(outputs[1].outputpath,'shutdown.mbm')
+        self.assertEquals(outputs[1].inputs[0].type,'file')
+        self.assertEquals(outputs[1].inputs[0].path,'UI/graphics/icon1.bmb')
+        self.assertEquals(outputs[1].inputs[1].type,'file')
+        self.assertEquals(outputs[1].inputs[1].path,'UI/graphics/icon2.bmb')
+        self.assertEquals(outputs[1].inputs[2].type,'file')
+        self.assertEquals(outputs[1].inputs[2].path,'UI/graphics/icon3.bmb')
+        self.assertEquals(outputs[1].inputs[3].type,'file')
+        self.assertEquals(outputs[1].inputs[3].path,'UI/graphics/icon4.bmb')
+
+    def test_parse_from_string(self):
+        reader = imageml.ImageImplReader()
+        reader.fromstring(imageml_string)
+        self.assertEquals(reader.desc,'')
+        self.assertEquals(reader.outputgenerators[0].outputpath,'startup.mbm')
+        self.assertEquals(reader.outputgenerators[0].inputs[0].path,'UI/Start-up Animation')
+        self.assertEquals(reader.outputgenerators[0].inputs[0].type,'dir')
+        self.assertEquals(reader.outputgenerators[0].inputs[0].include,['bmb$'])
+        self.assertEquals(reader.outputgenerators[0].inputs[0].exclude,['.svn'])
+
+    def test_parse_from_string_with_refs(self):
+        reader = imageml.ImageImplReader()
+        reader.fromstring(imageml_with_refs)
+        self.assertEquals(reader.outputgenerators[0]._outputpath,'${features.outputref}')
+        self.assertEquals(reader.outputgenerators[0].inputs[0]._path,'${features.inputref}')
+        self.assertEquals(reader.outputgenerators[0].inputs[0].type,'dir')
+        self.assertEquals(reader.outputgenerators[0].inputs[0].include,['${features.inputfilter}'])
+
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/imageplugin/tests/unittest_imageml_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,103 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest
+import os, shutil, re
+import sys
+import logging
+import shutil
+import __init__
+		
+from cone.public import exceptions,plugin,api,container
+from cone.storage import filestorage
+from imageplugin import imageml
+from testautomation.base_testcase import BaseTestCase
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testdata  = os.path.join(ROOT_PATH,'imageproject')
+
+class TestGeneratorFromProject(BaseTestCase):
+    def test_create_generator_from_project_and_generate_all(self):
+        orig_workdir = os.getcwd()
+        os.chdir(ROOT_PATH)
+        try:
+            output = os.path.join(ROOT_PATH, "temp/output_all")
+            self.recreate_dir(output)
+            
+            prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"imageproject")))
+            config = prj.get_configuration('product.confml')
+            implcontainer = plugin.get_impl_set(config, 'imageml$')
+            self.assertEquals(len(implcontainer), 4)
+            implcontainer.output = output
+            implcontainer.generate()
+            
+            def check_gen(p):
+                self.assert_exists_and_contains_something(os.path.join(output, p))
+            def check_not_gen(p):
+                self.assertFalse(os.path.exists(os.path.join(output, p)), "'%s' exists when it should not!" % p)
+            
+            try:
+	            check_gen('startup.mbm')
+	            check_gen('startup_mif.mif')
+	            
+	            check_not_gen('optional1_mbm.mbm')
+	            check_gen('optional2_mbm.mbm')
+	            check_not_gen('optional3_mbm.mbm')
+	            check_not_gen('optional4_mbm.mbm')
+	            
+	            check_not_gen('optional1_mif.mif')
+	            check_gen('optional2_mif.mif')
+	            check_not_gen('optional3_mif.mif')
+	            check_not_gen('optional4_mif.mif')
+	            
+	            check_gen('resource/apps/startup.mif')
+	            
+	            check_gen('depth_from_ref_test_mbm.mbm')
+	            check_gen('depth_from_ref_test_mif.mif')
+    	    except AssertionError:
+	            if ' ' in ROOT_PATH:
+	                self.fail("Known bug (#177)")
+	            else:
+	                raise
+        finally:
+            os.chdir(orig_workdir)
+    
+    def _get_impl(self, filename):
+    	prj = api.Project(api.Storage.open(os.path.join(ROOT_PATH, "imageproject")))
+        config = prj.get_configuration('product.confml')
+        implcontainer = plugin.get_impl_set(config, re.escape(filename) + '$')
+        self.assertEquals(len(implcontainer), 1)
+        return iter(implcontainer).next()
+        
+    
+    def test_get_refs(self):
+    	impl = self._get_impl('startupmif_animation.imageml')
+    	self.assertEquals(impl.get_refs(), None)
+    	self.assertEquals(impl.has_ref('Foo.Bar'), None)
+    	
+    	impl = self._get_impl('optional_test.imageml')
+    	self.assertEquals(impl.get_refs(), ['OptionalTest.EmptyString',
+										    'OptionalTest.EmptyString2'])
+    	self.assertEquals(impl.has_ref('OptionalTest.EmptyString'), True)
+    	self.assertEquals(impl.has_ref('Foo.Foo'), False)
+    	
+    	impl = self._get_impl('startup_animation.imageml')
+    	self.assertEquals(impl.get_refs(), ['CVC_StartupAnimationSequence.CVC_StartupFrameLocation.localPath'])
+    	self.assertEquals(impl.has_ref('CVC_StartupAnimationSequence.CVC_StartupFrameLocation.localPath'), True)
+    	self.assertEquals(impl.has_ref('Foo.Foo'), False)
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeImagePlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from imageplugin import __version__
+
+setup(
+    name = "coneimageplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "imageplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Content copier plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['imageml = imageplugin.imageml:ImageImplReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>ConeProjectConverterPlugin</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.python.pydev.PyDevBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.python.pydev.pythonNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/.pydevproject	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<?eclipse-pydev version="1.0"?>
+
+<pydev_project>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_VERSION">python 2.5</pydev_property>
+<pydev_property name="org.python.pydev.PYTHON_PROJECT_INTERPRETER">Default</pydev_property>
+</pydev_project>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
+
+
+import pkg_resources 
+import sys,os
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/convertproject.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,665 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+'''
+Convert project ConE plugin
+'''
+
+import re
+import os
+import sys
+import logging
+import xml.parsers.expat
+import shutil
+import fnmatch
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import __init__
+
+from cone.storage import filestorage
+from cone.public import exceptions,plugin,utils,api
+
+class ConvertProjectImpl(plugin.ImplBase):
+    """
+    Class to implements ConE plugin that convert old configuration to
+    configuration project. Some extra functions supported in the top
+    of normal file copying functions. For example creation of layer and
+    configuration root files automatically. 
+    """
+    
+    IMPL_TYPE_ID = "convertprojectml"
+    
+    
+    def __init__(self,ref,configuration):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.desc = ""
+        self.logger = logging.getLogger('cone.convertprojectml(%s)' % self.ref)
+        self.errors = False
+        
+        #Internal plugin data
+        self.project_data = {}
+        self.layers = []
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        
+        #Generating content
+        fullOutputPath = self.output
+        if self.project_data.has_key("path"): 
+            targetPath = utils.resourceref.norm(self.project_data["path"])
+            if targetPath and targetPath != "":
+                fullOutputPath = os.path.join(fullOutputPath, targetPath)             
+        
+        fs = filestorage.FileStorage(fullOutputPath, "w")
+        newProject = api.Project(fs)        
+        for layer in self.layers:
+            layer.generate(newProject, self.configuration.get_storage().get_path())        
+        newProject.close()
+        
+        #Opening project again to validate the content and remove illegal includes.
+        if self.project_data.has_key("validate") and self.project_data["validate"] != "false":            
+            fs = filestorage.FileStorage(fullOutputPath, "w")
+            validateProject = api.Project(fs)
+            for conf in validateProject.list_configurations():
+                validateProject.get_configuration(conf).list_all_configurations()
+            validateProject.close()
+        
+        return 
+    
+    def generate_layers(self,layers):
+        """
+        Generate the given Configuration layers.
+        """
+        self.logger.info('Generating layers %s' % layers)
+        self.generate()
+        
+        return 
+    
+    def has_ref(self,ref):
+        """
+        @returns True if the implementation uses the given ref as input value.
+        Otherwise return False.
+        """
+        
+        return None
+
+#=================================================================
+class ConvertProjectLayer(object):
+    """
+    Object presenting layer in convertprojectml file.
+    """
+    
+    def __init__(self, path):
+        if path != None:
+            self.path = path
+        else:
+            self.path = ""
+        self.folders = []
+        self.files = []        
+
+    def __str__(self):
+        retStr = ""
+        retStr += "\nPath: %s\n" % self.path
+        retStr +="Folders:\n"        
+        for folder in self.folders: 
+            retStr += folder.__str__()
+        retStr +="Files:\n"
+        for file in self.files:
+            retStr += file.__str__()    
+        return retStr
+    
+    def generate(self, project, old_structure_root):
+        """
+        Function to handle generation to one folder.
+        """
+        
+        #Create layer folder.
+        project.get_storage().create_folder(utils.resourceref.norm(self.path))
+        #print "Created Layer:", utils.resourceref.norm(self.path)
+        
+        for folder in self.folders:
+            folder.generate(project, old_structure_root)
+        
+        for f in self.files:
+            f.generate(project, old_structure_root)
+        
+        return
+    
+    def addFolder(self, folder):
+        self.folders.append(folder)
+
+    def addFile(self, file):
+        self.files.append(file)
+
+    def getProjectPath(self):
+        return self.path
+
+                
+class ConvertProjectFolder(object):
+    """
+    Object presenting folder in convertprojectml file.
+    """
+        
+    def __init__(self, path, parent=None):
+        if path != None:
+            self.path = path
+        else:
+            self.path = ""        
+        self.filters = []
+        self.parent = parent
+
+    def __str__(self):
+        retStr = ""
+        retStr += "\tPath: %s\n" % self.path
+        retStr +="\tFilters:\n"
+        for filter in self.filters: 
+            retStr += filter.__str__()
+        return retStr 
+    
+    def generate(self, project, old_structure_root):
+        
+        #Adding new folder to project.
+        project.get_storage().create_folder(utils.resourceref.norm(self.getProjectPath()))
+        #print "Created folder:", utils.resourceref.norm(self.getProjectPath())
+        
+        for filter in self.filters:
+            filter.generate(project, old_structure_root, "folder")
+        return
+    
+    def addFilter(self, filter):
+        self.filters.append(filter)
+
+    def getProjectPath(self):
+        return os.path.join(self.parent.getProjectPath(), self.path)
+    
+class ConvertProjectFile(object):
+    """
+    Object presenting file in convertprojectml file.
+    """
+        
+    def __init__(self, path, type, parent=None):
+        if path != None:
+            self.path = path
+        else:
+            self.path = ""
+        if type != None:
+            self.type = type
+        else:
+            self.type = ""        
+            
+        self.filters = []
+        self.parent = parent
+        self.meta = []
+        self.desc = ""
+        
+    def __str__(self):
+        retStr = ""
+        retStr += "\tPath: %s\n" % self.path
+        retStr += "\tType: %s\n" % self.type
+        retStr +="\tFilters:\n"
+        for filter in self.filters:
+            retStr += filter.__str__()
+        return retStr             
+
+    def generate(self, project, old_structure_root):
+        for filter in self.filters:            
+            filter.generate(project, old_structure_root, self.type)                        
+
+        if self.type == "configuration_root":
+            #Adding metadata                
+            config = project.get_configuration(utils.resourceref.norm(self.path))
+            if self.meta:                
+                if not config.meta:
+                    config.meta = []
+                for meta in self.meta:
+                    config.meta.add(meta[0], meta[1], meta[2], meta[3])                        
+            if self.desc:
+                config.desc = self.desc
+                
+            config.save()                    
+        return
+
+    def addFilter(self, filter):
+        self.filters.append(filter)
+
+    def addMeta(self, meta):
+        self.meta = meta
+
+    def addDescription(self, desc):
+        self.desc = desc
+
+    def getProjectPath(self):
+        return os.path.join(self.parent.getProjectPath(), self.path)
+
+class ConvertProjectFilter(object):
+    """
+    Object presenting filter in convertprojectml file.
+    """
+        
+    def __init__(self, action, data, parent=None, remove_includes = "false", recursive = "false"):
+        self.action = action
+        self.data = data
+        self.parent = parent
+        if remove_includes:
+            self.remove_includes = remove_includes
+        else:
+            self.remove_includes = "false"
+        if recursive:
+            self.recursive = recursive
+        else:
+             self.recursive = "false"
+
+    def __str__(self):
+        retStr = ""
+        retStr += "\t\tAction: %s\n" % self.action
+        retStr += "\t\tData: %s\n" % self.data
+        return retStr    
+        
+    def generate(self, project, old_structure_root, type="none"):
+        """
+        @param project: New configuration project
+        @type project:
+        @param old_structure_root: Path to old projects root.
+        @type old_structure_root:
+        
+        """
+               
+        if type == "" or type == "folder":
+            self.handleAddRemove(project, old_structure_root)
+        elif type == "layer_root":
+            self.handleLayerRoot(project)
+        elif type == "configuration_root":
+            self.handleConfigurationRoot(project)
+        else:
+            #raise exceptions.NotSupportedException("Type: %s not supported as file type" % repr(type))
+            pass            
+        return
+
+    def handleAddRemove(self, project, old_structure_root):
+        """
+        """
+        
+        pathPart, wildCardPart = self.separatePathAndWildcard(self.data)
+        filesToProcess = []
+        if wildCardPart == "":
+            #No wildcards found.
+            if self.recursive == "false":
+                source = os.path.join(old_structure_root, pathPart)
+                targetDir = self.resolveTargetDir(project, source)                
+                filesToProcess.append({"source": source, "targetDir": targetDir})                
+            else:
+            #recursive search for directory entries.               
+                directoryPath = os.path.join(old_structure_root, pathPart)
+                if os.path.isdir(directoryPath):
+                    for root, dirs, files in os.walk(directoryPath):
+                        for f in files:
+                            #Handling files.
+                            source = os.path.join(root, f)
+                            targetDir = self.resolveTargetDir(project, source)                
+                            filesToProcess.append({"source": source, "targetDir": targetDir})
+                        
+                        for d in dirs:
+                            #Handling directories to get empty folders included also.
+                            source = os.path.join(root, d)
+                            targetDir = self.resolveTargetDir(project, source)
+                            filesToProcess.append({"source": source, "targetDir": targetDir})                            
+                            
+        else:
+            #Need to handle wildcard part
+            filesToProcess = self.getFilesByWildcard(os.path.join(old_structure_root, pathPart)\
+                                                     ,wildCardPart, project)
+                        
+        for f in filesToProcess:
+            source = f["source"]
+            targetDir = f["targetDir"]
+                      
+            if source.lower().find(".svn") != -1:
+            #Ignoring svn files
+                continue
+            
+            if os.path.isfile(source):
+                #targetDir = self.resolveTargetDir(project, f)                    
+                if self.action == "add":
+                    if not os.path.exists(targetDir):
+                        os.makedirs(targetDir)
+                    shutil.copy2(source, targetDir)                    
+                elif self.action == "remove":
+                    targetFile = os.path.join(targetDir, os.path.split(source)[1])
+                    os.remove(targetFile)
+            elif os.path.isdir(source):
+                folderToCreate = os.path.join(targetDir, os.path.split(source)[1])
+                if not os.path.isdir(folderToCreate):
+                    os.makedirs(folderToCreate)
+
+    def resolveTargetDir(self, project, filepath):
+        """
+        """
+        if self.recursive == "false":
+            return os.path.join(project.get_storage().get_path(), self.getProjectPath())
+        else:            
+            retPath = os.path.join(project.get_storage().get_path(), self.getProjectPath())            
+            startFound = 0
+            
+            for item in os.path.normpath(filepath).split("\\"):
+                if self.data.find(item) != -1:
+                    startFound = 1
+                if startFound and self.data.find(item) == -1:
+                    retPath = os.path.join(retPath, item)                
+            return os.path.split(retPath)[0]
+                        
+
+    def handleLayerRoot(self, project):
+        """
+        """
+        
+        pathPart, wildCardPart = self.separatePathAndWildcard(self.data) 
+        filesToProcess = []
+        
+        if wildCardPart == "":
+            #No wildcards found. Checking still if path has folder and file elements
+            
+            folderPath, filePart = os.path.split(pathPart)
+            if folderPath == "":
+                #filename only
+                pathPart = ""
+            else:
+                #file and folder
+                pathPart = folderPath
+            
+            source = os.path.join(project.get_storage().get_path(), self.getProjectPath(), pathPart, filePart)    
+            filesToProcess.append({"source": source, "targetDir": None})
+            
+        else:
+            #Need to handle wildcard part
+            fullSearchPath = os.path.join(project.get_storage().get_path(), self.getProjectPath(), pathPart)
+            filesToProcess = self.getFilesByWildcard(fullSearchPath, wildCardPart, project)
+        
+        #Creating rootfile.        
+        rootFilePath = os.path.join(self.getProjectPath(), self.parent.path)        
+        config = project.create_configuration(utils.resourceref.norm(rootFilePath))
+        
+        #Adding defined includes.
+        for f in filesToProcess:
+            source = f["source"]
+            #Getting path in configuration project and adding it as include.
+            filePath = utils.resourceref.norm(os.path.join(pathPart, os.path.split(source)[1]))
+            config.include_configuration(filePath)
+            if self.remove_includes == "true":
+                self.removeIncludes(config.get_configuration(filePath))                        
+        config.save()
+    
+    def removeIncludes(self, config):
+        """
+        @param config: Configuration object that is processed
+        
+        @return: None
+        """
+
+        #Getting all configurations from included configuration.
+        configList = config.list_configurations()
+        for item in configList:
+            config.remove_configuration(utils.resourceref.norm(item))            
+        
+        config.save()
+        
+
+    def handleConfigurationRoot(self, project):
+        """
+        """        
+        #Always in the root of the project
+        configname = utils.resourceref.norm(self.parent.path)
+        if configname in project.list_configurations():
+            config = project.get_configuration(configname)
+        else:
+            config = project.create_configuration(utils.resourceref.norm(self.parent.path))
+        config.include_configuration(utils.resourceref.norm(self.data))                
+        config.save()
+
+
+    def getProjectPath(self):
+        if isinstance(self.parent, ConvertProjectFile):
+            #print "FILE", self.parent.parent.getProjectPath()
+            return self.parent.parent.getProjectPath() 
+        else:
+            #print "other"
+            return self.parent.getProjectPath()
+        
+
+    def getFilesByWildcard(self, folder, wildcard, project):
+        """
+        @param folder: folder where matching is made
+        @type folder: string
+        @param wildcard: wildcard pattern
+        @type wildcard: string   
+        """
+                
+        #Array of files and folders matching with the wildcard.        
+        retArray = []
+        if os.path.isdir(folder):     
+            for root, dirs, files in os.walk(folder):
+                if self.recursive == "false" and os.path.normpath(root) != os.path.normpath(folder):
+                #No recursive search used and therefore only topmost directory is handled.
+                    continue
+                else:
+                    for f in files:
+                        if fnmatch.fnmatch(os.path.join(root, f), wildcard):
+                            source = os.path.join(root, f)
+                            targetDir = self.resolveTargetDir(project, source)                
+                            retArray.append({"source": source, "targetDir": targetDir})
+
+                    for d in dirs:
+                        if fnmatch.fnmatch(os.path.join(root, d), wildcard):
+                            source = os.path.join(root, d)
+                            targetDir = self.resolveTargetDir(project, source)                
+                            retArray.append({"source": source, "targetDir": targetDir})                            
+                            
+        return retArray
+
+    def separatePathAndWildcard(self, data):
+        """        
+        @param data: data from XML that may contain path and wildcard parts
+        @type data: string
+        
+        @return: Path and wildcard parts separately. 
+        """
+        pathPart = ""
+        wildCardPart = ""
+
+        if data.find("*") == -1:
+        #Only supported wildcard is currently *
+            pathPart = data
+            wildCardPart =""
+        else:
+        #Some wildcards found. Wildcards are supported only in the last segment.
+            pathPart, wildCardPart = os.path.split(data)
+
+        return pathPart, wildCardPart
+
+
+#=================================================================
+    
+class ConvertProjectReader(plugin.ReaderBase):
+    """
+    Parses a single convertprojectml  file
+    """ 
+    
+    NAMESPACE = 'http://www.s60.com/xml/convertprojectml/1'
+    FILE_EXTENSIONS = ['convertprojectml']
+    
+    def __init__(self):
+        self.desc = None
+        self.output_dir = None
+        self.input_dir = None
+        self.namespaces = [self.NAMESPACE]
+        self.project_data = {}
+        self.layers = []
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = ConvertProjectReader()
+        reader.from_etree(etree, configuration.get_storage().get_path())
+        
+        impl = ConvertProjectImpl(resource_ref, configuration)
+        impl.project_data   = reader.project_data
+        impl.layers         = reader.layers
+        return impl
+    
+    def from_etree(self, etree, old_structure_root = ""):
+        self.project_data = self.parse_attributes(etree, "targetProject")        
+        self.layers = self.parse_layers(etree) 
+        for fe in self.parse_foreach(etree, old_structure_root):
+            self.layers.append(fe)
+        
+        #for l in self.layers:
+            #print l
+        return    
+    
+    def parse_foreach(self, etree, old_structure_root):
+        layersTmp = []
+        for fe in etree.findall("{%s}foreach" % self.namespaces[0]):
+            variable = fe.get("variable")
+            data = fe.get("data")
+            folders = [] 
+            for item in os.listdir(os.path.join(old_structure_root, data)):
+                if os.path.isdir(os.path.join(old_structure_root, data, item)) and item != '.svn':
+                    folders.append(item)
+            
+            for folder in folders:
+                mapping_data = {variable: folder}                                             
+                for layer in fe.findall("{%s}layer" % self.namespaces[0]):            
+                    layersTmp.append(self.parse_layer(layer, mapping_data))
+                                
+        return layersTmp
+    
+    def parse_layers(self,etree):
+        layersTmp = []
+        for layer in etree.findall("{%s}layer" % self.namespaces[0]):            
+            layersTmp.append(self.parse_layer(layer))
+            
+        return layersTmp
+    
+    def parse_layer(self, etree, mapping_data=None):        
+        path = self.handleMapping(etree.get("path"), mapping_data)
+        
+        layerObject = ConvertProjectLayer(path)        
+        for folder in etree.findall("{%s}folder" % self.namespaces[0]):
+            layerObject.addFolder(self.parse_folder(folder, layerObject, mapping_data))
+
+        for f in etree.findall("{%s}file" % self.namespaces[0]):
+            layerObject.addFile(self.parse_file(f, layerObject, mapping_data))
+        
+        return layerObject
+    
+    def parse_folder(self, etree, parent, mapping_data=None):        
+        path = self.handleMapping(etree.get("path"), mapping_data)
+        
+        folderObject = ConvertProjectFolder(path, parent)
+        for filter in etree.findall("{%s}filter" % self.namespaces[0]):                        
+            #Remove includes supported only for files.
+            folderObject.addFilter(self.parse_filter(filter, folderObject, mapping_data))                
+        return folderObject
+
+    def parse_file(self, etree, parent, mapping_data=None):
+        path = self.handleMapping(etree.get("path"), mapping_data)
+        type = self.handleMapping(etree.get("type"), mapping_data)
+        
+        fileObject = ConvertProjectFile(path, type, parent)        
+        for filter in etree.findall("{%s}filter" % self.namespaces[0]):
+            fileObject.addFilter(self.parse_filter(filter, fileObject, mapping_data))
+        
+        metaElement = etree.find("{%s}meta" % self.namespaces[0])
+        namespacePattern = re.compile("\{(.*)\}(.*)")
+        metaArray = [] #tag, value, ns, attrs
+        if metaElement:
+            for item in metaElement.getiterator():
+                mo = namespacePattern.search(item.tag)
+                if mo:        
+                    if mo.group(2) != "meta":
+                        tmpArray = []                        
+                        tmpArray.append(mo.group(2))    #Tag name
+                        tmpArray.append(item.text)      #value
+                        tmpArray.append(mo.group(1))    #Namespace
+                        tmpDict = {}
+                        for attribute in item.keys():
+                            tmpDict[attribute] = item.get(attribute)
+                        tmpArray.append(tmpDict)
+                        metaArray.append(tmpArray)
+        
+        descElement = etree.find("{%s}desc" % self.namespaces[0])
+        description = ""
+        if descElement != None:
+            description = descElement.text                
+                         
+        fileObject.addMeta(metaArray)
+        fileObject.addDescription(description)                
+        return fileObject
+
+    def parse_filter(self, etree, parent, mapping_data=None):
+        """
+        """
+        data = self.handleMapping(etree.get("data"), mapping_data)
+        action = self.handleMapping(etree.get("action"), mapping_data)
+        remove_includes = self.handleMapping(etree.get("remove_includes"), mapping_data)
+        recursive = self.handleMapping(etree.get("recursive"), mapping_data)
+        
+        return ConvertProjectFilter(action, data, parent, remove_includes, recursive)
+    
+
+    def parse_rule(self, etree, parent):
+        return {"name": etree.get("name"), "type": etree.get("type"), "data": etree.get("data")}
+
+    def parse_attributes(self, etree, tagName):
+        tmpDict = {}        
+        tmpElement = etree.find("{%s}%s" % (self.namespaces[0], tagName))
+        for attribute in tmpElement.keys():
+            tmpDict[attribute] = tmpElement.get(attribute)
+        return tmpDict
+    
+    def handleMapping(self, data, mapping):
+        """
+        """
+        
+        retStr = data
+        
+        if mapping != None and data != None:                        
+            for key in mapping.keys():
+                retStr = retStr.replace(key, mapping[key])
+        return retStr
+        
+        
+        
+        
+        
+        
+
+
+    
+    
+    
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/create_project.convertprojectml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<convertprojectml xmlns="http://www.s60.com/xml/convertprojectml/1">
+	
+	<targetProject path="/epoc32/rom/config_project" validate="true"/>
+
+	<layer path="platforms/s60">
+		<folder path="confml/components">
+			<filter action="add" data="confml_data/s60/*.confml"/>
+			<filter action="remove" data="confml_data/s60/s60.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/s60/*.crml"/>
+			<filter action="add" data="confml_data/s60/*.gcfml"/>
+			<filter action="add" data="confml_data/s60/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/components/*.confml"/>
+			<filter action="include_file" data="confml/data.confml"/>
+		</file>
+		<file type="configuration_root" path="{CONFIG_ROOT}/s60_root.confml">
+			<filter action="include_layer" data="s60"/>
+		</file>	
+		<file type="none" path="doc/s60_layer_design.doc">
+			<filter action="add" data="/epoc32/docs/s60_layer_design.doc"/>
+		</file>				
+	</layer>		
+	
+	<layer path="ncp53">
+		<folder path="confml">
+			<filter action="add" data="ncp53/5332.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="5332.confml"/>
+		</file>
+		<file type="configuration_root" path="{CONFIG_ROOT}/ncp53_root.confml">
+			<filter action="include_layer" data="s60"/>
+			<filter action="include_layer" data="customsw"/>
+			<filter action="include_layer" data="ncp53"/>
+		</file>
+	</layer>
+
+	<layer path="ncp53/victoria/language/{TEMPLATE}">
+		<rule type="folders" data="variants/language/victoria/*.*"/>		
+		<folder path="confml">
+			<filter action="add" data="variants/language/victoria/{TEMPLATE}/*.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="*.confml"/>
+		</file>
+		<file type="configuration_root" name="{TEMPLATE}_root.confml">
+			<filter action="include_layer" data="s60"/>
+			<filter action="include_layer" data="customsw"/>
+			<filter action="include_layer" data="ncp53"/>
+			<filter action="include_layer" data="{TEMPLATE}"/>
+		</file>
+	</layer>			
+</convertprojectml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0">
+  <property name="cpf.rootFile" />
+</metadata>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/confml/family_x.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+<configuration name="family_x" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <IntSetting>300</IntSetting>
+    <BooleanSetting>false</BooleanSetting>
+    <RealSetting>3.1456</RealSetting>
+    <SelectionSetting>3</SelectionSetting>
+    <StringSetting>Family X</StringSetting>
+    <SequenceSetting extensionPolicy="append">
+        <RealSubSetting>50.1</RealSubSetting>
+      <IntSubSetting>1</IntSubSetting>
+      <StringSubSetting>Test 1</StringSubSetting>
+      <BooleanSubSetting>false</BooleanSubSetting>
+      <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+    <SequenceSetting>
+        <RealSubSetting>50.2</RealSubSetting>
+      <IntSubSetting>2</IntSubSetting>
+      <StringSubSetting>Test 2</StringSubSetting>
+      <BooleanSubSetting>true</BooleanSubSetting>
+      <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/confml/product_x.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<configuration name="product_x" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <IntSetting>500</IntSetting>
+    <BooleanSetting>true</BooleanSetting>
+    <StringSetting>Product X</StringSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Euro/confml/VariantData_product_x_Euro.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="VariantData_product_x_Euro" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <StringSetting>testing</StringSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Euro/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__product_x__language__Euro__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/VariantData_product_x_Euro.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/French/confml/VariantData_product_x_French.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="VariantData_product_x_French" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <StringSetting>fran&#231;ais</StringSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/French/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__product_x__language__French__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/VariantData_product_x_French.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/German/confml/VariantData_product_x_German.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="VariantData_product_x_German" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <StringSetting>deutsch</StringSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/German/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__product_x__language__German__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/VariantData_product_x_German.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Greek/confml/VariantData_product_x_Greek.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="VariantData_product_x_Greek" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <data>
+    <Feature1>
+      <StringSetting>&#949;&#955;&#955;&#951;&#957;&#953;&#954;&#942; &#947;&#955;&#974;&#963;&#963;&#945;</StringSetting>
+    </Feature1>
+  </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/language/Greek/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__product_x__language__Greek__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/VariantData_product_x_Greek.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/product_x/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__product_x__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/product_x.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="family_x__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/family_x.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test/implml/create_project.convertprojectml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<convertprojectml xmlns="http://www.s60.com/xml/convertprojectml/1">
+	
+	<!-- Using empty target project tag so that output goes to generation output dir -->
+	<targetProject/>
+
+	<!-- =============== -->
+	<!-- Platform layers -->
+	<!-- =============== -->
+	<layer path="platforms/platform1">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform1/*.confml"/>
+			<filter action="remove" data="confml_data/platform1/platform1.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform1/*.crml"/>
+			<filter action="add" data="confml_data/platform1/*.gcfml"/>
+			<filter action="add" data="confml_data/platform1/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform1_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+				<cv:configuration-property name="platform_name" value="plat1"/>
+				<version>Version1</version>
+				<platform>Platform1</platform>
+				<date>Date1</date>
+				<release>Release1</release>
+				<editor>Editor1</editor>
+			</meta>
+			<desc>Description1</desc>
+		</file>
+		<!-- What is this? -->
+		<file type="none" path="doc/s60_layer_design.doc">
+			<filter action="add" data="/epoc32/docs/s60_layer_design.doc"/>
+		</file>				
+	</layer>
+	
+	<layer path="platforms/platform2">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform2/*.confml"/>
+			<filter action="remove" data="confml_data/platform2/platform2.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform2/*.crml"/>
+			<filter action="add" data="confml_data/platform2/*.gcfml"/>
+			<filter action="add" data="confml_data/platform2/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform2_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+		</file>
+	</layer>
+	
+	<!-- ============ -->
+	<!-- Family layer -->
+	<!-- ============ -->
+	
+	<layer path="family_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/family_x.confml"/>
+		</folder>
+		<folder path="test">
+			<filter action="add" data="convertpluginlayer" recursive="true"/>
+		</folder>
+		<folder path="test2">
+			<filter action="add" data="family_x/*.iby" recursive="true"/>
+		</folder>
+		<folder path="test3">
+			<filter action="add" data="convertpluginlayer/*" recursive="true"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/family_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="family_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ============= -->
+	<!-- Product layer -->
+	<!-- ============= -->
+	
+	<layer path="family_x/product_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/product_x/product_x.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/product_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="product_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+			<filter action="include_layer" data="family_x/product_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ================================= -->
+	<!-- Product X language variant layers -->
+	<!-- ================================= -->
+
+	<foreach variable="{TEMPLATE}" data="variants/language/product_x">
+		<layer path="family_x/product_x/language/{TEMPLATE}">
+			<folder path="confml">
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			<folder>
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.*"/>
+				<filter action="remove" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			
+			<file type="layer_root" path="root.confml">
+				<filter action="include_file" data="confml/*.confml" remove_includes="true"/>
+			</file>
+			<file type="configuration_root" path="product_x_{TEMPLATE}_root.confml">
+				<filter action="include_layer" data="platforms/platform1/root.confml"/>
+				<filter action="include_layer" data="platforms/platform2/root.confml"/>
+				<filter action="include_layer" data="family_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/language/{TEMPLATE}/root.confml"/>
+			</file>
+		</layer>
+	</foreach>
+</convertprojectml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test2/dummy.iby	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test3/implml/create_project.convertprojectml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<convertprojectml xmlns="http://www.s60.com/xml/convertprojectml/1">
+	
+	<!-- Using empty target project tag so that output goes to generation output dir -->
+	<targetProject/>
+
+	<!-- =============== -->
+	<!-- Platform layers -->
+	<!-- =============== -->
+	<layer path="platforms/platform1">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform1/*.confml"/>
+			<filter action="remove" data="confml_data/platform1/platform1.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform1/*.crml"/>
+			<filter action="add" data="confml_data/platform1/*.gcfml"/>
+			<filter action="add" data="confml_data/platform1/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform1_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+				<cv:configuration-property name="platform_name" value="plat1"/>
+				<version>Version1</version>
+				<platform>Platform1</platform>
+				<date>Date1</date>
+				<release>Release1</release>
+				<editor>Editor1</editor>
+			</meta>
+			<desc>Description1</desc>
+		</file>
+		<!-- What is this? -->
+		<file type="none" path="doc/s60_layer_design.doc">
+			<filter action="add" data="/epoc32/docs/s60_layer_design.doc"/>
+		</file>				
+	</layer>
+	
+	<layer path="platforms/platform2">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform2/*.confml"/>
+			<filter action="remove" data="confml_data/platform2/platform2.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform2/*.crml"/>
+			<filter action="add" data="confml_data/platform2/*.gcfml"/>
+			<filter action="add" data="confml_data/platform2/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform2_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+		</file>
+	</layer>
+	
+	<!-- ============ -->
+	<!-- Family layer -->
+	<!-- ============ -->
+	
+	<layer path="family_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/family_x.confml"/>
+		</folder>
+		<folder path="test">
+			<filter action="add" data="convertpluginlayer" recursive="true"/>
+		</folder>
+		<folder path="test2">
+			<filter action="add" data="family_x/*.iby" recursive="true"/>
+		</folder>
+		<folder path="test3">
+			<filter action="add" data="convertpluginlayer/*" recursive="true"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/family_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="family_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ============= -->
+	<!-- Product layer -->
+	<!-- ============= -->
+	
+	<layer path="family_x/product_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/product_x/product_x.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/product_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="product_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+			<filter action="include_layer" data="family_x/product_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ================================= -->
+	<!-- Product X language variant layers -->
+	<!-- ================================= -->
+
+	<foreach variable="{TEMPLATE}" data="variants/language/product_x">
+		<layer path="family_x/product_x/language/{TEMPLATE}">
+			<folder path="confml">
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			<folder>
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.*"/>
+				<filter action="remove" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			
+			<file type="layer_root" path="root.confml">
+				<filter action="include_file" data="confml/*.confml" remove_includes="true"/>
+			</file>
+			<file type="configuration_root" path="product_x_{TEMPLATE}_root.confml">
+				<filter action="include_layer" data="platforms/platform1/root.confml"/>
+				<filter action="include_layer" data="platforms/platform2/root.confml"/>
+				<filter action="include_layer" data="family_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/language/{TEMPLATE}/root.confml"/>
+			</file>
+		</layer>
+	</foreach>
+</convertprojectml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x/test3/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/family_x_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<configuration name="family_x_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platform1_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<configuration name="platform1_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+    <cv:configuration-property name="platform_name" value="plat1" />
+  <version>Version1</version>
+  <platform>Platform1</platform>
+  <date>Date1</date>
+  <release>Release1</release>
+  <editor>Editor1</editor>
+  </meta>
+<desc>Description1</desc>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platform2_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<configuration name="platform2_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/confml/bitmask_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Bitmask test" version="1">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+    </BitmaskTest>
+  </data>
+  
+  <rfs>
+    <BitmaskTest>
+      <Bit0>false</Bit0>
+      <Bit1>true</Bit1>
+      <Bit2>false</Bit2>
+      <Bit3>true</Bit3>
+      <Bit4>false</Bit4>
+      <Bit5>true</Bit5>
+    </BitmaskTest>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/bitmask_test_12341002.crml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_12341000.crml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_12341001.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/implml/feature1_sequence.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="sequence_setting_test.txt" target="data\">
+	<setting ref="Feature1/SequenceSetting"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-16"/>
+		<xsl:template match="configuration/data">
+			<xsl:for-each select="Feature1/SequenceSetting">
+				<xsl:value-of select="FolderSubSetting"/>,<xsl:value-of select="RealSubSetting"/>,<xsl:value-of select="FileSubSetting"/>,<xsl:value-of select="IntSubSetting"/>,<xsl:value-of select="StringSubSetting"/>,<xsl:value-of select="BooleanSubSetting"/>,<xsl:value-of select="SelectionSubSetting"/><xsl:text>&#xA;</xsl:text>
+			</xsl:for-each>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<configuration name="platforms__platform1__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/bitmask_test.confml" />
+<xi:include href="confml/feature1.confml" />
+</configuration>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/confml/feature2.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/implml/feature2_ABCD0000.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/platforms/platform2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<configuration name="platforms__platform2__root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="confml/feature2.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_Euro_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="product_x_Euro_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+<xi:include href="family_x/product_x/root.confml" />
+<xi:include href="family_x/product_x/language/Euro/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_French_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="product_x_French_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+<xi:include href="family_x/product_x/root.confml" />
+<xi:include href="family_x/product_x/language/French/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_German_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="product_x_German_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+<xi:include href="family_x/product_x/root.confml" />
+<xi:include href="family_x/product_x/language/German/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_Greek_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<configuration name="product_x_Greek_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+<xi:include href="family_x/product_x/root.confml" />
+<xi:include href="family_x/product_x/language/Greek/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/expected/new_project/product_x_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<configuration name="product_x_root_confml" xmlns="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:xs="http://www.w3.org/2001/XMLSchema">
+  <xi:include href="platforms/platform1/root.confml" />
+<xi:include href="platforms/platform2/root.confml" />
+<xi:include href="family_x/root.confml" />
+<xi:include href="family_x/product_x/root.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/bitmask_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Bitmask test" version="1">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+    </BitmaskTest>
+  </data>
+  
+  <rfs>
+    <BitmaskTest>
+      <Bit0>false</Bit0>
+      <Bit1>true</Bit1>
+      <Bit2>false</Bit2>
+      <Bit3>true</Bit3>
+      <Bit4>false</Bit4>
+      <Bit5>true</Bit5>
+    </BitmaskTest>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/bitmask_test_12341002.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_12341000.crml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_12341001.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/feature1_sequence.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="sequence_setting_test.txt" target="data\">
+	<setting ref="Feature1/SequenceSetting"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-16"/>
+		<xsl:template match="configuration/data">
+			<xsl:for-each select="Feature1/SequenceSetting">
+				<xsl:value-of select="FolderSubSetting"/>,<xsl:value-of select="RealSubSetting"/>,<xsl:value-of select="FileSubSetting"/>,<xsl:value-of select="IntSubSetting"/>,<xsl:value-of select="StringSubSetting"/>,<xsl:value-of select="BooleanSubSetting"/>,<xsl:value-of select="SelectionSubSetting"/><xsl:text>&#xA;</xsl:text>
+			</xsl:for-each>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform1/platform1.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/feature2.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/feature2_ABCD0000.crml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/confml_data/platform2/platform2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convert.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+	<xi:include href="convertpluginlayer/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convertpluginlayer/implml/create_project.convertprojectml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,136 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<convertprojectml xmlns="http://www.s60.com/xml/convertprojectml/1">
+	
+	<!-- Using empty target project tag so that output goes to generation output dir -->
+	<targetProject/>
+
+	<!-- =============== -->
+	<!-- Platform layers -->
+	<!-- =============== -->
+	<layer path="platforms/platform1">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform1/*.confml"/>
+			<filter action="remove" data="confml_data/platform1/platform1.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform1/*.crml"/>
+			<filter action="add" data="confml_data/platform1/*.gcfml"/>
+			<filter action="add" data="confml_data/platform1/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform1_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<meta xmlns:cv="http://www.nokia.com/xml/cpf-id/1">
+				<cv:configuration-property name="platform_name" value="plat1"/>
+				<version>Version1</version>
+				<platform>Platform1</platform>
+				<date>Date1</date>
+				<release>Release1</release>
+				<editor>Editor1</editor>
+			</meta>
+			<desc>Description1</desc>
+		</file>
+		<!-- What is this? -->
+		<file type="none" path="doc/s60_layer_design.doc">
+			<filter action="add" data="/epoc32/docs/s60_layer_design.doc"/>
+		</file>				
+	</layer>
+	
+	<layer path="platforms/platform2">
+		<folder path="confml">
+			<filter action="add" data="confml_data/platform2/*.confml"/>
+			<filter action="remove" data="confml_data/platform2/platform2.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/platform2/*.crml"/>
+			<filter action="add" data="confml_data/platform2/*.gcfml"/>
+			<filter action="add" data="confml_data/platform2/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/*.confml"/>
+		</file>
+		<file type="configuration_root" path="platform2_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+		</file>
+	</layer>
+	
+	<!-- ============ -->
+	<!-- Family layer -->
+	<!-- ============ -->
+	
+	<layer path="family_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/family_x.confml"/>
+		</folder>
+		<folder path="test">
+			<filter action="add" data="convertpluginlayer" recursive="true"/>
+		</folder>
+		<folder path="test2">
+			<filter action="add" data="family_x/*.iby" recursive="true"/>
+		</folder>
+		<folder path="test3">
+			<filter action="add" data="convertpluginlayer/*" recursive="true"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/family_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="family_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ============= -->
+	<!-- Product layer -->
+	<!-- ============= -->
+	
+	<layer path="family_x/product_x">
+		<folder path="confml">
+			<filter action="add" data="family_x/product_x/product_x.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/product_x.confml" remove_includes="true"/>
+		</file>
+		<file type="configuration_root" path="product_x_root.confml">
+			<filter action="include_layer" data="platforms/platform1/root.confml"/>
+			<filter action="include_layer" data="platforms/platform2/root.confml"/>
+			<filter action="include_layer" data="family_x/root.confml"/>
+			<filter action="include_layer" data="family_x/product_x/root.confml"/>
+		</file>
+	</layer>
+	
+	
+	<!-- ================================= -->
+	<!-- Product X language variant layers -->
+	<!-- ================================= -->
+
+	<foreach variable="{TEMPLATE}" data="variants/language/product_x">
+		<layer path="family_x/product_x/language/{TEMPLATE}">
+			<folder path="confml">
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			<folder>
+				<filter action="add" data="variants/language/product_x/{TEMPLATE}/*.*"/>
+				<filter action="remove" data="variants/language/product_x/{TEMPLATE}/*.confml"/>
+			</folder>
+			
+			<file type="layer_root" path="root.confml">
+				<filter action="include_file" data="confml/*.confml" remove_includes="true"/>
+			</file>
+			<file type="configuration_root" path="product_x_{TEMPLATE}_root.confml">
+				<filter action="include_layer" data="platforms/platform1/root.confml"/>
+				<filter action="include_layer" data="platforms/platform2/root.confml"/>
+				<filter action="include_layer" data="family_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/root.confml"/>
+				<filter action="include_layer" data="family_x/product_x/language/{TEMPLATE}/root.confml"/>
+			</file>
+		</layer>
+	</foreach>
+</convertprojectml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/convertpluginlayer/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.hrh	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/dummy.iby	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). 
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/family_x.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/image_conf_family_x.mk	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/family_x/product_x/product_x.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/Euro/VariantData_product_x_Euro.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/French/VariantData_product_x_French.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/German/VariantData_product_x_German.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/old_structure/epoc32/rom/config/variants/language/product_x/Greek/VariantData_product_x_Greek.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/assets/s60/implml/file1.convertprojectml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<convertprojectml xmlns="http://www.s60.com/xml/convertprojectml/1">
+	
+	<targetProject path="/epoc32/rom" name="config_project"/>
+
+	<layer path="platforms/s60">
+		<folder path="confml/components">
+			<filter action="add" data="confml_data/s60/*.confml"/>
+			<filter action="remove" data="confml_data/s60/s60.confml"/>
+		</folder>
+		<folder path="implml">
+			<filter action="add" data="confml_data/s60/*.crml"/>
+			<filter action="add" data="confml_data/s60/*.gcfml"/>
+			<filter action="add" data="confml_data/s60/*.ibyml"/>
+		</folder>
+
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="confml/components/*.confml"/>
+			<filter action="include_file" data="confml/data.confml"/>
+		</file>
+		<file type="configuration_root" path="{CONFIG_ROOT}/s60_root.confml">
+			<filter action="include_layer" data="s60"/>
+		</file>	
+		<file type="none" path="doc/s60_layer_design.doc">
+			<filter action="add" data="/epoc32/docs/s60_layer_design.doc"/>
+		</file>				
+	</layer>		
+	
+	<layer path="ncp53">
+		<folder path="confml">
+			<filter action="add" data="ncp53/5332.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="5332.confml"/>
+		</file>
+		<file type="configuration_root" path="{CONFIG_ROOT}/ncp53_root.confml">
+			<filter action="include_layer" data="s60"/>
+			<filter action="include_layer" data="customsw"/>
+			<filter action="include_layer" data="ncp53"/>
+		</file>
+	</layer>
+
+	<layer path="ncp53/victoria/language/{TEMPLATE}">
+		<rule type="folders" data="variants/language/victoria/*.*"/>		
+		<folder path="confml">
+			<filter action="add" data="variants/language/victoria/{TEMPLATE}/*.confml"/>
+		</folder>
+		<file type="layer_root" path="root.confml">
+			<filter action="include_file" data="*.confml"/>
+		</file>
+		<file type="configuration_root" name="{TEMPLATE}_root.confml">
+			<filter action="include_layer" data="s60"/>
+			<filter action="include_layer" data="customsw"/>
+			<filter action="include_layer" data="ncp53"/>
+			<filter action="include_layer" data="{TEMPLATE}"/>
+		</file>
+	</layer>			
+</convertprojectml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/assets/s60/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" version="1">
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="data" version="1">
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/product/root.confml has changed
Binary file configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/family/root.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/project/product.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" name="product" version="1">
+  <xi:include href="assets/s60/root.confml#/"/>
+  <xi:include href="family/root.confml#/"/>
+  <xi:include href="family/product/root.confml#/"/>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/projectconvertplugin/tests/unittest_convertprojectml_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__	
+from projectconvertplugin  import convertproject
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from testautomation.base_testcase import BaseTestCase
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+temp_dir  = os.path.join(ROOT_PATH, "temp")
+testdata  = os.path.join(ROOT_PATH,'project')
+
+class TestConvertProjectPlugin(BaseTestCase):    
+        
+    def test_example_parse_prj(self):
+        output_dir = os.path.join(temp_dir, "new_project2")
+        if os.path.exists(output_dir):
+            shutil.rmtree(output_dir)
+            
+        fs = filestorage.FileStorage(testdata)
+        p = api.Project(fs)
+        config = p.get_configuration('product.confml')
+        impls = plugin.get_impl_set(config, r'file1\.convertprojectml$')
+        self.assertEquals(1, len(impls))
+        impl = iter(impls).next()
+        self.assertTrue(isinstance(impl, convertproject.ConvertProjectImpl))
+        
+    def test_generate(self):
+        output_dir = os.path.join(temp_dir, "new_project")
+        if os.path.exists(output_dir):
+            shutil.rmtree(output_dir)
+        expected_dir = os.path.join(ROOT_PATH, "expected/new_project")
+        oldPath = os.path.join(ROOT_PATH,'old_structure/epoc32/rom/config')
+         
+        fs = filestorage.FileStorage(oldPath)
+        p = api.Project(fs)
+        config = p.get_configuration('convert.confml')
+        impls = plugin.get_impl_set(config,'\.convertprojectml$')
+        impls.output = output_dir
+        impls.generate()
+        
+        self.assert_dir_contents_equal(expected_dir, output_dir, ['.svn'])
+
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeProjectConverterPlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from projectconvertplugin import __version__
+
+setup(
+    name = "projectconvertplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+    test_suite = "projectconvertplugin.tests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine Project converter plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware", 
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['convertprojectml = projectconvertplugin.convertproject:ConvertProjectReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from setuptools import setup, find_packages
+from themeplugin import __version__
+
+setup(
+    name = "conethemeplugin",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests"]),
+
+    # metadata for upload to PyPI
+    author = "",
+    author_email = "",
+    description = "Configuration Engine makefile generation plugin",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware", 
+    zip_safe = True,
+    
+    # entrypoint info
+    entry_points={'cone.plugins.implmlreaders': ['thememl = themeplugin.maketheme:ThemeImplReader']}
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+__version__ = 0.1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/maketheme.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,298 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import re
+import os
+import sys
+import logging
+import xml.parsers.expat
+import unzip
+import shutil
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+
+from cone.public import exceptions,plugin,utils,api
+from themeplugin import theme_function
+from theme_resource import ThemeResource
+from theme_container import ThemeContainer, ActiveTheme
+
+class ThemeImpl(plugin.ImplBase):
+    """
+    This class provides converting *.tpf files to target device
+    
+    
+    Building process:
+    1. All tpf files are founded in the cpf file according to "preinstalled directories" 
+       and "CVC settings" which are defined in the thememl file.
+       
+    2. The tpf files are extracted to temporary directories. Every tpf file has self temporary directory
+    
+    3. *.tdf, *.svg files are builded to *.mbm, *.skn,... by using Carbide.UI command-line.
+       The path of Carbide.UI is defined in the thememl file.
+       
+       Here is two possible cases:
+         3a) The theme has defined UID number in thememl file.
+             The Carbide.UI is run with parameter -uid %number%.
+             Then this UID number (after converting to decimal format) is saved to
+             platform setting in the step 5
+    
+          3b) The theme has not defined UID number
+              The Carbide.UI is run without parameter -uid %number% and then
+              the PID number is getted from *.pkg file and setted to platform setting in the decimal format
+              in the step 5
+
+    4. *.mbm, *.skn,... are copied to output directory according to content of the pkg file. 
+       The *.pkg file contains the record where the *.mbm, *.skn,... are be copied.
+       Sample: "themepackage.mbm" - "private\10207114\import\99d49b086e6097b8\themepackage.mbm"
+
+    5. UID or PID number are saved to platform setting which is defined in the thememl file
+    6. Temporary directories are removed
+    """
+
+    
+    IMPL_TYPE_ID = "thememl"
+    DEFAULT_INVOCATION_PHASE = 'pre'
+    
+    
+    def __init__(self,ref,configuration):
+        """
+        Overloading the default constructor
+        """
+        plugin.ImplBase.__init__(self,ref,configuration)
+        self.logger = logging.getLogger('cone.thememl')
+        
+    def build(self):
+        """
+        Building process of themes
+        """
+        # Get absolute path so that copying works correctly
+        # despite working directory changing
+        abs_output = os.path.abspath(os.path.join(self.output, "content"))
+        
+        # get *.tpf files from the configuration
+        list_tpf = self.list_tpf_files(self.list_active_theme, self.list_theme_dir)
+        
+        theme_container = ThemeContainer(list_tpf,self.configuration)
+        theme_container.carbide = self.carbide
+        theme_container.create_themes()
+        theme_container.prepare_active_themes(self.list_active_theme)
+        theme_container.build_theme(self.theme_version)
+        theme_container.copy_resources_to_output(abs_output)
+        theme_container.set_active_PID_to_model()
+        theme_container.removeTempDirs()
+        
+      
+
+    def list_tpf_files(self,list_active_theme, list_theme_dir):
+        """
+        returns the list of tpf files which are in the configuration
+        """
+        list_tpf=[]
+        default_view = self.configuration.get_default_view()
+        
+        for active_theme in list_active_theme:
+            path=active_theme.get_setting_ref().replace("/",".")
+            feature = default_view.get_feature(path+".localPath")
+            setting = feature.get_data()
+            if setting != None:
+                list_tpf.append(setting.get_value())    
+        
+        for theme_dir in list_theme_dir:
+            theme_dir=theme_dir.replace("/",".")
+            feature = default_view.get_feature(theme_dir+".localPath")
+            setting = feature.get_data()
+            if setting != None:
+                list_tpf.append(setting.get_value())
+           
+
+        return self.find_tpf_files(list_tpf) 
+
+    
+    def find_tpf_files(self, list_tpf_path):
+        """
+        finds *.tpf files in the data container
+        """
+        list_tpf={}
+        
+        datacontainer = self.configuration.layered_content()
+        contentfiles = datacontainer.flatten()
+        for reskey in contentfiles.keys():
+            respath = contentfiles[reskey]
+            
+            if  respath.endswith(".tpf"):
+                # Strip file name from the resource path
+                respath_basename = os.path.split(respath)[0]
+                
+                for tpf_path in list_tpf_path:
+                    # os.path.split() strips trailing slash, so do that here too
+
+                    tpf_path = "/content/" + tpf_path 
+                    if tpf_path.endswith(".tpf"):
+                        if respath.endswith(tpf_path):
+                            list_tpf[respath]=0
+                            break
+                    
+                    if tpf_path.endswith('/'):
+                        tpf_path = tpf_path.rstrip('/')
+                    if respath_basename.endswith(tpf_path):
+                        list_tpf[respath]=0
+                        break
+
+                        
+                        
+                        
+                    
+        return list_tpf.keys()    
+               
+
+    def generate(self, context=None):
+        """
+        Generate the given implementation.
+        """
+        self.parse_impl()
+        self.build()
+        
+        return 
+    
+    def generate_layers(self,layers):
+        """
+        Generate the given Configuration layers.
+        """
+        self.logger.info('Generating layers %s' % layers)
+        self.create_output(layers)
+        return 
+    
+    def has_ref(self,ref):
+        """
+        @returns True if the implementation uses the given ref as input value.
+        Otherwise return False.
+        """
+        return None
+
+    def parse_impl(self):
+        if self.configuration:
+            resource =self.configuration.get_resource(self.ref)
+            reader = ThemeImplReader()
+            try:
+                self.logger.info('Parses %s' % self.ref)
+                reader.fromstring(resource.read())
+                self.carbide = reader.carbide
+            except (SyntaxError),e:
+                logging.getLogger('cone.thememl(%s)' % resource.get_path()).error('Invalid xml in layer root file. Exception: %s' % (e))
+                raise exceptions.ParseError('Invalid xml in layer root file (%s). Exception: %s' % (resource.get_path(),e))
+            self.list_theme_dir=reader.list_theme_dir
+            self.list_active_theme=reader.list_active_theme
+            self.theme_version = reader.theme_version
+            resource.close()
+
+        return 
+    
+    def list_output_files(self):
+        """
+        Return a list of output files as an array. 
+        """
+        # What to return if the output files cannot be known in advance?
+        return []
+    
+
+class ThemeImplReader(plugin.ReaderBase):
+    """
+    Parses a single thememl file
+    """ 
+    NAMESPACE = 'http://www.s60.com/xml/thememl/1'
+    FILE_EXTENSIONS = ['thememl']
+    
+    def __init__(self):
+        self.namespaces = [self.NAMESPACE]
+        self.list_theme_dir = []
+        self.list_active_theme = []
+        self.theme_version = ""
+        self.logger = logging.getLogger('cone.thememl')
+        self.carbide = r"C:\Program Files\Nokia\Carbide.ui Theme Edition 3.4"
+    
+    @classmethod
+    def read_impl(cls, resource_ref, configuration, etree):
+        reader = ThemeImplReader()
+        reader.parse_thememl(etree)
+        
+        impl = ThemeImpl(resource_ref, configuration)
+        impl.list_theme_dir     = reader.list_theme_dir
+        impl.list_active_theme  = reader.list_active_theme
+        impl.theme_version      = reader.theme_version
+        return impl
+    
+    def fromstring(self, xml_as_string):
+        etree = ElementTree.fromstring(xml_as_string)
+        self.parse_thememl(etree)
+         
+    def parse_thememl(self,etree):
+        
+        list_setting_uid={}
+        
+        #parses the version of the theme
+        el_theme_version= etree.find("{%s}themeVersion" % self.namespaces[0])
+        if el_theme_version != None:
+            self.theme_version = el_theme_version.text
+
+        car= etree.find("{%s}carbideuiPath" % self.namespaces[0])
+        envpattern = ".*(%(.*)%).*"
+        if car != None:
+            mo = re.match(envpattern, car.text)
+            if mo:
+                if os.environ.has_key(mo.group(2)):
+                    self.carbide = car.text.replace(mo.group(1), os.environ[mo.group(2)])
+                else:
+                    self.carbide = car.text 
+            else:
+                self.carbide = car.text
+
+        
+        #parses the path of directories where are tpf files
+        el_list_theme_dir = etree.findall("{%s}themeDir" % self.namespaces[0])
+        for el_theme_dir in el_list_theme_dir:
+            if el_theme_dir != None:
+                self.list_theme_dir.append(el_theme_dir.text)
+            
+        #parses the active themes and theirs ref setting and platform settings
+        el_list_active_theme = etree.findall("{%s}activeTheme" % self.namespaces[0])
+        for el_active_theme in el_list_active_theme:
+            uid = el_active_theme.get("uid")
+            active_theme = ActiveTheme()
+            
+            active_theme.set_uid(uid)
+            for el_ref_setting in  el_active_theme.getiterator("{%s}refSetting" % self.namespaces[0]):
+                active_theme.set_setting_ref(el_ref_setting.text)
+            
+            
+            for el_setting_uid in el_active_theme.getiterator("{%s}platformUID" % self.namespaces[0]): 
+                setting_uid = el_setting_uid.text
+                if list_setting_uid.has_key(setting_uid):
+                    raise exceptions.ParseError('The file contains duplicate setting uid: %s' % setting_uid)
+                else:
+                    list_setting_uid[setting_uid]=0
+                    active_theme.set_setting_uids(setting_uid)
+            
+            self.list_active_theme.append(active_theme)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+import sys, os, unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# Import common plug-in initialization
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../../..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+plugin_utils.plugin_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/.metadata	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="ASCII"?>
+<metadata xmlns="http://www.nokia.com/xml/ns/confml-core/metadata-2.0" />
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>E75_v053</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.tools.variant.confml.core.ConfMLLayerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.tools.variant.confml.core.ConfMLLayerNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_2DigitDialing.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="2 Digit Dialing" ref="CVC_2DigitDialing">
+		<confml:desc>2 Digit Dialing.</confml:desc>
+		<confml:setting name="2 Digit Dialing" ref="CVC_2DigitDialing" type="boolean">
+			<confml:desc>2 Dialing. Default is disabled</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	<CVC_2DigitDialing>
+	<CVC_2DigitDialing>false</CVC_2DigitDialing>
+	</CVC_2DigitDialing>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ActiveIdleNotifiers.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Homescreen Notification components" ref="CVC_ActiveIdleNotifiers">
+      <confml:desc>Notification components: missed calls, new messages (device inbox), and new voice messages are located on one row of the device. It is possible to configure the notifiers on/off separately. If a notification component is turned off, the notifications are shown as traditional pop-up notifications.</confml:desc>  
+  <confml:setting name="E-mail notification" ref="CVC_ActiveIdleNotifiersEmail" type="boolean">
+      <confml:desc>Up to two different e-mail accounts for each mode can be configured to be visible on the Home screen. It is not possible to customize e-mail notifiers as they are only available when the e-mail account is first activated.</confml:desc>
+    </confml:setting>
+  <confml:setting name="Calendar and To-do notification" ref="CVC_ActiveIdleNotifiersCalendar" type="boolean">
+      <confml:desc>Calendar and To-do components provide dynamically updated information from Calendar entries and ToDo notes. If there is no data to show, "No calendar events for today" note is visible on the Home screen view.</confml:desc>
+    </confml:setting>
+ <confml:setting name="Music Player notification" ref="CVC_ActiveIdleNotifiersMusicPlayer" type="boolean">
+     <confml:desc>The Music Player component shows the music tracks that are being played by the Music Player. If there is no data to show, this UI area is empty.</confml:desc>
+   </confml:setting>
+ <confml:setting name="Visual Radio notification" ref="CVC_ActiveIdleNotifiersVisualRadio" type="boolean">
+     <confml:desc>The Visual radio plug-in shows the name or frequency of the radio channel that is being played by Visual radio in the background. The icon also shows whether Visual radio service is available for the current channel.</confml:desc>
+   </confml:setting>
+    <confml:setting name="WLAN notification" ref="CVC_ActiveIdleNotifiersWLAN" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="E-mail settings wizard" ref="CVC_ActiveIdleNotifiersEmailSettingsWizard" type="boolean">
+     <confml:desc>This component shows dynamically updated information about available WLAN networks and shortcut to WLAN wizard that enables selecting WLAN network and defining access point for it. If scanning is set to off, there is 'WLAN scanning off' in Home screen view.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Internet Сall setup" ref="CVC_ActiveIdleNotifiersInternetCallSetup" type="boolean">
+     <confml:desc>This plug-in provides easy access to Voice over IP settings wizard, providing options to launch Voice over IP setup wizard or hide the plug-in from the Home screen.</confml:desc>
+   </confml:setting>
+    <confml:setting name="Mobile search" ref="CVC_ActiveIdleNotifiersMobileSearch" type="boolean">
+     <confml:desc>The Mobile search plug-in allows the user to initiate a search for content in the device or in the Internet directly from Home screen. User can click on the plug-in and write the search term.</confml:desc>
+   </confml:setting>
+    <confml:setting name="SIM Application Toolkit" ref="CVC_ActiveIdleNotifiersSIMApplicationToolkit" type="boolean">
+     <confml:desc>The SIM Application Toolkit shows messages from an application residing on the SIM card.</confml:desc>
+   </confml:setting>
+</confml:feature>
+<confml:data>
+<confml:CVC_ActiveIdleNotifiers>
+<confml:CVC_ActiveIdleNotifiersEmail>true</confml:CVC_ActiveIdleNotifiersEmail>
+<confml:CVC_ActiveIdleNotifiersCalendar>true</confml:CVC_ActiveIdleNotifiersCalendar>
+<confml:CVC_ActiveIdleNotifiersMusicPlayer>true</confml:CVC_ActiveIdleNotifiersMusicPlayer>
+<confml:CVC_ActiveIdleNotifiersVisualRadio>true</confml:CVC_ActiveIdleNotifiersVisualRadio>
+<confml:CVC_ActiveIdleNotifiersWLAN>true</confml:CVC_ActiveIdleNotifiersWLAN>
+<confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>true</confml:CVC_ActiveIdleNotifiersEmailSettingsWizard>
+<confml:CVC_ActiveIdleNotifiersInternetCallSetup>true</confml:CVC_ActiveIdleNotifiersInternetCallSetup>
+<confml:CVC_ActiveIdleNotifiersMobileSearch>true</confml:CVC_ActiveIdleNotifiersMobileSearch>
+<confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>true</confml:CVC_ActiveIdleNotifiersSIMApplicationToolkit>
+</confml:CVC_ActiveIdleNotifiers>
+</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ActiveIdleOther.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Miscelaneous Homescreen settings" ref="CVC_ActiveIdleOther">
+  <confml:setting name="Homescreen Idle Easy Dialing" ref="CVC_ActiveIdleEasyDialing" type="boolean">
+      <confml:desc>Easy Dialing allows user to start dialling from Home Screen to a contact without first starting Phonebook application. The name input is predictive (subject to restrictions by input language), and the contacts are matched so that each character only requires one key press. Typing more narrows down the options. User is able to use the number that was just typed, or select one of the name matches.</confml:desc>
+    </confml:setting>
+    
+    
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_AppShell323.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+  <feature name="Application Menu Customization for S60 3.2.3" ref="CVC_AppShell323">
+    <desc>Application Shell customization.</desc>
+    <setting name="Application Menu data location" ref="CVC_AppShell323" type="folder">
+      <desc>Folder containing Application Shell configuration files: appshelldata.xml, appshelldata.dtd, appshellapplications.properties</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+<data>
+<CVC_AppShell323>
+<CVC_AppShell323><localPath>UI/Application Menu</localPath></CVC_AppShell323>
+</CVC_AppShell323>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_BluetoothDiscoverability.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="Default Bluetooth Discoverability" ref="CVC_BluetoothDiscoverability">
+		<confml:desc>Default state of Bluetooth in the terminal: discoverable ("Shown To All") or hidden.</confml:desc>
+		<confml:setting name="Bluetooth in Discoverable mode" ref="CVC_BluetoothDiscoverable" type="boolean">
+			<confml:desc>Default state of Bluetooth in the terminal: discoverable ("Shown To All") or hidden.</confml:desc>
+			</confml:setting>
+</confml:feature>
+	<confml:data>
+<CVC_BluetoothDiscoverability>false</CVC_BluetoothDiscoverability>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CPHSALS.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="CPHS/ALS settings" ref="CVC_CPHSALS">
+		<confml:desc>CPHS is an extension to the GSM specification that adds several convenience and usability enhancements to the way GSM phones and SIM cards operate. Examples of CPHS enhancements include single-key access to a standard voicemail number stored on the SIM, and a message-waiting indicator to alert users to new voicemail messages. CPHS also provides carriers with greater control and flexibility over the carrier name that is displayed on the phone. CPHS also includes the ability to control certain network-based features from the phone interface, including call forwarding, call waiting, and caller-ID. CPHS is not an official part of the GSM specification. It was developed by the PCN Association rather than the GSM Association. Nonetheless, CPHS has been popular among carriers. Many European and American GSM carriers require it, and so newer GSM phones from most major manufacturers include CPHS functionality.</confml:desc>
+		<confml:setting name="CPHS / ALS mode" ref="CVC_CPHSALS" type="selection">
+			<confml:desc>If ALS is set as ON, the functionality of toggling from General to Silent profile by long press # key will be disabled. CPHS and ALS can be set ON and OFF in the customer variants of the standard transceiver. CPHS and ALS can never be both set ON at the same time.</confml:desc>
+      <confml:option name="Both OFF" value="off"/>
+      <confml:option name="CPHS" value="cphs"/>
+      <confml:option name="ALS" value="als"/>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CellInfoDisplay.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+<feature name="Cell Info Display" ref="CVC_CellInfoDisplay">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception)</desc>
+	<setting name="Cell Info Display" ref="CVC_CellInfoDisplay" type="boolean">
+	<desc>Cell Info Display Setting (Cell Broadcast Reception). "On" when checked. Cell info display is "Off" by default in the standard transceiver. This setting is set "On" by default for countries in which the GSM regulatory authority requires it.</desc>
+  </setting>
+</feature>
+<data>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_CustomerMenu.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="CVC_Previewable">
+	<confml:feature name="Customer Menu" ref="CVC_OperatorMenu">
+		<confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter. The URL defines the xHTML Startup page that is shown when the Customer Menu application is launched, for example www.customername.com/index.html. The URL also defines the customer domain URL path, for example www.customername.com/. All user-browsed xHTML pages belonging to that path are automatically stored in the Customer Menu cache.The Customer Menu application can be configured as a shortcut just like any other application. In Main menu, the Customer Menu is placed by default to 11th position. When the Customer Menu is enabled, Help moves from position 11 to 12 and Apps moves from 12 to 13, which is not visible until the user scrolls the menu cursor.</confml:desc>
+		<confml:setting name="Customer Menu icon" ref="CVC_OperatorMenuIconFile" type="file">
+			<confml:desc>Customer menu icon that will be present in Application Grid. Size: 65 x 65 pixels. Format: SVGT (preferred) or BMP. Color depth: 24 bit</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon bitmask" ref="CVC_OperatorMenuIconMaskFile" type="file">
+			<confml:desc>Customer menu bitmask when using BMP menu icon. Size: 65 x 65 pixels. Format: BMP. Color depth: 8 bit</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer Menu icon caption" ref="CVC_OperatorMenuIconCaption" type="string">
+			<confml:desc>The text caption for Customer Menu icon </confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu source URL" ref="CVC_OperatorMenuURL" type="string">
+			<confml:desc>Target URL for Operator Menu. The URL defines the xHTML Start-up page that will be shown when the Customer Menu application is launched (e.g. “www.customername.com/index.htmâ€). The URL also defines the customer domain URL path (e.g. “www.customername.comâ€).</confml:desc>
+		</confml:setting>
+		<confml:setting name="Customer Menu cache" ref="CVC_OperatorMenuCache" type="folder">
+			<confml:desc>Data stored in the Customer Menu cache is preserved in the device memory and can be accessed even after the Browser session is ended and through power cycles of the device. File format: xHTML files. Customers provide the xHTML pages to be pre-installed in the Customer Menu Cache.The max. amount of data that can be stored in the Customer Menu cache is 300 KB</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Customer menu cache expiration date" ref="CVC_AppShellOperatorMenuCacheExpireDate" type="string">
+			<confml:desc>In “mm/yyyy†format. Customers define the expiration date of the xHTML page(s). After that date, the cache content will no longer be used and Operator icon will launch URL instead.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+<confml:CVC_OperatorMenu>
+<confml:CVC_OperatorMenuCache>
+<confml:localPath>UI/Customer Menu/Cache</confml:localPath>
+</confml:CVC_OperatorMenuCache>
+</confml:CVC_OperatorMenu>
+</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_InstantMessaging.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_instantmessaging">
+
+<feature name="Instant Messaging" ref="CVC_InstantMessaging">
+	<desc>IM (Instant Messaging) settings</desc>	
+	<setting name="Server name" ref="CVC_IMServerName" type="string">
+	<desc>Server name. Max 30 chars.</desc>
+  	</setting>
+  	<setting name="Access point in use" ref="CVC_IMAccessPointInUse" type="string">
+  	<desc>Max 100 chars.</desc>
+  	</setting>
+  	<setting name="Web address" ref="CVC_IMWebAddress" type="string">
+  	<desc>Max 50 chars.</desc>
+  	</setting>
+  	<setting name="User ID" ref="CVC_IMUserID" type="string">
+  	</setting>
+  	<setting name="Password " ref="CVC_IMPassword" type="string">
+  	</setting>
+  	<setting name="IM Presence" ref="CVC_IMPresence" type="selection">
+  		<option name="Active for all" value="all"/>
+		<option name="Active for contacts" value="contacts"/>
+		<option name="Not active" value="not"/>
+  	</setting>
+  	<setting name="Allow messages from" ref="CVC_IMAllowMessagesFrom" type="selection">
+  		<option name="All" value="all"/>
+		<option name="IM contacts only " value="contacts"/>
+		<option name="None" value="none"/>
+  	</setting>
+  	<setting name="Message  scrolling speed" ref="CVC_IMMessageScrollingSpeed" type="selection">
+  		<option name="Slow" value="Slow"/>
+		<option name="Medium" value="Medium"/>
+		<option name="Fast" value="Fast"/>
+  	</setting>
+  	<setting name="Sort IM contacts" ref="CVC_IMSortContacts" type="selection">
+  		<option name="Alphabetically" value="Alphabetically"/>
+		<option name="By online status" value="Bystatus"/>
+  	</setting>
+  	<setting name="Availability reloading" ref="CVC_IMAvailabilityReloading" type="selection">
+  		<option name="Automatic" value="Automatic"/>
+		<option name="Manual" value="Manual"/>
+  	</setting>
+  	<setting name="Offline contacts" ref="CVC_IMOfflineContacts" type="selection">
+  		<option name="Show" value="Show"/>
+		<option name="Hide" value="Hide"/>
+  	</setting>
+  	<setting name="Own message colour" ref="CVC_IMOwnMessageColour" type="string">
+  	</setting>
+  	<setting name="Received message colour" ref="CVC_IMReceivedMessageColour" type="string">
+  	</setting>
+  	<setting name="Show date/ time info" ref="CVC_IMShowDateTimeInfo" type="selection">
+  		<option name="Yes" value="Yes"/>
+		<option name="No" value="No"/>
+  	</setting>
+  	<setting name="IM alert tone" ref="CVC_IMAlertTone" type="file">
+		<desc>Alert tone for Instant Messaging.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+	</setting>
+  	<setting name="Default Server" ref="CVC_IMDefaultServer" type="string">
+  	</setting>
+  	<setting name="Presence login type" ref="CVC_IMPresenceLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network On app." value="autohome"/>
+		<option name="Start-up Manual" value="manual"/>
+  	</setting>
+  	<setting name="IM login type" ref="CVC_IMLoginType" type="selection">
+  		<option name="Automatic" value="auto"/>
+		<option name="Automatic in home network" value="autohome"/>
+		<option name="Start-up" value="start"/>
+		<option name="Manual" value="manual"/>
+  	</setting>
+</feature>
+ <data>
+ </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_MMS.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="MMS Image and Message Sizes" ref="CVC_MMS">
+    <confml:desc>Additional mappings for MMS image and size settings</confml:desc>
+    <confml:setting name="Image Size" ref="CVC_MMSImageSize" type="string">
+      <confml:desc>Image size in pixels to which the picture is coverted when is transferred as part of and MMS message.</confml:desc>
+      <confml:option name="Small" value="640x480"/>
+      <confml:option name="Large" value="1600x1200"/>
+    </confml:setting>
+    <confml:setting name="Sent Message Size" ref="CVC_MMSSentMessageSize" type="int">
+      <confml:desc>Defines the maximum possible size for an MMS to be sent in bytes. It is the application's responsibility to assert this. For UI use only.</confml:desc>
+      <confml:option name="300K" value="307200"/>
+      <confml:option name="350K" value="358400"/>
+      <confml:option name="400K" value="409600"/>
+      <confml:option name="450K" value="460800"/>
+      <confml:option name="500K" value="512000"/>
+    </confml:setting>
+    <confml:setting name="Received Message Size" ref="CVC_MMSReceivedMessageSize" type="int">
+      <confml:desc>Defines the maximum possible size for a received MMS in bytes. This value should be at least 4 kilobytes larger than KMmsEngineMaximumSendSize in order to reserve space for MMS headers and attachment MIME headers.</confml:desc>
+      <confml:option name="304K" value="311296"/>
+      <confml:option name="354K" value="362496"/>
+      <confml:option name="404K" value="413696"/>
+      <confml:option name="454K" value="464896"/>
+      <confml:option name="504K" value="516096"/>
+    </confml:setting>
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_NokiaPCInternetAccess.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Nokia PC Internet Access" ref="CVC_NokiaPCInternetAccess">
+<desc>Customizations of PC application "Nokia PC Internet Access"</desc>
+    <setting name="Customer logo file" ref="CVC_NokiaPCInternetAccessFile" type="file">
+      <desc>Customer logo file. Format: Portable Network Graphics with transparent background. Size 280x40.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+		<setting name="Customer defined URL" ref="CVC_NokiaPCInternetAccessURL" type="string">
+			<desc>NPCIA autolaunches the default web browser of the PC. Default starting page of the browser can be set through NPCIA (when browser is launched by NPCIA)</desc>
+		</setting>
+		<setting name="Customer Care contact info" ref="CVC_NokiaPCInternetAccessCustomerCareInfo" type="string">
+			<desc>Located in in NPCIAs’ ‘Settings’ view. Can be phone number and/or link to operator webpage.</desc>
+		</setting>
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_OperatorLogo.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="OperatorLogoConf">
+  <feature name="Operator Logo" ref="CVC_OperatorLogo">
+<desc>The Nokia E75 supports color logos in addition to the traditional black and white customer logos. Customer logos may be predefined in the default settings for the device or downloaded by the user. The customer logo is stored together with the MNC and MCC info of the home network in the device and will be displayed when the user is in the home network. The customer logo replaces the standard customer name.</desc>
+    <setting name="Operator Mobile Country Code" ref="CVC_OperatorMCC" type="int">
+      <desc>Operator-specific Mobile Country Codes (MCCs) defined in ITU E.212 ("Land Mobile Numbering Plan") for use in identifying mobile stations in wireless telephone networks, particularly GSM and UMTS networks.</desc>
+</setting>
+    <setting name="Operator Mobile Network Code" ref="CVC_OperatorMNC" type="int">
+      <desc>Operator-specific Mobile Network Code(MNC) is used in combination with a Mobile Country Code (MCC) (also known as a "MCC / MNC tuple") to uniquely identify a mobile phone operator/carrier using the GSM, CDMA, iDEN, TETRA and UMTS public land mobile networks and some satellite mobile networks</desc>
+</setting>
+    <setting name="Operator Logo File" ref="CVC_OperatorLogoPath" type="file">
+      <desc>Operator logo file. Format: BMP or SVG. Maximum size 134x33 pixels. Name must be Logo_MCC_MNC_PROG.svg or Logo_MCC_MNC_PROG.bmp, where MCC and MNC are mobile country code and mobile network code.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+  <data>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_Preinstalled.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+	<feature name="Pre-installed Content" ref="CVC_PreinstalledContent">
+		<desc>Customer-defined pre-installed content. Please note that the total size of the User Data Area content size must not exceed 5 Mbytes.</desc>
+
+		<setting maxOccurs="6" name="Pre-Installed MMS Messages" ref="CVC_PreInstalledMMSs" type="sequence">
+			<desc>Max 6 mms, max size 35K. Binary format (encoding according to MMS encapsulation specification)</desc>
+			<setting name="Pre-Installed MMS" ref="CVC_PreInstalledMMS" type="file">
+				<desc>Pre-Installed MMS</desc>
+				<property name="maxFileSize" unit="kb" value="35"/>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+		</setting>
+
+		<setting name="Pre-Installed Images" ref="CVC_PreInstalledImagesFolder" type="folder">
+			<desc>Pre-Installed Images. Size up to 5MP (2560x1920 pixels), format JPEG. No EXIF data allowed</desc>
+			<property name="maxFileSize" unit="Mb" value="5"/>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Streaming links" ref="CVC_PreInstalledStreamingLinksFolder" type="folder">
+			<desc>Pre-Installed Streaming links. Format is .ram file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Music Clips" ref="CVC_PreInstalledMusicClipsFolder" type="folder">
+			<desc>Pre-Installed Music Clips.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-Installed Video Clips" ref="CVC_PreInstalledVideoClipsFolder" type="folder">
+			<desc>Pre-Installed Video Clips.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Default ringtone in General Profile" ref="CVC_DefaultRingtoneFile" type="file">
+			<desc>Default Ringtone in General Profile. Any supported media file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Default Message Alert tone in General Profile" ref="CVC_DefaultMessageToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default ringtone for incoming message event in General Profile. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Default Video Call tone in General Profile" ref="CVC_DefaultVideoCallToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default ringtone for video call event in General Profile. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Default E-Mail Alert Tone in General Profile" ref="CVC_DefaultCalendarAlarmToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default tone for incoming E-Mail in General profile. Any supported media file.</desc>
+		</setting>
+
+
+		<setting name="Default Calendar Alarm Tone" ref="CVC_DefaultCalendarAlarmToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default tone for Calendar alarm. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Default Clock Alarm Tone" ref="CVC_DefaultClockAlarmToneFile" type="file">
+      <localPath/>
+      <targetPath readOnly="true"/>
+			<desc>Default tone for Clock alarm. Any supported media file.</desc>
+		</setting>
+
+		<setting name="Pre-Installed Themes" ref="CVC_PreInstalledThemesFolder" type="folder">
+			<desc>Pre-Installed Themes. Format is Theme project archive zip file with extesion .tpf, containing the theme project and main .tdf file.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Application pre-Installed to User Data Area" ref="CVC_PreInstalledUDAApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Application pre-Installed to Memory Card" ref="CVC_PreInstalledMMCApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-Installed to device ROM. Will NOT be uninstallable by end-users. Format is Symbian	sisgned .sis file or Java MIDP .jar + .jad. Ensure that application	did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+
+		<setting name="Pre-loaded (bundled) application installable by end-user." ref="CVC_BundledApplicationsFolder" type="folder">
+			<desc>Complementary applications pre-loaded to device. Offerecd for installation to the end-user. Format is Symbian sisgned .sis file or Java MIDP .jar + .jad. Ensure that application did pass Simbian Signed or Java Verified acceptance.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+		</setting>
+		
+		<setting name="Symbian Certificates" ref="CVC_CertificatesSymbian" type="sequence">
+			<desc>Symbian certificates for trusted software installations.
+			</desc>
+			<setting name="Symbian Certificate file" ref="CVC_SymbianCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+			<setting name="Trusted installation of native Symbian OS applications" ref="CVC_AllowSWInstall" type="boolean">
+				<desc>Allows installation of native Symbian OS applications (on/off)</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+
+		<setting name="Java MIDP2 Certificates" ref="CVC_CertificatesMIDP" type="sequence">
+			<desc>Java MIDP certificates for trusted software installations.
+			</desc>
+			<setting name="Java Certificate file" ref="CVC_JavaCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+			</setting>
+			<setting name="Trusted Domain" ref="CVC_TrustedDomain" type="selection">
+				<desc>Trusted application domain: Customer or Third-party.
+				</desc>
+				<option name="Customer" value="Customer"/>
+				<option name="Third Party" value="Third Party"/>
+			</setting>
+		</setting>
+		<setting name="Internet Certificates" ref="CVC_CertificatesInternet" type="sequence">
+			<desc>Certificates for Internet services: SSL/TLS (HTTPS,SecureIMAP, etc.) connections.</desc>
+			<setting name="Internet Certificate file" ref="InternetCertificateFile" type="file">
+				<desc>Certificate file. Must be in X.509 CA format.
+				</desc>
+			</setting>
+			<setting name="Trusted to validate OCSP revocation responses" ref="CVC_AllowOCSPRevocationResponses" type="boolean">
+				<desc>Allows to validate OCSP revocation responses (on/off)
+				</desc>
+			</setting>
+		</setting>
+	</feature>
+
+<data>
+
+
+<CVC_PreinstalledContent>
+
+<CVC_PreInstalledImagesFolder>
+        <localPath>Media/Images</localPath>
+</CVC_PreInstalledImagesFolder>
+
+<CVC_PreInstalledStreamingLinksFolder>
+        <localPath>Streaming Links</localPath>
+</CVC_PreInstalledStreamingLinksFolder>
+
+<CVC_PreInstalledMusicClipsFolder>
+        <localPath>Media/Music</localPath>
+</CVC_PreInstalledMusicClipsFolder>
+
+<CVC_PreInstalledVideoClipsFolder>
+        <localPath>Media/Videos</localPath>
+</CVC_PreInstalledVideoClipsFolder>
+
+<CVC_PreInstalledThemesFolder>
+        <localPath>UI/Themes</localPath>
+</CVC_PreInstalledThemesFolder>
+
+<CVC_PreInstalledUDAApplicationsFolder>
+        <localPath>Applications/Pre-installed to UDA</localPath>
+</CVC_PreInstalledUDAApplicationsFolder>
+
+<CVC_PreInstalledMMCApplicationsFolder>
+        <localPath>Applications/Pre-installed to MMC</localPath>
+</CVC_PreInstalledMMCApplicationsFolder>
+
+<CVC_BundledApplicationsFolder>
+        <localPath>Applications/Bundled</localPath>
+</CVC_BundledApplicationsFolder>
+
+</CVC_PreinstalledContent>
+
+</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_RightSoftkey.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <confml:feature name="Right Softkey Customization" ref="CVC_RSK">
+    <confml:desc>The right soft key (RSK) in idle mode can be configured to launch a customer defined application or URL. The RSK label can be branded with a graphic only if it is a URL. The left soft key (LSK) is always a text string and is not customizable. The end user is able to personalize both the left and right soft keys.</confml:desc>
+    <confml:setting name="Right Softkey Customization" ref="CVC_ActiveIdleRSKCustomization" type="boolean">
+      <confml:desc>Right Softkey Customization</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey caption" ref="CVC_ActiveIdleRSKText" type="string">
+      <confml:desc>Right Softkey caption text (if RSK is not customized as image). 12 characters max (5 for Chinese variants).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey image" ref="CVC_ActiveIdleRSKImage" type="file">
+      <confml:desc>Size: 115 x 22 pixels Format: SVGT (preferred) or BMP</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting name="Right Softkey image BMP mask" ref="CVC_ActiveIdleRSKImageBMPMask" type="file">
+      <confml:desc>Right softkey BMP mask. Applicable only if BMP format is used.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting name="Right Softkey target URL" ref="CVC_ActiveIdleRSKTargetURL" type="string">
+      <confml:desc>Right Softkey target URL (if target is defined as a web site).</confml:desc>
+    </confml:setting>
+    <confml:setting name="Right Softkey target Application UID" ref="CVC_ActiveIdleRSKTargetAppUID" type="string">
+      <confml:desc>Right Softkey target Application UID (if target is an application). Format is a hexadecimal number (0x00000000).</confml:desc>
+    </confml:setting>
+</confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_StartupShutdownAnimations.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2" name="Operator Startup Animation">
+	<confml:feature name="Operator Startup Animation" ref="CVC_StartupAnimationSequence">
+		<confml:desc>Startup animation. The customer specific startup element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Startup Animation Duration" ref="CVC_StartupAnimationDuration" type="int">
+			<confml:desc>Time in milliseconds. Display time for still image is max 3 seconds (3000 msec), for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Startup Audio" ref="CVC_StartupAnimationTone" type="file">
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+		<confml:setting name="Startup Frames Location" ref="CVC_StartupFrameLocation" type="folder">
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+		</confml:setting>
+	</confml:feature>
+	<confml:feature name="Operator Shutdown Animation" ref="CVC_ShutdownAnimationSequence">
+		<confml:desc>Shutdown animation. The customer specific shutdown element can contain either a still image or an animation with or without a customer specified tone.</confml:desc>
+		<confml:setting name="Shutdown Animation Duration" ref="CVC_ShutdownAnimationDuration" type="int">
+			<confml:desc>Time in milliseconds. Display time for still image is max 3 seconds (3000 msec), for animation 2.5 max seconds.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Shutdown Audio" ref="CVC_ShutdownAnimationTone" type="file">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Sound tone played during animation. Animation is displayed at speed of 10 fps. If the optional tone is longer than 2.5 seconds, the last image will be displayed until the tone has finished.</confml:desc>
+			<confml:property name="maxSize" unit="kB" value="100"/>
+		</confml:setting>
+		<confml:setting name="Shutdown Frames Location" ref="CVC_ShutdownFrameLocation" type="folder">
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+			<confml:desc>Folder with animation frames. Filenames must be ordered by numbering frames in the correct sequence. Frame delay is fixed at 100ms to 250ms depending on phone model. Last frame will be displayed for duration remaining to defined Animation Duration setting.</confml:desc>
+		</confml:setting>
+	</confml:feature>
+	<confml:data>
+		<confml:CVC_StartupAnimationSequence>
+			<confml:CVC_StartupAnimationDuration>3000</confml:CVC_StartupAnimationDuration>
+			<confml:CVC_StartupFrameLocation>
+				<confml:localPath>UI/Start-up Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_StartupFrameLocation>
+		</confml:CVC_StartupAnimationSequence>
+		<confml:CVC_ShutdownAnimationSequence>
+			<confml:CVC_ShutdownAnimationDuration>3000</confml:CVC_ShutdownAnimationDuration>
+			<confml:CVC_ShutdownFrameLocation>
+				<confml:localPath>UI/Shutdown Animation</confml:localPath>
+				<confml:targetPath/>
+			</confml:CVC_ShutdownFrameLocation>
+		</confml:CVC_ShutdownAnimationSequence>
+	</confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_Streaming.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_streaming">
+	<feature name="Streaming Settings" ref="CVC_streaming">
+		<desc>Streaming Settings</desc>
+		<setting name="Use proxy" ref="CVC_streamingUseProxy" type="selection">
+			<desc>Use proxy for streaming</desc>
+			<option name="Yes" value="Yes"/>
+			<option name="No" value="No"/>
+		</setting>
+		<setting name="Proxy server address" ref="CVC_streamingProxyServerAddress" type="string">
+			<desc>Programmed (max.length 1000 characters)</desc>
+		</setting>
+		<setting name="Proxy port number" ref="CVC_streamingProxyPortNumber" type="int">
+			<desc>Programmed (1-9999)</desc>
+		</setting>
+		<setting name="Default access point" ref="CVC_streamingAccessPoint" type="string">
+			<desc>Programmed (max.length 100 characters)</desc>
+		</setting>
+		<setting name="Online time" ref="CVC_streamingOnlineTime" type="selection">
+			<desc>Limit for online time spent in streaming</desc>			
+			<option name="Unlimited" value="Unlimited"/>
+			<option name="User defined" value="UD"/>
+		</setting>
+		<setting name="User defined time" ref="CVC_streamingOnlineTimeValue" type="int">
+			<desc>User-selectable value for online streaming time (if limiting is enabled)</desc>
+			<desc>(1 – 30 minutes)</desc>
+		</setting>
+		<setting name="Lowest UDP port" ref="CVC_streamingLowestUDPPort" type="int">
+			<desc>1024 (equal or smaller than Highest UDP port) (default 6970)</desc>
+		</setting>
+		<setting name="Highest UDP port" ref="CVC_streamingHighestUDPPort" type="int">
+			<desc>65535 (equal or bigger than Lowest UDP port)(default 32000)</desc>
+		</setting>
+		<setting name="GPRS bandwidth" ref="CVC_streamingGPRSBandwidth" type="selection">
+			<desc>GPRS bandwidth limit for streaming</desc>
+			<option name="9.05 kbit/s" value="9"/>
+			<option name="13.40 kbit/s" value="13"/>
+			<option name="18.10 kbit/s" value="18"/>
+			<option name="27.15 kbit/s" value="27"/>
+			<option name="40.20 kbit/s" value="40"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined GPRS bandwidth" ref="CVC_streamingGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 99.99 kbps)</desc>
+		</setting>
+		<setting name="EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidth" type="selection">
+			<desc>EGPRS bandwidth limit for streaming</desc>
+			<option name="44.80 kbit/s" value="44"/>
+			<option name="59.20 kbit/s" value="59"/>
+			<option name="89.60 kbit/s" value="89"/>
+			<option name="108.80 kbit/s" value="108"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined EGPRS bandwidth" ref="CVC_streamingEGPRSBandwidthValue" type="real">
+			<desc>User defined (5 – 199.99 kbps)</desc>
+		</setting>
+		<setting name="UMTS bandwidth" ref="CVC_streamingUMTSBandwidth" type="selection">
+			<desc>UMTS bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined UMTS bandwidth" ref="CVC_streamingUMTSBandwidthValue" type="real">
+			<desc>User defined (5 – 999.99 kbps)</desc>
+		</setting>
+		<setting name="WLAN bandwidth" ref="CVC_streamingWLANBandwidth" type="selection">
+			<desc>WLAN bandwidth limit for streaming</desc>
+			<option name="64.00 kbit/s" value="64"/>
+			<option name="128.00 kbit/s" value="128"/>
+			<option name="192.00 kbit/s" value="192"/>
+			<option name="256.00 kbit/s" value="256"/>
+			<option name="320.00 kbit/s" value="320"/>
+			<option name="384.00 kbit/s" value="384"/>
+			<option name="768.00 kbit/s" value="768"/>
+			<option name="1.05 Mbit/s" value="1050"/>
+			<option name="1.43 Mbit/s" value="1430"/>
+			<option name="1.92 Mbit/s" value="1920"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined WLAN bandwidth" ref="CVC_streamingWLANBandwidthValue" type="real">
+			<desc>User defined (kbps)</desc>
+		</setting>
+		<setting name="HSDPA bandwidth" ref="CVC_streamingHSDPABandwidth" type="selection">
+			<desc>HSDPA bandwidth limit for streaming</desc>
+			<option name="600.00 kbit/s" value="600"/>
+			<option name="1.20 Mbit/s" value="1200"/>
+			<option name="1.80 Mbit/s" value="1800"/>
+			<option name="2.40 Mbit/s" value="2400"/>
+			<option name="3.00 Mbit/s" value="3000"/>
+			<option name="3.60 Mbit/s" value="3600"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="User defined HSDPA bandwidth" ref="CVC_streamingHSDPABandwidthValue" type="real">
+			<desc>User defined (5 – 3999.99 kbps)</desc>
+		</setting>
+	</feature>
+	<data>
+		<CVC_streaming>
+			<CVC_streamingUseProxy>No</CVC_streamingUseProxy>
+			<CVC_streamingProxyServerAddress/>
+			<CVC_streamingProxyPortNumber>554</CVC_streamingProxyPortNumber>
+			<CVC_streamingAccessPoint/>
+			<CVC_streamingOnlineTime>Unlimited</CVC_streamingOnlineTime>
+			<CVC_streamingOnlineTimeValue>1</CVC_streamingOnlineTimeValue>
+			<CVC_streamingLowestUDPPort>6970</CVC_streamingLowestUDPPort>
+			<CVC_streamingHighestUDPPort>32000</CVC_streamingHighestUDPPort>
+			<CVC_streamingGPRSBandwidth>40</CVC_streamingGPRSBandwidth>
+			<CVC_streamingGPRSBandwidthValue>5</CVC_streamingGPRSBandwidthValue>
+			<CVC_streamingEGPRSBandwidth>89</CVC_streamingEGPRSBandwidth>
+			<CVC_streamingEGPRSBandwidthValue>5</CVC_streamingEGPRSBandwidthValue>
+			<CVC_streamingUMTSBandwidth>384</CVC_streamingUMTSBandwidth>
+			<CVC_streamingUMTSBandwidthValue>5</CVC_streamingUMTSBandwidthValue>
+			<CVC_streamingWLANBandwidth>1430</CVC_streamingWLANBandwidth>
+			<CVC_streamingWLANBandwidthValue>5</CVC_streamingWLANBandwidthValue>
+			<CVC_streamingHSDPABandwidth>user</CVC_streamingHSDPABandwidth>
+			<CVC_streamingHSDPABandwidthValue>5</CVC_streamingHSDPABandwidthValue>
+		</CVC_streaming>
+	</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_SyncML.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,161 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2" name="cvc_SyncML">
+	<feature name="SyncML Settings" ref="CVC_SyncML">
+		<desc>SyncML Settings.</desc>
+		<setting name="Sync profile name" ref="CVC_SMLSyncProfileName" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+		<setting name="Server version" ref="CVC_SMLServerVersion" type="selection">
+			<desc>1.1, 1.2 (default)</desc>
+			<option name="1.2" value="1.2"/>
+			<option name="1.1" value="1.1"/>
+		</setting>
+		<setting name="Server ID" ref="CVC_SMLServerID" type="string">
+			<desc>Server ID</desc>
+		</setting>
+		<setting name="Data bearer" ref="CVC_SMLDataBearer" type="selection">
+			<desc>Data bearer for server connection</desc>
+			<option name="Internet" value="Internet"/>
+			<option name="Bluetooth" value="BT"/>
+		</setting>
+<!-- if Data bearer = internet-->
+		<setting name="Access point" ref="CVC_SMLAccessPoint" type="selection">
+			<desc>Access point to use for server connetion</desc>
+			<option name="Always ask" value="ask"/>
+			<option name="User defined" value="user"/>
+		</setting>
+		<setting name="Host Address" ref="CVC_SMLHostAddress" type="string">
+			<desc>Maximum length 150 characters.</desc>
+		</setting>
+		<setting name="Port" ref="CVC_SMLPort" type="int">
+			<desc>80 (default), 1-65535</desc>
+		</setting>
+		<setting name="User name" ref="CVC_SMLUserName" type="string">
+			<desc>Server account: username</desc>
+		</setting>
+		<setting name="Password" ref="CVC_SMLPassword" type="string">
+			<desc>Server account: password</desc>
+		</setting>
+		<setting name="Allow sync requests" ref="CVC_SMLAllowSyncRequests" type="selection">
+			<desc>Policy for sync requests</desc>
+			<option name="Automatically accept" value="auto"/>
+			<option name="Ask first" value="ask"/>
+			<option name="Not allowed" value="no"/>
+		</setting>
+		<setting name="Network user name" ref="CVC_SMLNetworkUserName" type="string">
+			<desc>Username for Access Point connection</desc>
+		</setting>
+		<setting name="Network password" ref="CVC_SMLNetworkPassword" type="string">
+			<desc>Password for Access Point connection</desc>
+		</setting>
+		<setting name="Syncronisation type" ref="CVC_SMLSyncronisationType" type="selection">
+			<desc>Type of syncronization</desc>
+			<option name="Both ways" value="both"/>
+			<option name="To server only" value="server"/>
+			<option name="To phone only" value="phone"/>
+		</setting>
+	</feature>
+	
+	<feature name="SyncML Data Syncronization" ref="CVC_SyncMLDataSync">
+
+		<setting name="Syncronize Contacts" ref="CVC_SyncMLContacts" type="boolean">
+			<desc>Include Contacts in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Calendar" ref="CVC_SyncMLCalendar" type="boolean">
+			<desc>Include Calendar in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Notes" ref="CVC_SyncMLNotes" type="boolean">
+			<desc>Include Notes in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize E-mail" ref="CVC_SyncMLSyncEmail" type="boolean">
+			<desc>Include E-mail in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Music" ref="CVC_SyncMLMusicMetadata" type="boolean">
+			<desc>Include Music in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize MSyncService" ref="CVC_SyncMLMSyncService" type="boolean">
+			<desc>Include MSyncService in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Images" ref="CVC_SyncMLImage" type="boolean">
+			<desc>Include Images in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Synchronize MMS" ref="CVC_SyncMLMMS" type="boolean">
+			<desc>Include MMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Video" ref="CVC_SyncMLVideo" type="boolean">
+			<desc>Include Video in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize SMS" ref="CVC_SyncMLSMS" type="boolean">
+			<desc>Include SMS in Sync ON/OFF</desc>
+		</setting>
+
+		<setting name="Syncronize Bookmarks" ref="CVC_SyncMLBookmarks" type="boolean">
+			<desc>Include Bookmarks in Sync ON/OFF</desc>
+		</setting>
+	</feature>
+
+
+
+
+	<feature name="SyncML Remote Databases" ref="CVC_SyncMLDataSyncRemoteDatabases">
+
+		<setting name="Remote database for Contacts" ref="CVC_SyncMLDataSyncRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Calendar" ref="CVC_SyncMLCalendarRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Notes" ref="CVC_SyncMLNotesRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for E-mail" ref="CVC_SyncMLSyncEmailRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Music" ref="CVC_SyncMLMusicMetadataRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MSyncService" ref="CVC_SyncMLMSyncServiceRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Images" ref="CVC_SyncMLImageRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for MMS" ref="CVC_SyncMLMMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Video" ref="CVC_SyncMLVideoRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for SMS" ref="CVC_SyncMLSMSRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+
+		<setting name="Remote database for Bookmarks" ref="CVC_SyncMLBookmarksRemoteDatabase" type="string">
+			<desc>Maximum length 50 characters.</desc>
+		</setting>
+	</feature>
+
+
+<data>
+<CVC_SyncML>
+<CVC_SMLPort>80</CVC_SMLPort>
+</CVC_SyncML>
+</data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ThemeWallpaperScreensaver.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/2">
+
+  <feature name="Default Theme" ref="CVC_Theme_ref">
+    <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+    <setting name="Default Theme" ref="CVC_DefaultTheme_ref" type="file">
+      <desc>Default Theme to be set on device. Select from the set of pre-installed themes.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+
+    <feature name="Wallpaper" ref="CVC_Wallpaper">
+    <desc>Default wallpaper</desc>
+    <setting name="Wallpaper" ref="CVC_WallpaperFile" type="file">
+      <desc>Size: 240X234 pixels Format: SVGT (preferred) or BMP. 24 bit. The end user can select to change this to either a different single image or select multiple images to run in a wallpaper slide show.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+  </feature>
+
+  <feature name="Screensaver" ref="CVC_Screensaver">
+    <desc>Screensaver</desc>
+    <setting name="Screensaver File" ref="CVC_ScreensaverFile" type="file">
+      <desc>Screensaver file. Format is animated GIF.</desc>
+      <localPath/>
+      <targetPath readOnly="true"/>
+    </setting>
+    <setting name="Animation Timeout (mins)" ref="CVC_AnimationTimeout" type="int">
+      <desc>Duration the animation will run before reverting to default screensaver in minutes. Min 1 minute, max 30 minutes.</desc>
+    </setting>
+    <setting name="Lights Timeout (secs)" ref="CVC_LightsTimeout" type="int">
+      <desc>Duration of display lights being turned on while the animation runs in seconds. 0 = no lights, max 30 seconds.</desc>
+    </setting>
+  </feature>
+<data>
+
+<CVC_Theme_ref>
+  <CVC_DefaultTheme_ref>
+      <localPath>UI/Armi2.tpf</localPath>
+ </CVC_DefaultTheme_ref>
+</CVC_Theme_ref>
+
+
+<CVC_Screensaver>
+<CVC_AnimationTimeout>3</CVC_AnimationTimeout>
+<CVC_LightsTimeout>15</CVC_LightsTimeout>
+</CVC_Screensaver>
+</data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_VoiceMailbox.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="Voice Mailbox Number " ref="CVC_VoiceMailboxNumbers">
+		<confml:desc>The device number of the customer’s voice mailbox may be programmed into the device during production or in service. Voice mailbox feature may be activated in two different ways: CSP (Customer Service Profile) support is enabled in product profile AND voice mailbox numbers can be found from customer’s SIM card</confml:desc>
+		<confml:setting name="Number for primary ALS line" ref="CVC_VoiceMailboxNumberPrimaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+		</confml:setting>
+		<confml:setting name="Number for secondary ALS line" ref="CVC_VoiceMailboxNumberSecondaryALS" type="string">
+			<confml:desc>Maximum allowed length is 50 characters.</confml:desc>
+    </confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/CVC_ZeroPlusSend.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?><confml:configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+	<confml:feature name="0+ Send" ref="CVC_ZeroPlusSend">
+		<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks.</confml:desc>
+		<confml:setting name="0+ Send" ref="CVC_ZeroPlusSend" type="boolean">
+			<confml:desc>0 + SEND is used in the US as access number to national operator assistance both in landline and wireless networks. Default is off.</confml:desc>
+</confml:setting>
+</confml:feature>
+	<confml:data>
+	</confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/confml/test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+	<configuration xmlns="http://www.s60.com/xml/confml/1" name="test">
+		<feature name="Test" ref="Test">
+			<setting constraint="" name="SubOne for testing" readOnly="true" ref="SubOne" type="string">
+			<desc>Testing for deference</desc>
+			</setting>
+		</feature>
+		<data>
+			<Test>
+				<SubOne>Hello world</SubOne>
+			</Test>
+		</data>
+	</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/cvc_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="confml/CVC_2DigitDialing.confml"/>
+  <xi:include href="confml/CVC_ActiveIdleNotifiers.confml"/>
+  <xi:include href="confml/CVC_ActiveIdleOther.confml"/>
+  <xi:include href="confml/CVC_CellInfoDisplay.confml"/>
+  <xi:include href="confml/CVC_CPHSALS.confml"/>
+  <xi:include href="confml/CVC_CustomerMenu.confml"/>
+  <xi:include href="confml/CVC_InstantMessaging.confml"/>
+  <xi:include href="confml/CVC_NokiaPCInternetAccess.confml"/>
+  <xi:include href="confml/CVC_OperatorLogo.confml"/>
+  <xi:include href="confml/CVC_Preinstalled.confml"/>
+  <xi:include href="confml/CVC_RightSoftkey.confml"/>
+  <xi:include href="confml/CVC_StartupShutdownAnimations.confml"/>
+  <xi:include href="confml/CVC_Streaming.confml"/>
+  <xi:include href="confml/CVC_SyncML.confml"/>
+  <xi:include href="confml/CVC_ThemeWallpaperScreensaver.confml"/>
+  <xi:include href="confml/CVC_VoiceMailbox.confml"/>
+  <xi:include href="confml/CVC_AppShell323.confml"/>
+  <xi:include href="confml/CVC_ZeroPlusSend.confml"/>
+  <xi:include href="confml/CVC_MMS.confml"/>
+  <xi:include href="confml/CVC_BluetoothDiscoverability.confml"/>
+  <xi:include href="cvc_view.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/cvc/cvc_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,219 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <confml:view id="E75_CVC" name="Custom modeled ConfMLs for E75 customization">
+    <confml:desc>Custom modeled ConfMLs for E75 customization according to E75 Customization Guidelines</confml:desc>
+    <confml:group name="Applications">
+      <confml:desc>Settings for standard S60 Platform applications</confml:desc>
+      <confml:icon xlink:href="applications_48_nav.png"/>
+      <confml:group name="Browser">
+        <confml:desc>Browser (xHTML) settings</confml:desc>
+      </confml:group>
+      <confml:group name="Calendar">
+        <confml:desc>Calendar</confml:desc>
+      </confml:group>
+      <confml:group name="Device Manager">
+        <confml:desc>Settings for Device Manager application.</confml:desc>
+      </confml:group>
+      <confml:group name="Media Player">
+        <confml:desc>Media Player</confml:desc>
+      </confml:group>
+      <confml:group name="Voice Recorder">
+        <confml:desc>Voice Recorder</confml:desc>
+      </confml:group>
+      <confml:group name="Phonebook">
+        <confml:desc>Phonebook</confml:desc>
+      </confml:group>
+      <confml:group name="Logs">
+        <confml:desc>Logs</confml:desc>
+      </confml:group>
+      <confml:group name="Camcorder">
+        <confml:desc>Camcorder</confml:desc>
+      </confml:group>
+      <confml:group name="Clock">
+        <confml:desc>Clock</confml:desc>
+      </confml:group>
+      <confml:group name="Profiles">
+        <confml:desc>Profiles</confml:desc>
+      </confml:group>
+      <confml:group name="Positioning">
+        <confml:desc>Positioning</confml:desc>
+      </confml:group>
+      <confml:group name="Instant Messaging">
+        <confml:desc>Instant Messaging</confml:desc>
+        <confml:setting ref="CVC_InstantMessaging/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Connectivity">
+      <confml:desc>Settings for personal communication and connection methods</confml:desc>
+      <confml:icon xlink:href="connectivity_48_nav.png"/>
+      <confml:group name="Access Points">
+        <confml:desc>Nokia NXX has StartUp Settings application. It configures access point settings based on a SIM card�s MCC and MNC and the access point information supplied to Nokia by the network operators.</confml:desc>
+      </confml:group>
+      <confml:group name="MMS">
+        <confml:desc>If the Customer specifies MMS settings (including Access points) in their variant then the transceiver will be able to receive MMS messages straight away after having been powered-up.</confml:desc>
+      </confml:group>
+      <confml:group name="SMS">
+        <confml:desc>SMS Settings</confml:desc>
+      </confml:group>
+      <confml:group name="Postcard">
+        <confml:desc>Postcard settings</confml:desc>
+      </confml:group>
+      <confml:group name="E-mail">
+        <confml:desc>Customers may choose to define one set of common settings for the e-mail client in the Messaging application of the device.</confml:desc>
+      </confml:group>
+      <confml:group name="Messaging">
+        <confml:desc>Messaging</confml:desc>
+      </confml:group>
+      <confml:group name="Bluetooth">
+        <confml:desc>Bluetooth</confml:desc>
+      </confml:group>
+      <confml:group name="Streaming">
+        <confml:desc>Streaming</confml:desc>
+        <confml:setting ref="CVC_streaming/*"/>
+      </confml:group>
+      <confml:group name="Mobile TV">
+        <confml:desc>Mobile TV</confml:desc>
+      </confml:group>
+      <confml:group name="Voice and Video Mail">
+        <confml:desc>Settings for voice and video mailboxes</confml:desc>
+        <confml:setting ref="CVC_VoiceMailboxNumbers/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="System">
+      <confml:desc>System settings of S60 platform</confml:desc>
+      <confml:icon xlink:href="system_48_nav.png"/>
+      <confml:group name="Accessory Profiles">
+        <confml:desc>Accessory Profiles</confml:desc>
+      </confml:group>
+      <confml:group name="SyncML">
+        <confml:desc>SyncML</confml:desc>
+        <confml:setting ref="CVC_SyncML/*"/>
+        <confml:setting ref="CVC_SyncMLDataSync/*"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/*"/>
+      </confml:group>
+      <confml:group name="Light Sensor">
+        <confml:desc>Light Senso</confml:desc>
+      </confml:group>
+      <confml:group name="Java">
+        <confml:desc>Java Application Settings</confml:desc>
+      </confml:group>
+      <confml:group name="Other">
+        <confml:desc>Other</confml:desc>
+        <confml:setting ref="CVC_CellInfoDisplay/*"/>
+        <confml:setting ref="CVC_ZeroPlusSend/*"/>
+        <confml:setting ref="CVC_2DigitDialing/*"/>
+        <confml:setting ref="CVC_CPHSALS/*"/>
+      </confml:group>
+      <confml:group name="Telephony">
+        <confml:desc>Telephony</confml:desc>
+      </confml:group>
+      <confml:group name="FOTA">
+        <confml:desc>Firmware update Over The Air</confml:desc>
+      </confml:group>
+      <confml:group name="Keyguard">
+        <confml:desc>Keypad lock settings</confml:desc>
+      </confml:group>
+      <confml:group name="Service Messages">
+        <confml:desc>Service Messages</confml:desc>
+      </confml:group>
+      <confml:group name="Vibra">
+        <confml:desc>Vibra</confml:desc>
+      </confml:group>
+      <confml:group name="TV-out">
+        <confml:desc>TV-out</confml:desc>
+      </confml:group>
+      <confml:group name="Software Install">
+        <confml:desc>Software Install</confml:desc>
+      </confml:group>
+    </confml:group>
+    <confml:group name="UI">
+      <confml:desc>Settings for branding, user interface and look &amp; feel</confml:desc>
+      <confml:icon xlink:href="userinterface_48_nav.png"/>
+      <confml:group name="Customer Menu">
+        <confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter.</confml:desc>
+        <confml:setting ref="CVC_OperatorMenu/*"/>
+      </confml:group>
+      <confml:group name="Customer Logo">
+        <confml:desc>The Nokia NXX supports colour logos in addition to the traditional black and white Customer logos.</confml:desc>
+        <confml:setting ref="CVC_OperatorLogo/*"/>
+      </confml:group>
+      <confml:group name="Ring Tones">
+        <confml:desc>Nokia NXX supports the following types of ring tones and alert tones. The Customer may select to include tones of their own in any of the listed formats. The Customer can specify one as the default ringing tone in the General profile.</confml:desc>
+      </confml:group>
+      <confml:group name="Start-up and shutdown animations">
+        <confml:desc>Start-up and shutdown animations</confml:desc>
+        <confml:setting ref="CVC_ShutdownAnimationSequence/*"/>
+        <confml:setting ref="CVC_StartupAnimationSequence/*"/>
+      </confml:group>
+      <confml:group name="Application Menu">
+        <confml:desc>Application Menu</confml:desc>
+        <confml:setting ref="CVC_AppShell323/*"/>
+      </confml:group>
+      <confml:group name="Themes">
+        <confml:desc>Themes</confml:desc>
+        <confml:setting ref="CVC_Theme_ref/*"/>
+      </confml:group>
+      <confml:group name="General">
+        <confml:desc>General</confml:desc>
+        <confml:setting ref="CVC_RSK/*"/>
+        <confml:setting ref="CVC_Wallpaper/*"/>
+        <confml:setting ref="CVC_Screensaver/*"/>
+      </confml:group>
+      <confml:group name="Nokia PC Internet Access">
+        <confml:desc>Nokia PC Internet Access a.k.a. Phone a modem</confml:desc>
+        <confml:setting ref="CVC_NokiaPCInternetAccess/*"/>
+      </confml:group>
+      <confml:group name="Homescreen">
+        <confml:desc>Homescreen or Active Idle customizations</confml:desc>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/*"/>
+        <confml:setting ref="CVC_ActiveIdleOther/*"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Pre-Installed Content">
+      <confml:desc>Applications, music, video and other files preinstalled to device</confml:desc>
+      <confml:icon xlink:href="preinstalledcontent_48_nav.png"/>
+      <confml:group name="Customer Applications">
+        <confml:desc>Customer specific Symbian and Java applications can be pre-installed to device memory (UDA).</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMCApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledUDAApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_BundledApplicationsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded MMS">
+        <confml:desc>Maximum amount of 3 Customer specific MMS messages may be pre-installed in the Device memory.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMSs"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Video">
+        <confml:desc>Customer specific video clips may be pre-installed in the User Data Area or Memory card. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledVideoClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Music">
+        <confml:desc>Customer can pre-load Music content in the User Data Area and/or memory card. They will be seen in Nseries Music Player. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMusicClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Images">
+        <confml:desc>Customer can pre-load images in the User Data Area and/or memory card. They will be seen in Photos application. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledImagesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-installed Ringtones">
+        <confml:desc>Pre-installed ringtones</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultMessageToneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultRingtoneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultVideoCallToneFile"/>
+      </confml:group>
+      <confml:group name="Pre-installed Certificates">
+        <confml:desc>Pre-installed security certificates (X.509)</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesInternet"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesMIDP"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesSymbian"/>
+      </confml:group>
+      <confml:group name="Pre-installed Themes">
+        <confml:desc>Pre-installed Themes</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledThemesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-defined Streaming Links">
+        <confml:desc>Pre-defined Streaming Links</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledStreamingLinksFolder"/>
+      </confml:group>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/root_variant.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="E75 Vanilla" version="0.51">
+  <xi:include href="s60/s60_root.confml"/>
+  <xi:include href="cvc/cvc_root.confml"/>
+  <xi:include href="variant/variant_root.confml"/>
+  <confml:meta>
+    <confml:customer>Customer-independent</confml:customer>
+    <confml:owner>Mike Smyslov</confml:owner>
+    <confml:version>0.54</confml:version>
+    <confml:platform>S60</confml:platform>
+    <confml:date>2008-12-03</confml:date>
+    <confml:release>3.2</confml:release>
+    <confml:product>E75</confml:product>
+    <confml:editor>Mike Smyslov</confml:editor>
+    <confml:status></confml:status>
+  </confml:meta>
+  <confml:desc>E75 Vanilla variant template for non-APAC regions filtered accordign to MDC model</confml:desc>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/confml/aknskins.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,178 @@
+<?xml version="1.0" encoding="utf-8"?><configuration xmlns="http://www.s60.com/xml/confml/1" name="aknskins">
+  <feature name="Avkon Personalization" ref="KCRUidPersonalisation">
+    <desc/>
+    <setting constraint="" name="Active Skin Location" ref="KPslnActiveSkinLocation" type="selection">
+      <desc>The location of the active skin. Possible values are: 0 = Phone (drives C:\ and Z:\), 2 = MMC (E:\).</desc>
+      <option name="Phone Memory" value="0"/>
+      <option name="MMC" value="2"/>
+    </setting>
+    <setting constraint="" name="Active Skin Uid" ref="KPslnActiveSkinUid" type="string">
+      <desc>The UID of the active skin.</desc>
+    </setting>
+    <setting constraint="" name="Color Palette Uid" readOnly="true" ref="KPslnColorPaletteUid" type="string">
+      <desc>Active color palette Uid.</desc>
+    </setting>
+    <setting name="Dimmed Idle Background Image Index" readOnly="true" ref="KPslnDimmedIdleBackgroundImageIndex" type="int">
+      <desc>Bitmap index of the active background image in the favourites.</desc>
+    </setting>
+    <setting name="Favourites Background Image Index" readOnly="true" ref="KPslnFavouritesBackgroundImageIndex" type="int">
+      <desc>Active background image in the favourites Uid.</desc>
+    </setting>
+    <setting name="Favourites Background Image Path" ref="KPslnFavouritesBackgroundImagePath" type="string">
+      <desc>The path name of the active background image file in Favourites.</desc>
+    </setting>
+    <setting name="Icon Set Uid" readOnly="true" ref="KPslnIconSetUid" type="string">
+      <desc>Active icon set Uid.</desc>
+    </setting>
+    <setting name="Idle Background Image Index" readOnly="true" ref="KPslnIdleBackgroundImageIndex" type="int">
+      <desc>Bitmap index of the active background image in the idle state.</desc>
+    </setting>
+    <setting name="Idle Background Image Path" ref="KPslnIdleBackgroundImagePath" type="string">
+      <desc>The path name of the active background image file in the Idle state.</desc>
+    </setting>
+    <setting name="ScreenSaver Uid" readOnly="true" ref="KPslnScreenSaverUid" type="int">
+      <desc> Active screen saver's Uid.</desc>
+    </setting>
+    <setting name="Idle Background Image Uid" readOnly="true" ref="KPslnIdleBackgroundImageUid" type="string">
+      <desc>Active background image in the idle state Uid.</desc>
+    </setting>
+    <setting name="Favourites Background Image Uid" readOnly="true" ref="KPslnFavouritesBackgroundImageUid" type="string">
+      <desc> Active background image in the favourites Uid.</desc>
+    </setting>
+    <setting name="Default Skin Uid" ref="KPslnDefaultSkinUid" type="string">
+      <desc>Defines the default skin of the device. If default value is used, S60 default skin is used. Given value should be in HEX.&#13;
+Note that using 16-digit PID value here has a degrading impact on device performance. 8-digit UID is thus preferred.</desc>
+    </setting>
+    <setting name="System Default ScreenSaver" ref="KPslnSystemDefaultScreenSaver" type="string">
+      <desc>System default screen saver. Possible values are:&#13;
+DateTime (same as if the key is not set at all)  - default screensaver is Date and Time screensaver.&#13;
+Text - default screensaver is Text.&#13;
+None - by default, screensaver is off.&#13;
+Defining an incorrect value will set Date and Time screensaver as default screensaver.&#13;
+Note that active screensaver is set using repository KCRUidScreenSaver with key KScreenSaverObject.</desc>
+    </setting>
+    <setting name="Color Palette" ref="KPslnColorPalette" type="selection">
+      <desc>Active color scheme. Possible values are: 0 (blue), 1 (green), 2 (purple), 3 (red), 4 (pink), 5 (orange).</desc>
+      <option name="Blue" value="0"/>
+      <option name="Green" value="1"/>
+      <option name="Purple" value="2"/>
+      <option name="Red" value="3"/>
+      <option name="Pink" value="4"/>
+      <option name="Orange" value="5"/>
+    </setting>
+    <setting name="Available Color Palettes" ref="KPslnAvailableColorPalettes" type="string">
+      <desc>Available color schemes. Contains a space separated list of the supported color schemes. Values are the same as in above.</desc>
+    </setting>
+    <setting name="Highlight Animation Enabled" ref="KPslnHighlightAnimationEnalbled" type="selection">
+      <desc>Highlight animation status. If 0 animations are disabled, otherwise animations are enabled.</desc>
+      <option name="Disabled" value="0"/>
+      <option name="Enabled" value="1"/>
+    </setting>
+    <setting name="FullScreen Wallpaper Enabled" ref="KPslnFullScreenWallpaperEnabled" type="selection">
+      <desc>Full screen wallpaper status. Value 0 means that full screen wallpaper is off, otherwise full screen wallpaper is enabled.</desc>
+      <option name="Full Screen Wallpaper Off" value="0"/>
+      <option name="Full Screen Wallpaper On" value="1"/>
+    </setting>
+    <setting name="Wallpaper Type" ref="KPslnWallpaperType" type="selection">
+      <desc>Defines wallpaper type (none/image/slide set). Value of zero means that there is no wallpaper, value of 1 means that wallpaper is single image and value of 2 means that wallpaper is defined as image slide set.</desc>
+      <option name="No Image" value="0"/>
+      <option name="Single Image" value="1"/>
+      <option name="Slide set" value="2"/>
+    </setting>
+    <setting id="" name="Default Skin" ref="KPslnDefaultSkin" type="int">
+      <desc> Defines the default skin of the device. If default value is used, S60 default skin is used.</desc>
+    </setting>
+  </feature>
+  <feature name="Wallpaper Configuration" ref="KCRUidWallpaperConfiguration">
+    <desc/>
+    <setting name="Wallpaper Portrait Scale Priority" ref="KWpConfPortraitScalePriority" type="int">
+      <desc>Defines which operation (crop, stretch or both) should be preferred when trying to scale wallpaper to a portrait screen. &#13;
+Value of zero (0)  means stretching is preferred, value of one (1) means cropping is preferred and value of two (2) means both are preferred.(3) means nhd fullscreen is preferred</desc>
+    </setting>
+    <setting name="Wallpaper Portrait Max Crop Factor" ref="KWpConfPortraitMaxCropFactor" type="real">
+      <desc>Maximum crop factor for portrait wallpaper.</desc>
+    </setting>
+    <setting name="Wallpaper Portait Max Stretch Factor" ref="KWpConfPortaitMaxStretchFactor" type="real">
+      <desc>Maximum stretch factor for portrait wallpaper.</desc>
+    </setting>
+    <setting name="Wallpaper Landscape Scale Priority" ref="KWpConfLandscapeScalePriority" type="int">
+      <desc>Defines which operation (crop, stretch or both) should be preferred when trying to scale wallpaper to a landscape screen.&#13;
+Value of zero (0)  means stretching is preferred, value of one (1) means cropping is preferred and value of two (2) means both are preferred.(3) means nhd fullscreen is preferred</desc>
+    </setting>
+    <setting name="Wallpaper Landscape Max Crop Factor" ref="KWpConfLandscapeMaxCropFactor" type="real">
+      <desc>Maximum crop factor for landscape wallpaper.</desc>
+    </setting>
+    <setting name="Wallpaper Landscape Max Stretch Factor" ref="KWpConfLandscapeMaxStretchFactor" type="real">
+      <desc>Maximum stretch factor for landscape wallpaper.</desc>
+    </setting>
+  </feature>
+  <meta>
+    <customer/>
+    <date/>
+  </meta>
+  <data>
+    <KCRUidPersonalisation>
+      <KPslnActiveSkinLocation>0</KPslnActiveSkinLocation>
+      <KPslnActiveSkinUid>0</KPslnActiveSkinUid>
+      <KPslnColorPaletteUid>0</KPslnColorPaletteUid>
+      <KPslnDimmedIdleBackgroundImageIndex>0</KPslnDimmedIdleBackgroundImageIndex>
+      <KPslnFavouritesBackgroundImageIndex>0</KPslnFavouritesBackgroundImageIndex>
+      <KPslnFavouritesBackgroundImagePath/>
+      <KPslnIconSetUid>0</KPslnIconSetUid>
+      <KPslnIdleBackgroundImageIndex>0</KPslnIdleBackgroundImageIndex>
+      <KPslnIdleBackgroundImagePath/>
+      <KPslnScreenSaverUid>0</KPslnScreenSaverUid>
+      <KPslnIdleBackgroundImageUid>0</KPslnIdleBackgroundImageUid>
+      <KPslnFavouritesBackgroundImageUid>0</KPslnFavouritesBackgroundImageUid>
+      <KPslnDefaultSkinUid>0</KPslnDefaultSkinUid>
+      <KPslnSystemDefaultScreenSaver/>
+      <KPslnColorPalette>0</KPslnColorPalette>
+      <KPslnAvailableColorPalettes>0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19</KPslnAvailableColorPalettes>
+      <KPslnHighlightAnimationEnalbled>1</KPslnHighlightAnimationEnalbled>
+      <KPslnFullScreenWallpaperEnabled>0</KPslnFullScreenWallpaperEnabled>
+      <KPslnWallpaperType>0</KPslnWallpaperType>
+      <KPslnColorPalette>0</KPslnColorPalette>
+      <KPslnDefaultSkin>0</KPslnDefaultSkin>
+    </KCRUidPersonalisation>
+    <KCRUidWallpaperConfiguration>
+      <KWpConfPortraitScalePriority>1</KWpConfPortraitScalePriority>
+      <KWpConfPortraitMaxCropFactor>0.33</KWpConfPortraitMaxCropFactor>
+      <KWpConfPortaitMaxStretchFactor>0.23</KWpConfPortaitMaxStretchFactor>
+      <KWpConfLandscapeScalePriority>1</KWpConfLandscapeScalePriority>
+      <KWpConfLandscapeMaxCropFactor>0.131</KWpConfLandscapeMaxCropFactor>
+      <KWpConfLandscapeMaxStretchFactor>0.15</KWpConfLandscapeMaxStretchFactor>
+    </KCRUidWallpaperConfiguration>
+  </data>
+  <rfs>
+    <KCRUidPersonalisation>
+      <KPslnActiveSkinLocation>true</KPslnActiveSkinLocation>
+      <KPslnActiveSkinUid>true</KPslnActiveSkinUid>
+      <KPslnColorPaletteUid>true</KPslnColorPaletteUid>
+      <KPslnDimmedIdleBackgroundImageIndex>true</KPslnDimmedIdleBackgroundImageIndex>
+      <KPslnFavouritesBackgroundImageIndex>true</KPslnFavouritesBackgroundImageIndex>
+      <KPslnFavouritesBackgroundImagePath>true</KPslnFavouritesBackgroundImagePath>
+      <KPslnIconSetUid>true</KPslnIconSetUid>
+      <KPslnIdleBackgroundImageIndex>true</KPslnIdleBackgroundImageIndex>
+      <KPslnIdleBackgroundImagePath>true</KPslnIdleBackgroundImagePath>
+      <KPslnScreenSaverUid>true</KPslnScreenSaverUid>
+      <KPslnIdleBackgroundImageUid>true</KPslnIdleBackgroundImageUid>
+      <KPslnFavouritesBackgroundImageUid>true</KPslnFavouritesBackgroundImageUid>
+      <KPslnDefaultSkinUid>false</KPslnDefaultSkinUid>
+      <KPslnSystemDefaultScreenSaver>false</KPslnSystemDefaultScreenSaver>
+      <KPslnColorPalette>true</KPslnColorPalette>
+      <KPslnAvailableColorPalettes>true</KPslnAvailableColorPalettes>
+      <KPslnHighlightAnimationEnalbled>false</KPslnHighlightAnimationEnalbled>
+      <KPslnFullScreenWallpaperEnabled>true</KPslnFullScreenWallpaperEnabled>
+      <KPslnWallpaperType>true</KPslnWallpaperType>
+      <KPslnDefaultSkin>false</KPslnDefaultSkin>
+    </KCRUidPersonalisation>
+    <KCRUidWallpaperConfiguration>
+      <KWpConfPortraitScalePriority>false</KWpConfPortraitScalePriority>
+      <KWpConfPortraitMaxCropFactor>false</KWpConfPortraitMaxCropFactor>
+      <KWpConfPortaitMaxStretchFactor>false</KWpConfPortaitMaxStretchFactor>
+      <KWpConfLandscapeScalePriority>false</KWpConfLandscapeScalePriority>
+      <KWpConfLandscapeMaxCropFactor>false</KWpConfLandscapeMaxCropFactor>
+      <KWpConfLandscapeMaxStretchFactor>false</KWpConfLandscapeMaxStretchFactor>
+    </KCRUidWallpaperConfiguration>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/content/UI/Armi2.tpf has changed
Binary file configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/content/UI/Themes/Armi.tpf has changed
Binary file configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/implml/aknskins_101F876F.crml has changed
Binary file configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/implml/aknskins_10282CB2.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/s60/s60_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="confml/aknskins.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/test_pkg/themepackage.pkg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,65 @@
+;
+; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of "Eclipse Public License v1.0"
+; which accompanies this distribution, and is available
+; at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;
+; Initial Contributors:
+; Nokia Corporation - initial contribution.
+;
+; Contributors:
+;
+; Description:
+;
+; File created with SkinCompiler v0.0.82
+;
+;
+; Installation file for themepackage skin
+;
+&EN
+;
+; Package header
+;
+#{"Armi"},(0xA00000EB),1,0,0,TYPE=SP
+;
+; Supports Series 60 v3.x
+; This line indicates that this installation is for the Series 60 platform v3.x
+; This line must appear _exactly_ as shown below in the sis file
+; If this line is missing or incorrect,the sis file will not be able
+; to be installed on Series 60 v3.x platforms
+;
+[0x101f7961],0,0,0,{"Series60v3.0"}
+;
+; Requires Series 60 Skins Support
+;
+(0xA00000EB),0,0,0,{"Series60SkinsSupport"}
+;
+; Requires Series 60 Scalable Skins Support
+;
+(0x10207113),0,0,0,{"Series60ScalableSkinsSupport"}
+;
+; Non-localised vendor name
+;
+:"Unknown Vendor"
+;
+; Localised vendor name
+;
+%{"Vendor-EN"}
+;
+; Files to install
+;
+IF PACKAGE(0X102032BE) ; CHECK FOR S60 3.1 STUB SIS
+"themepackage.mbm" - "!:\resource\skins\99d49b086e6097b8\themepackage.mbm"
+"themepackage.mif" - "!:\resource\skins\99d49b086e6097b8\themepackage.mif"
+ELSE
+"themepackage.mbm" - "!:\private\10207114\import\99d49b086e6097b8\themepackage.mbm"
+"themepackage.mif" - "!:\private\10207114\import\99d49b086e6097b8\themepackage.mif"
+ENDIF
+"themepackage.skn" - "!:\private\10207114\import\99d49b086e6097b8\themepackage.skn"
+;Dummy entry for the possible skin .ini file,so that it gets removed on uninstall
+"" - "!:\private\10207114\import\99d49b086e6097b8\99d49b086e6097b8.ini",FN
+;
+; End of file
+;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/test_pkg/themepackage2.pkg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,71 @@
+;
+; Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+; All rights reserved.
+; This component and the accompanying materials are made available
+; under the terms of "Eclipse Public License v1.0"
+; which accompanies this distribution, and is available
+; at the URL "http://www.eclipse.org/legal/epl-v10.html".
+;
+; Initial Contributors:
+; Nokia Corporation - initial contribution.
+;
+; Contributors:
+;
+; Description:
+;
+; File created with SkinCompiler v0.0.82
+;
+;
+; Installation file for themepackage skin
+;
+&EN
+;
+; Package header
+;
+#{"MyTheme"},(0xA00000EB),1,0,0,TYPE=SP
+;
+; Supports Series 60 v3.x
+; This line indicates that this installation is for the Series 60 platform v3.x
+; This line must appear _exactly_ as shown below in the sis file
+; If this line is missing or incorrect,the sis file will not be able
+; to be installed on Series 60 v3.x platforms
+;
+[0x101f7961],0,0,0,{"Series60v3.0"}
+;
+; Requires Series 60 Skins Support
+;
+(0xA00000EB),0,0,0,{"Series60SkinsSupport"}
+;
+; Requires Series 60 Scalable Skins Support
+;
+(0x10207113),0,0,0,{"Series60ScalableSkinsSupport"}
+;
+; Non-localised vendor name
+;
+:"Unknown Vendor"
+;
+; Localised vendor name
+;
+%{"Vendor-EN"}
+;
+; Files to install
+;
+IF PACKAGE(0X102032BE) ; CHECK FOR S60 3.1 STUB SIS
+"themepackage.mbm" - "!:\resource\skins\f99553e36ea1a92f\themepackage.mbm"
+"themepackage.mif" - "!:\resource\skins\f99553e36ea1a92f\themepackage.mif"
+ELSE
+"themepackage.mbm" - "!:\private\10207114\import\f99553e36ea1a92f\themepackage.mbm"
+"themepackage.mif" - "!:\private\10207114\import\f99553e36ea1a92f\themepackage.mif"
+ENDIF
+"themepackage.skn" - "!:\private\10207114\import\f99553e36ea1a92f\themepackage.skn"
+;Dummy entry for the possible skin .ini file,so that it gets removed on uninstall
+"" - "!:\private\10207114\import\f99553e36ea1a92f\f99553e36ea1a92f.ini",FN
+;
+; Sound files
+;
+"SoundRingingTone.wma" - "!:\private\10207114\import\f99553e36ea1a92f\SoundRingingTone.wma"
+"SoundMessageAlert.wma" - "!:\private\10207114\import\f99553e36ea1a92f\SoundMessageAlert.wma"
+;
+; End of file
+;
+"transparent1.svg" - "!:\Data\Others\transparent1.svg"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+  <confml:data>
+    <confml:CVC_PreinstalledContent>
+      <confml:CVC_BundledApplicationsFolder><confml:localPath>Applications/Bundledkl&#x16f;k</confml:localPath></confml:CVC_BundledApplicationsFolder>
+      <confml:CVC_PreInstalledUDAApplicationsFolder><confml:localPath>Applications/Pre-installed to UDAl&#xa7;l</confml:localPath></confml:CVC_PreInstalledUDAApplicationsFolder>
+    </confml:CVC_PreinstalledContent>
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/content/UI/Themes/Armi.tpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/implml/theme.thememl	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thememl xmlns="http://www.s60.com/xml/thememl/1">
+
+	<!--This path points to the location of the Carbide.UI.-->
+    <carbideuiPath>C:\Program Files\Nokia\Carbide.ui Theme Edition 3.4</carbideuiPath>
+    
+    
+    <!--
+    The value of this setting is directory path where the tpf files are located.
+    This tag can be more than once, if directories with tpf files is more. 
+    -->
+    <themeDir>CVC_PreinstalledContent/CVC_PreInstalledThemesFolder</themeDir>
+    
+    
+    <!-- 
+    This tag activeTheme defines theme which will be active. The tag can be more than once.
+    
+    uid: This attribute is optional. It is hexadecimal number.
+    
+    refSetting: the value of this setting is a path of tpf file which will be active.
+    
+    platformUID: UID or PID number will be set to the value of this setting.
+    If attribute UID is defined then the value of this setting will be value of this attribute 
+    in decimal format. 
+    If the uid number is not defined then PID number is got from pkg file and
+    saved to the value of this setting in decimal format. 
+    Next there is need to perform some modification with this number for reasons that AknSkinDescCompiler
+    from SDK can't work with big integer numbers
+    -->
+    <activeTheme uid="0x101FD60A">
+		<refSetting>CVC_Theme_ref/CVC_DefaultTheme_ref</refSetting>
+    	<platformUID>KCRUidPersonalisation/KPslnActiveSkinUid</platformUID>
+    </activeTheme>
+
+</thememl>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/variant_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="variant_view.confml"/>
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/e75/variant/variant_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,660 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <confml:view id="variant_E75" name="Variant view for E75">
+    <confml:desc>This view combines both S60 platfrom ConfML content and custom modeled ConfMLs in CVC layer</confml:desc>
+    <confml:group name="Applications">
+      <confml:desc>Settings for standard S60 Platform applications</confml:desc>
+      <confml:icon xlink:href="applications_48_nav.png"/>
+      <confml:group name="Browser">
+        <confml:desc>Browser (xHTML) settings</confml:desc>
+        <confml:setting ref="KCRUidBrowser/KWmlBrowserAccessPointSelectionMode"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserConnectionDialogs"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserDefaultAccessPoint"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserFormDataSaving"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGImagesEnabled"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGFontSize"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGEncoding"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGAdaptiveBookmarks"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGFullScreen"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGCookiesEnabled"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGECMAScriptSupport"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGShowSecurityWarnings"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGPageOverview"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGPopupBlocking"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGHomepageType"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGHomepageURL"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGBackList"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGAutoRefresh"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGAutomaticUpdating"/>
+        <confml:setting ref="KCRUidBrowser/KBrowserNGDefaultSnapId"/>
+        <confml:setting ref="KCRUidBrowser1/KBrowserNGAutomaticUpdatingAccessPoint"/>
+        <confml:setting ref="KCRUidBrowser1/KBrowserNGOpenDownloads"/>
+        <confml:setting ref="KCRUidBrowser1/KBrowserNGSmartLink"/>
+      </confml:group>
+      <confml:group name="Calendar">
+        <confml:desc>Calendar</confml:desc>
+      </confml:group>
+      <confml:group name="Device Manager">
+        <confml:desc>Settings for Device Manager application.</confml:desc>
+        <confml:setting ref="factorydmprofile/DMFactorySettings"/>
+      </confml:group>
+      <confml:group name="Media Player">
+        <confml:desc>Media Player</confml:desc>
+        <confml:setting ref="MediaPlayerSettings/AutoDisconnectedTime"/>
+        <confml:setting ref="MediaPlayerFeatureSettings/Bitmask_bit4"/>
+      </confml:group>
+      <confml:group name="Voice Recorder">
+        <confml:desc>Voice Recorder</confml:desc>
+      </confml:group>
+      <confml:group name="Phonebook">
+        <confml:desc>Phonebook</confml:desc>
+      </confml:group>
+      <confml:group name="Logs">
+        <confml:desc>Logs</confml:desc>
+      </confml:group>
+      <confml:group name="Camcorder">
+        <confml:desc>Camcorder</confml:desc>
+      </confml:group>
+      <confml:group name="Clock">
+        <confml:desc>Clock</confml:desc>
+        <confml:setting ref="ClockAppSettings/NetworkOperatorTime"/>
+      </confml:group>
+      <confml:group name="Positioning">
+        <confml:desc>Positioning</confml:desc>
+        <confml:setting ref="KCRUidSuplSettings/KSuplSettingsHSLPAddress"/>
+        <confml:setting ref="KCRUidSuplSettings/KSuplSettingsIAP"/>
+      </confml:group>
+      <confml:group name="Instant Messaging">
+        <confml:desc>Instant Messaging</confml:desc>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMServerName"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMAccessPointInUse"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMWebAddress"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMUserID"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMPassword"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMPresence"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMAllowMessagesFrom"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMMessageScrollingSpeed"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMSortContacts"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMAvailabilityReloading"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMOfflineContacts"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMShowDateTimeInfo"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMAlertTone"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMDefaultServer"/>
+        <confml:setting ref="CVC_InstantMessaging/CVC_IMLoginType"/>
+      </confml:group>
+      <confml:group name="Profiles: General">
+        <confml:desc>Settings for General Profile</confml:desc>
+        <confml:setting ref="Generalprofilesettings/RingingType"/>
+        <confml:setting ref="Generalprofilesettings/KeypadVolume"/>
+        <confml:setting ref="Generalprofilesettings/RingingVolume"/>
+        <confml:setting ref="Generalprofilesettings/VibratingAlert"/>
+        <confml:setting ref="Generalprofilesettings/WarningAndGameTones"/>
+      </confml:group>
+      <confml:group name="Profiles: Silent">
+        <confml:desc>Settings for Silent Profile</confml:desc>
+        <confml:setting ref="Silentprofilesettings/VibratingAlert"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Connectivity">
+      <confml:desc>Settings for personal communication and connection methods</confml:desc>
+      <confml:icon xlink:href="connectivity_48_nav.png"/>
+      <confml:group name="Access Points">
+        <confml:desc>Nokia NXX has StartUp Settings application. It configures access point settings based on a SIM card�s MCC and MNC and the access point information supplied to Nokia by the network operators.</confml:desc>
+        <confml:setting ref="WLAN_APs/WLAN_AP"/>
+        <confml:setting ref="DNs/DN"/>
+        <confml:setting ref="APs/AP"/>
+      </confml:group>
+      <confml:group name="MMS">
+        <confml:desc>If the Customer specifies MMS settings (including Access points) in their variant then the transceiver will be able to receive MMS messages straight away after having been powered-up.</confml:desc>
+        <confml:setting ref="MMSEngineSettings/FirstAccessPoint"/>
+        <confml:setting ref="MMSEngineSettings/AllowAdvertisement"/>
+        <confml:setting ref="MMSEngineSettings/AllowAnonymousMessages"/>
+        <confml:setting ref="MMSEngineSettings/DeliveryReport"/>
+        <confml:setting ref="MMSEngineSettings/SendDeliveryReport"/>
+        <confml:setting ref="MMSEngineSettings/ValidityPeriod"/>
+        <confml:setting ref="CVC_MMS/CVC_MMSReceivedMessageSize"/>
+        <confml:setting ref="CVC_MMS/CVC_MMSSentMessageSize"/>
+        <confml:setting ref="CVC_MMS/CVC_MMSImageSize"/>
+        <confml:setting ref="MMSEngineSettings/CreationMode"/>
+        <confml:setting ref="MMSEngineSettings/ReceivingModeInRoaming"/>
+        <confml:setting ref="MMSEngineSettings/ReceivingModeInHome"/>
+      </confml:group>
+      <confml:group name="SMS">
+        <confml:desc>SMS Settings</confml:desc>
+        <confml:setting ref="SMSUI/DeliveryReportRequest"/>
+        <confml:setting ref="SMSUI/MessageComversion"/>
+        <confml:setting ref="SMSUI/SMSBearer"/>
+        <confml:setting ref="SMSUI/RequestReplyViaSameSMSC"/>
+        <confml:setting ref="SMSUI/SMSResendingPeriod"/>
+        <confml:setting ref="SMSUI/CharacterSupport"/>
+      </confml:group>
+      <confml:group name="Postcard">
+        <confml:desc>Postcard settings</confml:desc>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit1"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit2"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit3"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit4"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit5"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit6"/>
+        <confml:setting ref="KCRUidPostcard1/KPocaKeyMandatoryFields_bit7"/>
+        <confml:setting ref="Postcard/ServiceProvider"/>
+        <confml:setting ref="Postcard/GreetingTextLength"/>
+        <confml:setting ref="Postcard/NameLength"/>
+        <confml:setting ref="Postcard/InfoLength"/>
+        <confml:setting ref="Postcard/StreetLength"/>
+        <confml:setting ref="Postcard/ZipLength"/>
+        <confml:setting ref="Postcard/CityLength"/>
+        <confml:setting ref="Postcard/StateLength"/>
+        <confml:setting ref="Postcard/CountryLength"/>
+        <confml:setting ref="Postcard/ServiceSpecialFormat"/>
+        <confml:setting ref="Postcard/ServiceSeparator"/>
+      </confml:group>
+      <confml:group name="E-mail">
+        <confml:desc>Customers may choose to define one set of common settings for the e-mail client in the Messaging application of the device.</confml:desc>
+        <confml:setting ref="Mailbox2/APOPSupport"/>
+        <confml:setting ref="Mailbox2/CopyToOwn"/>
+        <confml:setting ref="Mailbox2/FetchAttachment"/>
+        <confml:setting ref="Mailbox2/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox2/AccessPointID"/>
+        <confml:setting ref="Mailbox2/MailboxName"/>
+        <confml:setting ref="Mailbox2/Address"/>
+        <confml:setting ref="Mailbox2/Protocol"/>
+        <confml:setting ref="Mailbox2/SendingScheduler"/>
+        <confml:setting ref="Mailbox2/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox2/Security"/>
+        <confml:setting ref="Mailbox2/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox2/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox2/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox2/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox2/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox2/PortIncomingServer"/>
+        <confml:setting ref="Mailbox2/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox2/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox2/PortOutgoingServer"/>
+        <confml:setting ref="Mailbox1/APOPSupport"/>
+        <confml:setting ref="Mailbox1/CopyToOwn"/>
+        <confml:setting ref="Mailbox1/FetchAttachment"/>
+        <confml:setting ref="Mailbox1/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox1/AccessPointID"/>
+        <confml:setting ref="Mailbox1/MailboxName"/>
+        <confml:setting ref="Mailbox1/Address"/>
+        <confml:setting ref="Mailbox1/Protocol"/>
+        <confml:setting ref="Mailbox1/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox1/Security"/>
+        <confml:setting ref="Mailbox1/SendingScheduler"/>
+        <confml:setting ref="Mailbox1/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox1/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox1/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox1/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox1/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox1/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox1/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox1/PortIncomingServer"/>
+        <confml:setting ref="Mailbox1/PortOutgoingServer"/>
+        <confml:setting ref="Mailbox3/APOPSupport"/>
+        <confml:setting ref="Mailbox3/CopyToOwn"/>
+        <confml:setting ref="Mailbox3/FetchAttachment"/>
+        <confml:setting ref="Mailbox3/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox3/AccessPointID"/>
+        <confml:setting ref="Mailbox3/MailboxName"/>
+        <confml:setting ref="Mailbox3/Address"/>
+        <confml:setting ref="Mailbox3/Protocol"/>
+        <confml:setting ref="Mailbox3/SendingScheduler"/>
+        <confml:setting ref="Mailbox3/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox3/Security"/>
+        <confml:setting ref="Mailbox3/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox3/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox3/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox3/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox3/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox3/PortIncomingServer"/>
+        <confml:setting ref="Mailbox3/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox3/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox3/PortOutgoingServer"/>
+        <confml:setting ref="Mailbox4/APOPSupport"/>
+        <confml:setting ref="Mailbox4/CopyToOwn"/>
+        <confml:setting ref="Mailbox4/FetchAttachment"/>
+        <confml:setting ref="Mailbox4/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox4/AccessPointID"/>
+        <confml:setting ref="Mailbox4/MailboxName"/>
+        <confml:setting ref="Mailbox4/Address"/>
+        <confml:setting ref="Mailbox4/Protocol"/>
+        <confml:setting ref="Mailbox4/SendingScheduler"/>
+        <confml:setting ref="Mailbox4/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox4/Security"/>
+        <confml:setting ref="Mailbox4/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox4/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox4/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox4/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox4/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox4/PortIncomingServer"/>
+        <confml:setting ref="Mailbox4/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox4/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox4/PortOutgoingServer"/>
+        <confml:setting ref="Mailbox5/APOPSupport"/>
+        <confml:setting ref="Mailbox5/CopyToOwn"/>
+        <confml:setting ref="Mailbox5/FetchAttachment"/>
+        <confml:setting ref="Mailbox5/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox5/AccessPointID"/>
+        <confml:setting ref="Mailbox5/MailboxName"/>
+        <confml:setting ref="Mailbox5/Address"/>
+        <confml:setting ref="Mailbox5/Protocol"/>
+        <confml:setting ref="Mailbox5/SendingScheduler"/>
+        <confml:setting ref="Mailbox5/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox5/Security"/>
+        <confml:setting ref="Mailbox5/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox5/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox5/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox5/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox5/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox5/PortIncomingServer"/>
+        <confml:setting ref="Mailbox5/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox5/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox5/PortOutgoingServer"/>
+        <confml:setting ref="Mailbox6/APOPSupport"/>
+        <confml:setting ref="Mailbox6/CopyToOwn"/>
+        <confml:setting ref="Mailbox6/FetchAttachment"/>
+        <confml:setting ref="Mailbox6/FetchHeadersNumber"/>
+        <confml:setting ref="Mailbox6/AccessPointID"/>
+        <confml:setting ref="Mailbox6/MailboxName"/>
+        <confml:setting ref="Mailbox6/Address"/>
+        <confml:setting ref="Mailbox6/Protocol"/>
+        <confml:setting ref="Mailbox6/SendingScheduler"/>
+        <confml:setting ref="Mailbox6/IncomingMailServerAddress"/>
+        <confml:setting ref="Mailbox6/Security"/>
+        <confml:setting ref="Mailbox6/OutgoingMailServerAddress"/>
+        <confml:setting ref="Mailbox6/KImumSmtpSecurity"/>
+        <confml:setting ref="Mailbox6/KImumOmaEmnEnabled"/>
+        <confml:setting ref="Mailbox6/UNameIncomingServer"/>
+        <confml:setting ref="Mailbox6/PasswordIncomingServer"/>
+        <confml:setting ref="Mailbox6/PortIncomingServer"/>
+        <confml:setting ref="Mailbox6/UNameOutgoingServer"/>
+        <confml:setting ref="Mailbox6/PasswordOutgoingServer"/>
+        <confml:setting ref="Mailbox6/PortOutgoingServer"/>
+      </confml:group>
+      <confml:group name="Messaging">
+        <confml:desc>Messaging</confml:desc>
+        <confml:setting ref="Bitmasks/SMSUIFlags_bit5"/>
+        <confml:setting ref="Bitmasks/SMSUIFlags_bit6"/>
+        <confml:setting ref="CommonMessagingUI/NumberOfMsgInSentItem"/>
+        <confml:setting ref="CommonMessagingUI/SaveSentMessages"/>
+      </confml:group>
+      <confml:group name="Bluetooth">
+        <confml:desc>Bluetooth</confml:desc>
+        <confml:setting ref="KCRUidBluetoothLocalDeviceAddress/KBTLocalDeviceAddress"/>
+      </confml:group>
+      <confml:group name="Streaming">
+        <confml:desc>Streaming</confml:desc>
+        <confml:setting ref="CVC_streaming/CVC_streamingUseProxy"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingProxyServerAddress"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingProxyPortNumber"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingAccessPoint"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingOnlineTime"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingOnlineTimeValue"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingLowestUDPPort"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingHighestUDPPort"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingGPRSBandwidth"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingGPRSBandwidthValue"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingEGPRSBandwidth"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingEGPRSBandwidthValue"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingUMTSBandwidth"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingUMTSBandwidthValue"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingWLANBandwidth"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingWLANBandwidthValue"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingHSDPABandwidth"/>
+        <confml:setting ref="CVC_streaming/CVC_streamingHSDPABandwidthValue"/>
+      </confml:group>
+      <confml:group name="Mobile TV">
+        <confml:desc>Mobile TV</confml:desc>
+      </confml:group>
+      <confml:group name="Voice and Video Mail">
+        <confml:desc>Settings for voice and video mailboxes</confml:desc>
+        <confml:setting ref="KCRUidVoiceMailbox/KVmbxNumberLineAuxiliary"/>
+        <confml:setting ref="KCRUidVoiceMailbox/KVmbxNumberLinePrimary"/>
+        <confml:setting ref="KCRUidVoiceMailbox/KVmUsesSimMemory"/>
+        <confml:setting ref="KCRUidVoiceMailbox/KVideoMbxSupport"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="System">
+      <confml:desc>System settings of S60 platform</confml:desc>
+      <confml:icon xlink:href="system_48_nav.png"/>
+      <confml:group name="Accessory Profiles">
+        <confml:desc>Accessory Profiles</confml:desc>
+      </confml:group>
+      <confml:group name="SyncML">
+        <confml:desc>SyncML</confml:desc>
+        <confml:setting ref="CVC_SyncML/CVC_SMLSyncProfileName"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLServerVersion"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLServerID"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLDataBearer"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLAccessPoint"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLHostAddress"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLPort"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLUserName"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLPassword"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLAllowSyncRequests"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLNetworkUserName"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLNetworkPassword"/>
+        <confml:setting ref="CVC_SyncML/CVC_SMLSyncronisationType"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLContacts"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLCalendar"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLNotes"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLSyncEmail"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLMusicMetadata"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLMSyncService"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLImage"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLMMS"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLVideo"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLSMS"/>
+        <confml:setting ref="CVC_SyncMLDataSync/CVC_SyncMLBookmarks"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLDataSyncRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLCalendarRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLNotesRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLSyncEmailRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLMusicMetadataRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLMSyncServiceRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLImageRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLMMSRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLVideoRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLSMSRemoteDatabase"/>
+        <confml:setting ref="CVC_SyncMLDataSyncRemoteDatabases/CVC_SyncMLBookmarksRemoteDatabase"/>
+      </confml:group>
+      <confml:group name="Light Sensor">
+        <confml:desc>Light Senso</confml:desc>
+      </confml:group>
+      <confml:group name="Java">
+        <confml:desc>Java Application Settings</confml:desc>
+      </confml:group>
+      <confml:group name="Other">
+        <confml:desc>Other</confml:desc>
+        <confml:setting ref="CVC_CellInfoDisplay/CVC_CellInfoDisplay"/>
+        <confml:setting ref="CVC_ZeroPlusSend/CVC_ZeroPlusSend"/>
+        <confml:setting ref="CVC_2DigitDialing/CVC_2DigitDialing"/>
+        <confml:setting ref="CVC_CPHSALS/CVC_CPHSALS"/>
+      </confml:group>
+      <confml:group name="Telephony">
+        <confml:desc>Telephony</confml:desc>
+        <confml:setting ref="CommonTelephony/SummaryAfterCall"/>
+        <confml:setting ref="CallSettings/AnyKeyAnswer"/>
+        <confml:setting ref="CallSettings/AutomaticRedial"/>
+        <confml:setting ref="CallSettings/OneKeyDialling"/>
+        <confml:setting ref="CallSettings/DialPrefixChangeMode"/>
+        <confml:setting ref="CallSettings/DialPrefixText"/>
+        <confml:setting ref="CallSettings/SoftReject"/>
+        <confml:setting ref="CallSettings/StillImageForVideoCalls"/>
+        <confml:setting ref="KCRUidTelConfiguration/KTelMatchDigits"/>
+        <confml:setting ref="KCRUidTelVariation/DefaultEmergencyNumbers"/>
+        <confml:setting ref="KCRUidTelVariation/KTelephonyLVFlagUssdTone"/>
+        <confml:setting ref="KCRUidTelVariation/KTelephonyLVFlagMannerMode"/>
+        <confml:setting ref="KCRUidTelVariation/KTelephonyLVFlagUUS"/>
+        <confml:setting ref="NumberGroupingSettings/NumberGrouping"/>
+      </confml:group>
+      <confml:group name="FOTA">
+        <confml:desc>Firmware update Over The Air</confml:desc>
+      </confml:group>
+      <confml:group name="Keyguard">
+        <confml:desc>Keypad lock settings</confml:desc>
+      </confml:group>
+      <confml:group name="Service Messages">
+        <confml:desc>Service Messages</confml:desc>
+      </confml:group>
+      <confml:group name="Vibra">
+        <confml:desc>Vibra</confml:desc>
+      </confml:group>
+      <confml:group name="Software Install">
+        <confml:desc>Software Install</confml:desc>
+        <confml:setting ref="SWInstallerUISettings/PolicyForOnlineCertificate"/>
+        <confml:setting ref="SWInstallerUISettings/URLToOCSPServer"/>
+        <confml:setting ref="SWInstallerUISettings/SoftwareInstallation"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="UI">
+      <confml:desc>Settings for branding, user interface and look &amp; feel</confml:desc>
+      <confml:icon xlink:href="userinterface_48_nav.png"/>
+      <confml:group name="Customer Menu">
+        <confml:desc>Often referred to as the Operator Menu, the Customer Menu is an application that launches the browser as an embedded application with a predefined URL as parameter.</confml:desc>
+        <confml:setting ref="OperatorMenuSettings/DefaultAccessPoint"/>
+        <confml:setting ref="CacheManagerSettings/OperatorDomainURL"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_OperatorMenuIconFile"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_OperatorMenuIconMaskFile"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_OperatorMenuIconCaption"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_OperatorMenuURL"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_OperatorMenuCache"/>
+        <confml:setting ref="CVC_OperatorMenu/CVC_AppShellOperatorMenuCacheExpireDate"/>
+      </confml:group>
+      <confml:group name="Customer Logo">
+        <confml:desc>The Nokia NXX supports colour logos in addition to the traditional black and white Customer logos.</confml:desc>
+        <confml:setting ref="CVC_OperatorLogo/CVC_OperatorMCC"/>
+        <confml:setting ref="CVC_OperatorLogo/CVC_OperatorMNC"/>
+        <confml:setting ref="CVC_OperatorLogo/CVC_OperatorLogoPath"/>
+      </confml:group>
+      <confml:group name="Ring Tones">
+        <confml:desc>Nokia NXX supports the following types of ring tones and alert tones. The Customer may select to include tones of their own in any of the listed formats. The Customer can specify one as the default ringing tone in the General profile.</confml:desc>
+      </confml:group>
+      <confml:group name="Start-up and shutdown animations">
+        <confml:desc>Start-up and shutdown animations</confml:desc>
+        <confml:setting ref="CVC_ShutdownAnimationSequence/CVC_ShutdownAnimationDuration"/>
+        <confml:setting ref="CVC_ShutdownAnimationSequence/CVC_ShutdownAnimationTone"/>
+        <confml:setting ref="CVC_ShutdownAnimationSequence/CVC_ShutdownFrameLocation"/>
+        <confml:setting ref="CVC_StartupAnimationSequence/CVC_StartupAnimationDuration"/>
+        <confml:setting ref="CVC_StartupAnimationSequence/CVC_StartupAnimationTone"/>
+        <confml:setting ref="CVC_StartupAnimationSequence/CVC_StartupFrameLocation"/>
+      </confml:group>
+      <confml:group name="Application Menu">
+        <confml:desc>Application Menu</confml:desc>
+      </confml:group>
+      <confml:group name="Themes">
+        <confml:desc>Themes</confml:desc>
+        <confml:setting ref="CVC_Theme_ref/CVC_DefaultTheme_ref"/>
+      </confml:group>
+      <confml:group name="General">
+        <confml:desc>General</confml:desc>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfPortraitScalePriority"/>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfPortraitMaxCropFactor"/>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfPortaitMaxStretchFactor"/>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfLandscapeScalePriority"/>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfLandscapeMaxCropFactor"/>
+        <confml:setting ref="KCRUidWallpaperConfiguration/KWpConfLandscapeMaxStretchFactor"/>
+        <confml:setting ref="PeripheralSettings/DisplayLightTimeout"/>
+        <confml:setting ref="ScreensaverAnimation/FilePath"/>
+        <confml:setting ref="ScreensaverAnimation/AnimationTimeout"/>
+        <confml:setting ref="ScreensaverAnimation/LightsTimeout"/>
+        <confml:setting ref="ScreensaverSettings/PluginImplementationUID"/>
+        <confml:setting ref="ScreensaverSettings/Object"/>
+        <confml:setting ref="ScreensaverSettings/KScreenSaverText"/>
+        <confml:setting ref="KCRUidActiveIdle2/UNKNOWN0"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAiStatusPaneLayout"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAiMainUIControllerKey"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIFirstKeyLockKey"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISecondKeyLockKey"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISecondKeyLockKey2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIKeyLockTimeout"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIVoiceDialLaunchKey"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIVoiceDialKeyTimeout"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISPNAndEONS"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIVHZInMainpane"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIExternalStatusScreen"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAINTInTheme"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName1"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId1"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue1"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName3"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId3"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue3"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName4"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId4"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue4"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName5"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId5"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue5"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName6"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId6"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue6"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName7"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId7"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue7"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName8"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId8"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue8"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName9"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId9"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue9"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName10"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId10"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue10"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName11"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId11"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue11"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName12"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId12"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue12"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName13"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId13"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue13"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName14"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId14"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue14"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsPluginName15"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsId15"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIPluginSettingsValue15"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISettingsExtraURLShortcut1"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISettingsExtraURLShortcut2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAISettingsExtraURLShortcut3"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup1"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup2"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup3"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup4"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup5"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup6"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup7"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackup8"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupNaviLeft"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupNaviRight"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupNaviUp"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupNaviDown"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupNaviKey"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupLSK"/>
+        <confml:setting ref="KCRUidActiveIdle2/KAIShortcutBackupRSK"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnActiveSkinLocation"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnActiveSkinUid"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnFavouritesBackgroundImagePath"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnIdleBackgroundImagePath"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnDefaultSkinUid"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnSystemDefaultScreenSaver"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnColorPalette"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnAvailableColorPalettes"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnHighlightAnimationEnalbled"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnFullScreenWallpaperEnabled"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnWallpaperType"/>
+        <confml:setting ref="KCRUidPersonalisation/KPslnDefaultSkin"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsBackgroundImage"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsBackgroundImagePath"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsDisplayOperatorLogo"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsShowOperatorLogoSetting"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsWelcomeNoteSupported"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsActiveIdleState"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsConfirmSatOperationsSupported"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsScreenSaverPeriod"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsConfirmSatOperations"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsDisplayTurnoffTimeout"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsOperatorActiveIdle"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsWritingSpeed"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsPenWidth"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsPenColor"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsDefaultVkbPrc"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsDefaultVkbTw"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsDefaultVkbHk"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsPenInputLang"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsHearingAidMode"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsPenInputGuideLine"/>
+        <confml:setting ref="KCRUidPersonalizationSettings/KSettingsOperatorVariantActiveIdleText"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKCustomization"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKText"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKImage"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKImageBMPMask"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKTargetURL"/>
+        <confml:setting ref="CVC_RSK/CVC_ActiveIdleRSKTargetAppUID"/>
+        <confml:setting ref="CVC_Wallpaper/CVC_WallpaperFile"/>
+        <confml:setting ref="CVC_Screensaver/CVC_ScreensaverFile"/>
+        <confml:setting ref="CVC_Screensaver/CVC_AnimationTimeout"/>
+        <confml:setting ref="CVC_Screensaver/CVC_LightsTimeout"/>
+      </confml:group>
+      <confml:group name="Nokia PC Internet Access">
+        <confml:desc>Nokia PC Internet Access a.k.a. Phone a modem</confml:desc>
+        <confml:setting ref="CVC_NokiaPCInternetAccess/CVC_NokiaPCInternetAccessFile"/>
+        <confml:setting ref="CVC_NokiaPCInternetAccess/CVC_NokiaPCInternetAccessURL"/>
+        <confml:setting ref="CVC_NokiaPCInternetAccess/CVC_NokiaPCInternetAccessCustomerCareInfo"/>
+      </confml:group>
+      <confml:group name="Homescreen">
+        <confml:desc>Homescreen or Active Idle customizations</confml:desc>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersEmail"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersCalendar"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersMusicPlayer"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersVisualRadio"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersWLAN"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersEmailSettingsWizard"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersInternetCallSetup"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersMobileSearch"/>
+        <confml:setting ref="CVC_ActiveIdleNotifiers/CVC_ActiveIdleNotifiersSIMApplicationToolkit"/>
+        <confml:setting ref="CVC_ActiveIdleOther/CVC_ActiveIdleEasyDialing"/>
+      </confml:group>
+    </confml:group>
+    <confml:group name="Pre-Installed Content">
+      <confml:desc>Applications, music, video and other files preinstalled to device</confml:desc>
+      <confml:icon xlink:href="preinstalledcontent_48_nav.png"/>
+      <confml:group name="Customer Applications">
+        <confml:desc>Customer specific Symbian and Java applications can be pre-installed to device memory (UDA).</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMCApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledUDAApplicationsFolder"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_BundledApplicationsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded MMS">
+        <confml:desc>Maximum amount of 3 Customer specific MMS messages may be pre-installed in the Device memory.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMMSs"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Video">
+        <confml:desc>Customer specific video clips may be pre-installed in the User Data Area or Memory card. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledVideoClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Music">
+        <confml:desc>Customer can pre-load Music content in the User Data Area and/or memory card. They will be seen in Nseries Music Player. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledMusicClipsFolder"/>
+      </confml:group>
+      <confml:group name="Pre-loaded Images">
+        <confml:desc>Customer can pre-load images in the User Data Area and/or memory card. They will be seen in Photos application. The end user is able to delete them.</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledImagesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-installed Ringtones">
+        <confml:desc>Pre-installed ringtones</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultMessageToneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultRingtoneFile"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_DefaultVideoCallToneFile"/>
+      </confml:group>
+      <confml:group name="Pre-installed Certificates">
+        <confml:desc>Pre-installed security certificates (X.509)</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesInternet"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesMIDP"/>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_CertificatesSymbian"/>
+      </confml:group>
+      <confml:group name="Pre-installed Themes">
+        <confml:desc>Pre-installed Themes</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledThemesFolder"/>
+      </confml:group>
+      <confml:group name="Pre-defined Streaming Links">
+        <confml:desc>Pre-defined Streaming Links</confml:desc>
+        <confml:setting ref="CVC_PreinstalledContent/CVC_PreInstalledStreamingLinksFolder"/>
+      </confml:group>
+      <confml:group name="Pre-defined Bookmarks">
+        <confml:desc>Pre-defined Bookmarks</confml:desc>
+        <confml:setting ref="BookmarkItems/BookmarkItem"/>
+      </confml:group>
+      <confml:group name="Pre-defined Contacts">
+        <confml:desc>Pre-defined Contacts</confml:desc>
+        <confml:setting ref="Contacts/Contact"/>
+      </confml:group>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_container.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__    
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from themeplugin import theme_function
+from themeplugin.theme_container import ThemeContainer
+from cone.storage.filestorage import FileStorage
+
+from unittest_theme_plugin import impl_from_resource
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestThemePlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+  
+  
+    def test_create_themes(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"e75")))
+        config = project.get_configuration("root_variant.confml")
+        impl = impl_from_resource("variant/implml/theme.thememl", config);
+        list_tpf = impl.list_tpf_files(impl.list_active_theme, impl.list_theme_dir)
+        
+        list_theme=[]
+        container = ThemeContainer(list_tpf,impl.configuration)
+        container.create_themes()
+        self.assertEquals(len(container.list_theme),2)
+        container.removeTempDirs() 
+
+    def test_prepare_active_themes(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"e75")))
+        config = project.get_configuration("root_variant.confml")
+        impl = impl_from_resource("variant/implml/theme.thememl", config);
+        list_tpf = impl.list_tpf_files(impl.list_active_theme, impl.list_theme_dir)
+        container = ThemeContainer(list_tpf,impl.configuration)
+        container.create_themes()
+        
+        def get_theme(lst, tpf_path):
+            for theme in lst:
+                if theme.tpf_path == tpf_path:
+                    return theme
+            self.fail("Theme with tpf_path = %r not found!" % tpf_path)
+        
+        self.assertEquals(len(container.list_theme), 2)
+        theme = get_theme(container.list_theme, 'variant/content/UI/Themes/Armi.tpf')
+        self.assertEquals(theme.get_setting_uids(),[])
+        self.assertEquals(theme.get_uid(), None)
+        
+        container.prepare_active_themes(impl.list_active_theme)
+        theme = get_theme(container.list_theme, 's60/content/UI/Armi2.tpf')
+        self.assertEquals(theme.get_setting_uids(), ["KCRUidPersonalisation.KPslnActiveSkinUid"])
+        self.assertEquals(theme.get_uid(), "0x101FD60A")
+
+         
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_function.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__    
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from themeplugin import maketheme
+from themeplugin import theme_function
+from cone.storage.filestorage import FileStorage
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestThemePlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+        
+    def test_convert_hexa_to_decimal(self):
+       decimal = theme_function.convert_hexa_to_decimal("a5d5f19d6e6097b8")
+       self.assertEquals(decimal,"-1512705635 1851824056")
+       
+    def test_find_text_in_string(self):
+        row_in_pkg_file = "\"themepackage.mbm\" - \"!:\\resource\\skins\\99d49b086e6097b8\\themepackage.mbm\""
+        start_text = "!:\\resource\\skins\\"
+        end_text = "\\"
+
+        PID_number = theme_function.find_text_in_string(row_in_pkg_file,start_text, end_text)
+        self.assertEquals(PID_number,"99d49b086e6097b8")
+        
+    def test_find_text_in_file(self):
+        start_text = "!:\\resource\\skins\\"
+        end_text = "\\"
+        PID = theme_function.find_text_in_file(os.path.join(ROOT_PATH,"e75\\test_pkg\\themepackage.pkg"),start_text, end_text)
+        self.assertEquals(PID,"99d49b086e6097b8")
+
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_plugin.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__	
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from themeplugin import maketheme
+from themeplugin import theme_function
+from cone.storage.filestorage import FileStorage
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+def impl_from_resource(resource_ref, configuration):
+    doc_root = plugin.ReaderBase._read_xml_doc_from_resource(resource_ref, configuration)
+    return maketheme.ThemeImplReader.read_impl(resource_ref, configuration, doc_root)
+
+class TestThemePlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+        
+    def test_list_tpf_files(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"e75")))
+        config = project.get_configuration("root_variant.confml")
+        impl = impl_from_resource("variant/implml/theme.thememl", config);
+        t1 = impl.list_theme_dir
+        t2 = impl.list_active_theme
+        list_tpf_files = impl.list_tpf_files(impl.list_active_theme,impl.list_theme_dir)
+        self.assertEquals(sorted(list_tpf_files),
+                          sorted(['variant/content/UI/Themes/Armi.tpf', 's60/content/UI/Armi2.tpf']))
+        
+    def test_find_tpf_files(self):
+        project = api.Project(api.Storage.open(os.path.join(ROOT_PATH,"e75")))
+        config = project.get_configuration("root_variant.confml")
+        impl = impl_from_resource("variant/implml/theme.thememl", config) 
+        tpf_paths = []
+        tpf_paths.append("UI/Themes")
+        list_tpf_files = impl.find_tpf_files(tpf_paths)
+        # The found TPF should be the one under variant/ not s60/
+        self.assertEquals(list_tpf_files, ['variant/content/UI/Themes/Armi.tpf'])
+        
+        tpf_paths = []
+        tpf_paths.append("UI")
+        list_tpf_files = impl.find_tpf_files(tpf_paths)
+        self.assertEquals(list_tpf_files, ['s60/content/UI/Armi2.tpf'])
+        
+        tpf_paths = []
+        tpf_paths.append("UI")
+        tpf_paths.append("UI/Themes")
+        list_tpf_files = impl.find_tpf_files(tpf_paths)
+        self.assertEquals(sorted(list_tpf_files), sorted(['variant/content/UI/Themes/Armi.tpf', 's60/content/UI/Armi2.tpf']))
+
+         
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/tests/unittest_theme_resource.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, shutil
+
+import __init__    
+from cone.public import exceptions,plugin,api
+from cone.storage import filestorage
+from cone.confml import implml
+from themeplugin import theme_resource
+from cone.storage.filestorage import FileStorage
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestThemePlugin(unittest.TestCase):    
+    def setUp(self):
+        self.curdir = os.getcwd()
+        self.output = 'output'
+        pass
+
+    def tearDown(self):
+        pass
+    
+    def test_modify_resource_path(self):
+        resource = theme_resource.ThemeResource()
+        path = resource.modify_resource_path("!:\\private\\10207114\\import\\f99553e36ea1a92f\\themepackage.mbm")
+        self.assertEquals(path,"private\\10207114\\import\\f99553e36ea1a92f")
+
+    def test_parse_pkg_file(self):
+        resource = theme_resource.ThemeResource()
+        resource.parse_pkg_file(os.path.join(ROOT_PATH,"e75\\test_pkg\\themepackage2.pkg"))
+        if len(resource.list_resource) > 0:
+            filename = resource.list_resource[0].get_filename()
+            self.assertEquals(filename,"themepackage.mbm")
+            path = resource.list_resource[0].get_path()
+            self.assertEquals(path,"private\\10207114\\import\\f99553e36ea1a92f")
+        else:
+            self.assertFalse()
+
+        
+if __name__ == '__main__':
+  unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_container.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,275 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import unzip
+import shutil
+import logging
+from themeplugin import theme_function
+from theme_resource import ThemeResource
+from cone.storage import filestorage
+from cone.public import plugin
+
+class ThemeContainer:
+    """
+    This class provides extracts *.tpf files, convertts to *.mbm,*.pkg, ... files and set UID(PID)
+    to the setting values in the model 
+    """
+    
+    def __init__(self, list_tpf, configuration):
+        self.list_tpf=list_tpf
+        self.configuration=configuration
+        self.list_theme=[]
+        self.logger = logging.getLogger('cone.thememl')
+        self.carbide = None
+
+    def create_themes(self):
+        """
+        extractes tpf file to the temporary directory and creates Theme objects
+        """
+
+        for tpf in self.list_tpf:
+            logging.getLogger('cone.thememl').info("Creating temp folder for %s" % tpf)
+            theme = Theme()
+            theme.set_tpf_path(tpf)
+            
+            temp_tdf = os.tempnam("Theme")
+            os.mkdir(temp_tdf)
+            temp_theme = os.path.join(temp_tdf,"__temp__")
+            os.mkdir(temp_theme)
+            theme.set_temp_theme(temp_theme)
+            theme.set_temp_tdf(temp_tdf)
+
+            self.list_theme.append(theme)
+        
+
+        
+    def build_theme(self, theme_version):
+        """
+        converts *.tpf files to *.mbm, *.skn, ...
+        """
+        for theme in self.list_theme:
+            self.make_theme(theme, theme_version)
+
+            
+    def prepare_active_themes(self,list_active_theme):
+        """
+        goes through the active themes and sets theme in the list of all themes as active {set the name and
+        the uid number of the platform setting}
+        """
+        default_view = self.configuration.get_default_view()
+        for active_theme in list_active_theme:
+            if active_theme.get_setting_ref():
+                path=active_theme.get_setting_ref().replace("/",".")
+                setting = default_view.get_feature(path+".localPath").get_data()
+                if setting != None and setting.get_value():
+                    setting_value = setting.get_value()
+                    self.set_settinguid_to_theme(active_theme,setting_value)
+
+    def set_settinguid_to_theme(self,active_theme, path):
+        """
+        finds out the active theme and set the name and the uid of the platform setting
+        """
+        path = "/content/"+path
+        for theme in self.list_theme:
+            tpf_path = theme.get_tpf_path()
+            
+            if tpf_path.endswith(path):
+                 for setting_uid in active_theme.get_setting_uids():
+                    setting_uid_value = setting_uid.replace("/",".")
+                    theme.set_setting_uids(setting_uid_value)
+                    theme.set_uid(active_theme.get_uid())
+                    
+    def set_active_PID_to_model(self):
+        """
+        finds active theme, gets PID from pkg file, convert PID from hexadecimal to decimal formal
+        and set decimal PID to the aknskins setting in the model
+        """
+        l = len (self.list_theme)
+
+        
+        
+        for theme in self.list_theme:
+            
+            # Make sure autoconfig is the last layer
+            plugin.get_autoconfig(self.configuration)
+
+            default_view = self.configuration.get_default_view()
+            
+            for setting_uid in theme.get_setting_uids():
+                aknskins_setting = default_view.get_feature(setting_uid)
+                if(theme.get_uid()):
+                    uid = int(theme.get_uid(),16)
+                    aknskins_setting.set_value(str(uid))
+                else:
+                    PID = theme_function.find_text_in_file(os.path.join(theme.get_temp_theme(), "themepackage.pkg"), "!:\\resource\\skins\\", "\\")
+                    dec_PID = theme_function.convert_hexa_to_decimal(PID)
+                    if dec_PID and aknskins_setting:
+                        dec_PID = theme_function.convert_hexa_to_decimal(PID)
+                        aknskins_setting.set_value(str(dec_PID))
+           
+    def make_theme(self, theme, theme_version):
+        """
+        converts the *tdf, *. svg files to *.mbm, *.pkg files, ...
+        The first this method extracts tpf file and then calls carbide.ui command-line
+        which converts theme.
+        """
+        output_path = theme.get_temp_theme()
+        
+        if not os.path.exists(output_path): 
+            os.makedirs(output_path)
+        
+        storagepath = self.configuration.get_storage().get_path()
+
+        input_path =  theme.get_tpf_path().replace("/","\\")
+        
+        zip_output= theme.get_temp_tdf() + "\\"
+        self.unzip_tpf(theme,zip_output)
+        
+        name_tdf = theme_function.get_tdf_file(zip_output)
+        name_tdf = os.path.join(name_tdf,name_tdf+".tdf")
+        input_tdf = os.path.join(zip_output,name_tdf)
+       
+        command_line = "makepackage -input " + input_tdf + " -output " + output_path
+        
+        if len(theme_version) != 0:
+            command_line = command_line + " -ver "+ theme_version
+        
+        if theme.get_uid() != None:
+            command_line = command_line + " -uid " + theme.get_uid()
+            
+        logging.getLogger('cone.thememl').info("Building theme: %s" % command_line)
+        current_dir = os.getcwd()
+        os.chdir(self.carbide)
+        os.system(command_line)
+        os.chdir(current_dir)
+        
+        
+    def unzip_tpf(self, theme, zip_output):
+        """
+        unzip the tpf file to output directory
+        """
+        f_storage = filestorage.FileStorage(theme.get_temp_tdf(), 'wb')
+        list=[]
+        list.append(theme.get_tpf_path())
+        storage = self.configuration.get_storage()
+        storage.export_resources(list, f_storage)
+        
+        tpf_file = os.path.join(theme.get_temp_tdf(),theme.get_tpf_path().replace("/","\\"))
+        
+        unzip.unzip_file_into_dir(tpf_file,zip_output)
+
+        
+    def copy_resources_to_output(self,output):
+        """
+        copies *.mbm, *.skn ... to respective directories in the output directory
+        """
+        for theme in self.list_theme:
+            #gets list of path where *.mbm, *.skn, ... will be copied
+            theme_resource = ThemeResource()
+            theme_resource.parse_pkg_file(os.path.join(theme.get_temp_theme(), "themepackage.pkg"))
+                                          
+            # copies *.mbm, *.skn ... to target paths
+            theme_resource.copy_files_from_theme(theme.get_temp_theme(), output)
+      
+        
+    def removeTempDirs(self):
+        """
+        remove temporary directories
+        """
+
+        for theme in self.list_theme:
+            shutil.rmtree(theme.get_temp_tdf())
+            
+class Theme:
+    """
+    This class has information about theme. It contains path of tpf file and temporary directories
+    where the theme was extracted and builded
+    Ans also it contains information about the name of setting which has value as UID. The theme 
+    hasn't to have this the name of setting.
+    """
+    def __init__(self):
+        #where the theme was extracted
+        self.temp_tdf = ""
+        #where the theme was builded
+        self.temp_theme = ""
+        #the path of tpf file
+        self.tpf_path = ""
+        # the name of the setting which contains UID
+        self.setting_uids = []
+        self.uids = []
+        self.uid = None
+        
+    def set_tpf_path(self, tpf_path):
+        self.tpf_path = tpf_path
+    
+    def get_tpf_path(self):
+        return self.tpf_path
+    
+    def set_temp_tdf(self, temp_tdf):
+        self.temp_tdf = temp_tdf
+        
+    def get_temp_tdf(self):
+        return self.temp_tdf
+    
+    def set_temp_theme(self, temp_theme):
+        self.temp_theme = temp_theme
+        
+    def get_temp_theme(self):
+        return self.temp_theme
+    
+    def set_setting_uids(self, setting_uid):
+        self.setting_uids.append(setting_uid)
+        
+    def get_setting_uids(self):
+        return self.setting_uids
+    
+    def set_uid(self, uid):
+        self.uid = uid
+        
+    def get_uid(self):
+        return self.uid
+    
+class ActiveTheme(object):
+    """
+    This class performs information from thememl file. 
+    It contains the name of settig (its value contains the path of tpf file) and
+    the name of setting which contains UID
+     
+    """
+
+    def __init__(self):
+        self.ref_setting = None
+        self.setting_uids = []
+        self.uid = None
+    
+    def set_setting_ref(self, ref_setting):
+        self.ref_setting  = ref_setting
+        
+    def set_setting_uids(self, setting_uid):
+        self.setting_uids.append(setting_uid)
+        
+    def get_setting_ref(self):
+        return self.ref_setting
+        
+    def get_setting_uids(self):
+        return self.setting_uids
+    
+    def get_uid(self):
+        return self.uid
+    
+    def set_uid(self,uid):
+        self.uid = uid
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_function.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,109 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from shutil import copy
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+import os
+import logging
+
+def convert_hexa_to_decimal(hexa_number):
+    """
+    convert hexa number to decimal number. Hexa number has to have 16 digitals.
+    This method split hexa number to two half and convert them to decimal format.
+    First decimal format is modified using by binary operations. This is for reasons that
+    AknSkinDescCompiler from SDK can't work with big integer numbers
+    """
+    
+    if len(hexa_number) == 16:
+       hexa1 = hexa_number[0:8]
+       hexa2 = hexa_number[8:16]
+
+       decimal1 = long(hexa1,16)
+       decimal2 = long(hexa2,16)
+       
+       max = 0x7fffffff
+       
+       if decimal1 >= max:
+           pow = 2**31
+           num = decimal1 - pow
+           result = max ^ num
+           decimal1 = 0 - (result + 1);
+
+       decimal = str(decimal1)+" " +str(decimal2)
+       return decimal   
+   
+    
+def get_tdf_file(path):
+    """
+    This method takes the name of the tdf file from the .project file 
+    """
+    
+    path = os.path.join(path,".project")
+    etree = ElementTree.parse(path)
+    
+    el_name =  etree.find("name")
+    if el_name != None:
+        return el_name.text
+    else:
+        logging.getLogger('cone.thememl').error("The element name is not in %s" % path)
+        
+
+
+def find_text_in_file(file_path, start_text, end_text):
+    """
+    This method goes over the file and searches text which is located 
+    between start_text and end_text
+    """
+
+    pkg_file=file(file_path,'r')  
+    for row in pkg_file:  
+        pid = find_text_in_string(row, start_text, end_text)
+        if pid != None:
+            pkg_file.close()
+            return pid
+
+    pkg_file.close()  
+    return None
+
+
+def find_text_in_string(string, start_text, end_text):
+    """
+    This method return text which is located between start_text and end_text
+    """
+    index_start = string.rfind(start_text)
+    if not index_start==-1:
+        index_end = string.rfind(end_text)
+        str = string[index_start+len(start_text):index_end]
+        return str
+
+
+
+
+    
+
+
+    
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/theme_resource.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,117 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from shutil import copy
+import os
+
+class ThemeResource:   
+    """
+    This class represents the records about the theme resources which are saved in *.pkg file.
+    Every record contains a filename of the resource (for example "themepackage.mbm"
+    and a path where this resource will be copied in the output directory
+    (for example "!:\private\10207114\import\99d49b086e6097b8\themepackage.mbm")
+    """
+   
+    def __init__(self):
+        self.list_resource=[]
+        
+    def parse_pkg_file(self,file_path):
+        """
+        parses *.pkg file and returns a array of classes ThemeResource
+        The class ThemeResource contains a name of theme resource 
+        and a path where this resource will be copied in the output directory
+        """
+        pkg_file=file(file_path,'r')
+        is_found_else=False
+        row = ""
+        # for every row in pkg file
+        for row in pkg_file:
+            #if it finds tag "ELSE" then it begins load the records about the theme resources
+            if row.startswith("ELSE"):
+                is_found_else = True
+              
+            if(is_found_else):
+                parts_of_row = row.split("\"")
+                #the loading record has to have 5 parts separated "\"
+                if len(parts_of_row) == 5:
+                    #gets the path of the theme resource
+                    path = parts_of_row[3]
+                    #removes these chars "!:\" from the path of theme resource
+                    path = self.modify_resource_path(path)
+                    #parts_of_row[1 is the filename of the theme resource
+                    resource = Resource(parts_of_row[1], path)
+                    self.list_resource.append(resource)
+   
+        pkg_file.close()  
+    
+    def copy_files_from_theme(self, source_path, output_path):
+        """
+        copies theme resources from  source directory to theirs target paths 
+        """
+        for resource in self.list_resource:
+           source_file = os.path.join(source_path, resource.get_filename())
+           target_dir =  os.path.join(output_path, resource.get_path())
+           self.copy_files(source_file, target_dir)          
+        
+    def copy_files(self, source_path, target_path):
+        """
+        copy files from source to target. If the target directory doesn't exist then it is created
+        """
+        if os.path.exists(source_path) != True or os.path.isdir(source_path):
+            return
+        
+        if os.path.exists(target_path) != True:
+            os.makedirs(target_path)
+        copy(source_path, target_path)  
+        
+    def modify_resource_path(self, path):
+        """
+        Modifies the path of them resource. 
+        If the paths contains string "private" or "Data" (it says that the path is target path) then it removes 
+        these chars "!:\" from the path of theme resource
+        """
+        if path.find("private") != -1 or path.find("Data") != -1:
+            if path.startswith("!:\\"):
+                index = path.rfind("\\")
+                path =  path[3:index]
+            
+        return path
+
+        
+class Resource(object):   
+    """
+    This class represents a record about the theme resource. It contains a filename of the resource 
+    (for example "themepackage.mbm" and a path where this resource will be copied in the output directory
+    (for example "!:\private\10207114\import\99d49b086e6097b8\themepackage.mbm")
+    """
+    
+    def __init__(self, filename,path):
+        # the name of theme resource
+        self.filename = filename
+        # the path of theme resource
+        self.path = path
+        
+    def get_filename(self):
+        return self.filename
+    
+    def get_path(self):
+        return self.path
+    
+    def set_path(self,path):
+        self.path = path
+        
+    def set_filename(self,filename):
+        self.filename = filename        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/ConeThemePlugin/themeplugin/unzip.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,50 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, zipfile, os, os.path
+
+def unzip_file_into_dir(file, dir):
+    if (os.path.exists(file) is not True):
+        return
+    
+    if (os.path.exists(dir) is not True):
+        os.mkdir(dir, 0777)
+        
+    zfobj = zipfile.ZipFile(file)
+    for name in zfobj.namelist():
+        filePath = dir + name
+        if name.endswith('/'):
+            os.mkdir(filePath)
+        else:
+            createEmtyResource(filePath)
+            outfile = open(dir+ name, 'wb')
+            outfile.write(zfobj.read(name))
+            outfile.close()
+
+def createEmtyResource(path):
+    splitdrive = os.path.splitdrive(path)
+    splitPath = os.path.split(splitdrive[1])
+
+    pathS = os.path.split(splitPath[1])
+    splited = path.split("/")
+    tempPath = ""
+    for i in range(0,len(splited)-1):
+        tempPath = tempPath+splited[i]
+        if (os.path.exists(tempPath) is not True):
+             os.mkdir(tempPath)
+        tempPath = tempPath+os.path.sep
+    if (os.path.exists(path) is not True):
+        file(path,'wt')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/dep-eggs/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+This directory contains all library dependencies needed by any of the plug-ins as egg files.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../..'))
+assert os.path.split(PLUGIN_SOURCE_ROOT)[1] == 'plugins'
+
+# Import plugin_utils from the plug-in sources root
+if PLUGIN_SOURCE_ROOT not in sys.path: sys.path.append(PLUGIN_SOURCE_ROOT)
+import plugin_utils
+
+# Run integration test initialization
+plugin_utils.integration_test_init(ROOT_PATH)
+
+def collect_suite():
+    return plugin_utils.collect_test_suite_from_dir(ROOT_PATH)
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/export_standalone.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+from testautomation.copy_dir import copy_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+def export_standalone(target_path):
+    """
+    Export any needed extra data for standalone tests.
+    @param target_path: The path where the standalone tests are being exported.
+    """
+    # Copy CRML DC test data from the CRML plug-in test data
+    dirs_to_copy = ['comp_project_1', 'comp_project_2']
+    for dir in dirs_to_copy:
+        copy_dir(source_dir             = os.path.join(ROOT_PATH, '../ConeCRMLPlugin/CRMLPlugin/tests', dir),
+                 target_dir             = os.path.join(target_path, 'testdata/compare/crml_dc', dir),
+                 dir_ignore_functions   = [lambda d: d == '.svn'])
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+
+__init__.runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,810 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Compare data - ConE</title>
+
+</head>
+<body>
+<div id="content">
+
+    <h1>CRML Data Compatibility Report</h1><br>
+    
+    <table class="report">
+      <tr>
+        <td>Source:</td>
+        <td>root.confml</td>
+      </tr>
+      <tr>
+        <td>Target:</td>
+        <td>this is ignored\comp_project_2;root.confml</td>
+      </tr>
+    </table>
+    
+    <br/>
+    
+    <h2>Modified keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+        <th>Changed value</th>
+        <th>Old value</th>
+        <th>New value</th>
+    </tr>
+    
+    <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000001</td>
+                    <td>Setting 1</td>
+                    <td>type</td>
+                    <td>int</td>
+                    <td>real</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000002</td>
+                    <td>Setting 2</td>
+                    <td>backup</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000003</td>
+                    <td>Setting 3</td>
+                    <td>cap_wr</td>
+                    <td>AlwaysFail</td>
+                    <td>None</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000003</td>
+                    <td>Setting 3</td>
+                    <td>read_only</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000004</td>
+                    <td>Setting 4</td>
+                    <td>cap_wr</td>
+                    <td>None</td>
+                    <td>AlwaysFail</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000004</td>
+                    <td>Setting 4</td>
+                    <td>read_only</td>
+                    <td>False</td>
+                    <td>True</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000007</td>
+                    <td>Setting 7</td>
+                    <td>ref</td>
+                    <td>SimpleKeys.Setting7</td>
+                    <td>SimpleKeys.Setting7RefChanged</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000008</td>
+                    <td>Setting 8</td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>ReadUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000008</td>
+                    <td>Setting 8</td>
+                    <td>cap_wr</td>
+                    <td>WriteDeviceData</td>
+                    <td>WriteUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000008</td>
+                    <td>Setting 8</td>
+                    <td>sid_rd</td>
+                    <td>0xAABBCCDD</td>
+                    <td>0x11223344</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000008</td>
+                    <td>Setting 8</td>
+                    <td>sid_wr</td>
+                    <td>0xDDCCBBAA</td>
+                    <td>0x44332211</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000009</td>
+                    <td>Setting 9</td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>None</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000009</td>
+                    <td>Setting 9</td>
+                    <td>cap_wr</td>
+                    <td>WriteDeviceData</td>
+                    <td>None</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000009</td>
+                    <td>Setting 9</td>
+                    <td>sid_rd</td>
+                    <td>0xAABBCCDD</td>
+                    <td>None</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000001_simple_keys.crml</td>
+                    <td>0x00000001</td>
+                    <td>SimpleKeys</td>
+                    <td>0x00000009</td>
+                    <td>Setting 9</td>
+                    <td>sid_wr</td>
+                    <td>0xDDCCBBAA</td>
+                    <td>None</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>ReadUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>cap_wr</td>
+                    <td>WriteDeviceData</td>
+                    <td>WriteUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>sid_rd</td>
+                    <td>0xAABBCCDD</td>
+                    <td>0x11223344</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>sid_wr</td>
+                    <td>0xDDCCBBAA</td>
+                    <td>0x44332211</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>type</td>
+                    <td>int</td>
+                    <td>binary</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001 (bit 2)</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>ref</td>
+                    <td>BitmaskKeys.Bit2</td>
+                    <td>BitmaskKeys.Bit2RefChanged</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                    <td>0x00000002</td>
+                    <td>BitmaskKeys</td>
+                    <td>0x00000001 (bit 3)</td>
+                    <td>Bitmask 1 (name changed)</td>
+                    <td>invert</td>
+                    <td>False</td>
+                    <td>True</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>backup</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>ReadUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>cap_wr</td>
+                    <td>WriteDeviceData</td>
+                    <td>WriteUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>first_index</td>
+                    <td>1</td>
+                    <td>2</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>index_bits</td>
+                    <td>0x00000FF0</td>
+                    <td>0x00001FE0</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>ref</td>
+                    <td>KeyRanges.Seq1</td>
+                    <td>KeyRanges.Seq1RefChanged</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>sid_rd</td>
+                    <td>0x11223344</td>
+                    <td>0xAABBCCDD</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>sid_wr</td>
+                    <td>0x44332211</td>
+                    <td>0xDDCCBBAA</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF (sub-key 0x00000002)</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>ref</td>
+                    <td>SubSetting2</td>
+                    <td>SubSetting2RefChanged</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00001001-0x00001FFF (sub-key 0x00000002)</td>
+                    <td>Sequence 1 (name changed)</td>
+                    <td>type</td>
+                    <td>int</td>
+                    <td>real</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00002000-0x00002FFF</td>
+                    <td>Range 2</td>
+                    <td>backup</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00002000-0x00002FFF</td>
+                    <td>Range 2</td>
+                    <td>read_only</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000003_key_ranges.crml</td>
+                    <td>0x00000003</td>
+                    <td>KeyRanges</td>
+                    <td>0x00003000-0x00003FFF</td>
+                    <td>Range 3</td>
+                    <td>read_only</td>
+                    <td>False</td>
+                    <td>True</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000001</td>
+                    <td>Simple key to bitmask key</td>
+                    <td>key_type</td>
+                    <td>simple_key</td>
+                    <td>bitmask_key</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000002</td>
+                    <td>Bitmask key to simple key</td>
+                    <td>key_type</td>
+                    <td>bitmask_key</td>
+                    <td>simple_key</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>backup</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>ReadUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>cap_wr</td>
+                    <td>AlwaysFail</td>
+                    <td>WriteUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>read_only</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>sid_rd</td>
+                    <td>0xAABBCCDD</td>
+                    <td>0x11223344</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>sid_wr</td>
+                    <td>None</td>
+                    <td>0x44332211</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000004_key_type_changed.crml</td>
+                    <td>0x00000004</td>
+                    <td>KeyTypeChanged</td>
+                    <td>0x00000003</td>
+                    <td>Bitmask key to simple key (other attrs changed also [xyz])</td>
+                    <td>type</td>
+                    <td>int</td>
+                    <td>binary</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>backup</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>cap_rd</td>
+                    <td>ReadDeviceData</td>
+                    <td>ReadUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>cap_wr</td>
+                    <td>WriteDeviceData</td>
+                    <td>WriteUserData</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>rfs</td>
+                    <td>True</td>
+                    <td>False</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>sid_rd</td>
+                    <td>0x11223344</td>
+                    <td>0xAABBCCDD</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>sid_wr</td>
+                    <td>0x44332211</td>
+                    <td>0xDDCCBBAA</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000005_repo_attrs_changed.crml</td>
+                    <td>0x00000005</td>
+                    <td>RepoAttrsChangedXyz</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>uid_name</td>
+                    <td>RepoAttrsChanged</td>
+                    <td>RepoAttrsChangedXyz</td>
+                </tr>
+            <tr>
+                    <td>Layer1/implml/00000006_renamed_repo_xyz.crml</td>
+                    <td>0x00000006</td>
+                    <td>RenamedRepo</td>
+                    <td>None</td>
+                    <td></td>
+                    <td>file</td>
+                    <td>Layer1/implml/00000006_renamed_repo.crml</td>
+                    <td>Layer1/implml/00000006_renamed_repo_xyz.crml</td>
+                </tr>
+            
+    </table>
+    
+    
+    <h2>Added keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+    </tr>
+    
+    <tr>
+                <td>Layer1/implml/00000001_simple_keys.crml</td>
+                <td>0x00000001</td>
+                <td>SimpleKeys</td>
+                <td>0x20000001</td>
+                <td>Added setting</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                <td>0x00000002</td>
+                <td>BitmaskKeys</td>
+                <td>0x00000001 (bit 5)</td>
+                <td>Bitmask 1 (name changed)</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                <td>0x00000002</td>
+                <td>BitmaskKeys</td>
+                <td>0x20000001</td>
+                <td>Added bitmask</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000003_key_ranges.crml</td>
+                <td>0x00000003</td>
+                <td>KeyRanges</td>
+                <td>0x00001001-0x00001FFF (sub-key 0x00000005)</td>
+                <td>Sequence 1 (name changed)</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000003_key_ranges.crml</td>
+                <td>0x00000003</td>
+                <td>KeyRanges</td>
+                <td>0x20001001-0x20001FFF</td>
+                <td>Added range</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/20000001_added_repo.crml</td>
+                <td>0x20000001</td>
+                <td>AddedRepo</td>
+                <td></td>
+                <td></td>
+            </tr>
+        
+    </table>
+    
+    
+    <h2>Removed keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+    </tr>
+    
+    <tr>
+                <td>Layer1/implml/00000001_simple_keys.crml</td>
+                <td>0x00000001</td>
+                <td>SimpleKeys</td>
+                <td>0x10000001</td>
+                <td>Removed setting</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                <td>0x00000002</td>
+                <td>BitmaskKeys</td>
+                <td>0x00000001 (bit 4)</td>
+                <td>Bitmask 1</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000002_bitmask_keys.crml</td>
+                <td>0x00000002</td>
+                <td>BitmaskKeys</td>
+                <td>0x10000001</td>
+                <td>Removed bitmask</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000003_key_ranges.crml</td>
+                <td>0x00000003</td>
+                <td>KeyRanges</td>
+                <td>0x00001001-0x00001FFF (sub-key 0x00000004)</td>
+                <td>Sequence 1</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/00000003_key_ranges.crml</td>
+                <td>0x00000003</td>
+                <td>KeyRanges</td>
+                <td>0x10001001-0x10001FFF</td>
+                <td>Removed range</td>
+            </tr>
+        <tr>
+                <td>Layer1/implml/10000001_removed_repo.crml</td>
+                <td>0x10000001</td>
+                <td>RemovedRepo</td>
+                <td></td>
+                <td></td>
+            </tr>
+        
+    </table>
+    
+    
+    <h2>Duplicate repositories:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>Repository UID</th>
+        <th>Files in source</th>
+        <th>Files in target</th>
+    </tr>
+    
+    <tr>
+                <td>0x30000000</td>
+                <td>
+                Layer1/implml/30000000_duplicate_repo1_proj1.crml<br/>Layer1/implml/30000000_duplicate_repo2_proj1.crml<br/>
+                </td>
+                <td>
+                Layer1/implml/30000000_duplicate_repo1_proj2.crml<br/>Layer1/implml/30000000_duplicate_repo2_proj2.crml<br/>
+                </td>
+            </tr>
+        
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000001_simple_keys.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000001,Setting 1,type,int,real
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000002,Setting 2,backup,True,False
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000003,Setting 3,cap_wr,AlwaysFail,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000003,Setting 3,read_only,True,False
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000004,Setting 4,cap_wr,None,AlwaysFail
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000004,Setting 4,read_only,False,True
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000007,Setting 7,ref,SimpleKeys.Setting7,SimpleKeys.Setting7RefChanged
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,sid_wr,0xDDCCBBAA,0x44332211
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,cap_rd,ReadDeviceData,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,cap_wr,WriteDeviceData,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,sid_rd,0xAABBCCDD,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,sid_wr,0xDDCCBBAA,None
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x20000001,Added setting
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x10000001,Removed setting
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000002_bitmask_keys.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,29 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),sid_wr,0xDDCCBBAA,0x44332211
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),type,int,binary
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 2),Bitmask 1 (name changed),ref,BitmaskKeys.Bit2,BitmaskKeys.Bit2RefChanged
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 3),Bitmask 1 (name changed),invert,False,True
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 5),Bitmask 1 (name changed)
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x20000001,Added bitmask
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 4),Bitmask 1
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x10000001,Removed bitmask
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000003_key_ranges.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,35 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),backup,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),first_index,1,2
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),index_bits,0x00000FF0,0x00001FE0
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),ref,KeyRanges.Seq1,KeyRanges.Seq1RefChanged
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),sid_rd,0x11223344,0xAABBCCDD
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),sid_wr,0x44332211,0xDDCCBBAA
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000002),Sequence 1 (name changed),ref,SubSetting2,SubSetting2RefChanged
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000002),Sequence 1 (name changed),type,int,real
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00002000-0x00002FFF,Range 2,backup,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00002000-0x00002FFF,Range 2,read_only,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00003000-0x00003FFF,Range 3,read_only,False,True
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000005),Sequence 1 (name changed)
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x20001001-0x20001FFF,Added range
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000004),Sequence 1
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x10001001-0x10001FFF,Removed range
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000004_key_type_changed.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,27 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000001,Simple key to bitmask key,key_type,simple_key,bitmask_key
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000002,Bitmask key to simple key,key_type,bitmask_key,simple_key
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),backup,True,False
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),cap_wr,AlwaysFail,WriteUserData
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),read_only,True,False
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),sid_wr,None,0x44332211
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),type,int,binary
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000005_repo_attrs_changed.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,backup,True,False
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,rfs,True,False
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,sid_rd,0x11223344,0xAABBCCDD
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,sid_wr,0x44332211,0xDDCCBBAA
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,uid_name,RepoAttrsChanged,RepoAttrsChangedXyz
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_00000006_renamed_repo.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000006_renamed_repo_xyz.crml,0x00000006,RenamedRepo,None,,file,Layer1/implml/00000006_renamed_repo.crml,Layer1/implml/00000006_renamed_repo_xyz.crml
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_10000001_removed_repo.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/10000001_removed_repo.crml,0x10000001,RemovedRepo,None,
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_20000001_added_repo.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/20000001_added_repo.crml,0x20000001,AddedRepo,None,
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Duplicate repositories in source:
+File,Repository UID
+
+
+Duplicate repositories in target:
+File,Repository UID
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_30000000_duplicate_repo.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,22 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+
+
+Duplicate repositories in source:
+File,Repository UID
+Layer1/implml/30000000_duplicate_repo1_proj1.crml
+Layer1/implml/30000000_duplicate_repo2_proj1.crml
+
+
+Duplicate repositories in target:
+File,Repository UID
+Layer1/implml/30000000_duplicate_repo1_proj2.crml
+Layer1/implml/30000000_duplicate_repo2_proj2.crml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/crml_dc_expected/crml_dc_all.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,86 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000001,Setting 1,type,int,real
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000002,Setting 2,backup,True,False
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000003,Setting 3,cap_wr,AlwaysFail,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000003,Setting 3,read_only,True,False
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000004,Setting 4,cap_wr,None,AlwaysFail
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000004,Setting 4,read_only,False,True
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000007,Setting 7,ref,SimpleKeys.Setting7,SimpleKeys.Setting7RefChanged
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000008,Setting 8,sid_wr,0xDDCCBBAA,0x44332211
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,cap_rd,ReadDeviceData,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,cap_wr,WriteDeviceData,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,sid_rd,0xAABBCCDD,None
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x00000009,Setting 9,sid_wr,0xDDCCBBAA,None
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),sid_wr,0xDDCCBBAA,0x44332211
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001,Bitmask 1 (name changed),type,int,binary
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 2),Bitmask 1 (name changed),ref,BitmaskKeys.Bit2,BitmaskKeys.Bit2RefChanged
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 3),Bitmask 1 (name changed),invert,False,True
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),backup,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),first_index,1,2
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),index_bits,0x00000FF0,0x00001FE0
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),ref,KeyRanges.Seq1,KeyRanges.Seq1RefChanged
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),sid_rd,0x11223344,0xAABBCCDD
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF,Sequence 1 (name changed),sid_wr,0x44332211,0xDDCCBBAA
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000002),Sequence 1 (name changed),ref,SubSetting2,SubSetting2RefChanged
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000002),Sequence 1 (name changed),type,int,real
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00002000-0x00002FFF,Range 2,backup,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00002000-0x00002FFF,Range 2,read_only,True,False
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00003000-0x00003FFF,Range 3,read_only,False,True
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000001,Simple key to bitmask key,key_type,simple_key,bitmask_key
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000002,Bitmask key to simple key,key_type,bitmask_key,simple_key
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),backup,True,False
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),cap_wr,AlwaysFail,WriteUserData
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),read_only,True,False
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),sid_rd,0xAABBCCDD,0x11223344
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),sid_wr,None,0x44332211
+Layer1/implml/00000004_key_type_changed.crml,0x00000004,KeyTypeChanged,0x00000003,Bitmask key to simple key (other attrs changed also [xyz]),type,int,binary
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,backup,True,False
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,cap_rd,ReadDeviceData,ReadUserData
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,cap_wr,WriteDeviceData,WriteUserData
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,rfs,True,False
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,sid_rd,0x11223344,0xAABBCCDD
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,sid_wr,0x44332211,0xDDCCBBAA
+Layer1/implml/00000005_repo_attrs_changed.crml,0x00000005,RepoAttrsChangedXyz,None,,uid_name,RepoAttrsChanged,RepoAttrsChangedXyz
+Layer1/implml/00000006_renamed_repo_xyz.crml,0x00000006,RenamedRepo,None,,file,Layer1/implml/00000006_renamed_repo.crml,Layer1/implml/00000006_renamed_repo_xyz.crml
+
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x20000001,Added setting
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 5),Bitmask 1 (name changed)
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x20000001,Added bitmask
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000005),Sequence 1 (name changed)
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x20001001-0x20001FFF,Added range
+Layer1/implml/20000001_added_repo.crml,0x20000001,AddedRepo,None,
+
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+Layer1/implml/00000001_simple_keys.crml,0x00000001,SimpleKeys,0x10000001,Removed setting
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x00000001 (bit 4),Bitmask 1
+Layer1/implml/00000002_bitmask_keys.crml,0x00000002,BitmaskKeys,0x10000001,Removed bitmask
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x00001001-0x00001FFF (sub-key 0x00000004),Sequence 1
+Layer1/implml/00000003_key_ranges.crml,0x00000003,KeyRanges,0x10001001-0x10001FFF,Removed range
+Layer1/implml/10000001_removed_repo.crml,0x10000001,RemovedRepo,None,
+
+
+Duplicate repositories in source:
+File,Repository UID
+Layer1/implml/30000000_duplicate_repo1_proj1.crml
+Layer1/implml/30000000_duplicate_repo2_proj1.crml
+
+
+Duplicate repositories in target:
+File,Repository UID
+Layer1/implml/30000000_duplicate_repo1_proj2.crml
+Layer1/implml/30000000_duplicate_repo2_proj2.crml
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/SVGTBinEncode.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/ThirdPartyBitmap.pal	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,256 @@
+0x00000000
+0x00CCFFFF
+0x0099FFFF
+0x0066FFFF
+0x0033FFFF
+0x0000FFFF
+0x00FFCCFF
+0x00CCCCFF
+0x0099CCFF
+0x0066CCFF
+0x0033CCFF
+0x0000CCFF
+0x00FF99FF
+0x00CC99FF
+0x009999FF
+0x006699FF
+0x003399FF
+0x000099FF
+0x00FF66FF
+0x00CC66FF
+0x009966FF
+0x006666FF
+0x003366FF
+0x000066FF
+0x00FF33FF
+0x00CC33FF
+0x009933FF
+0x006633FF
+0x003333FF
+0x000033FF
+0x00FF00FF
+0x00CC00FF
+0x009900FF
+0x006600FF
+0x003300FF
+0x000000FF
+0x00FFFFCC
+0x00CCFFCC
+0x0099FFCC
+0x0066FFCC
+0x0033FFCC
+0x0000FFCC
+0x00FFCCCC
+0x00CCCCCC
+0x0099CCCC
+0x0066CCCC
+0x0033CCCC
+0x0000CCCC
+0x00FF99CC
+0x00CC99CC
+0x009999CC
+0x006699CC
+0x003399CC
+0x000099CC
+0x00FF66CC
+0x00CC66CC
+0x009966CC
+0x006666CC
+0x003366CC
+0x000066CC
+0x00FF33CC
+0x00CC33CC
+0x009933CC
+0x006633CC
+0x003333CC
+0x000033CC
+0x00FF00CC
+0x00CC00CC
+0x009900CC
+0x006600CC
+0x003300CC
+0x000000CC
+0x00FFFF99
+0x00CCFF99
+0x0099FF99
+0x0066FF99
+0x0033FF99
+0x0000FF99
+0x00FFCC99
+0x00CCCC99
+0x0099CC99
+0x0066CC99
+0x0033CC99
+0x0000CC99
+0x00FF9999
+0x00CC9999
+0x00999999
+0x00669999
+0x00339999
+0x00009999
+0x00FF6699
+0x00CC6699
+0x00996699
+0x00666699
+0x00336699
+0x00006699
+0x00FF3399
+0x00CC3399
+0x00993399
+0x00663399
+0x00333399
+0x00003399
+0x00FF0099
+0x00CC0099
+0x00990099
+0x00660099
+0x00330099
+0x00000099
+0x00FFFF66
+0x00CCFF66
+0x0099FF66
+0x0066FF66
+0x0033FF66
+0x0000FF66
+0x00FFCC66
+0x00CCCC66
+0x0099CC66
+0x0066CC66
+0x0033CC66
+0x0000CC66
+0x00FF9966
+0x00CC9966
+0x00999966
+0x00669966
+0x00339966
+0x00009966
+0x00FF6666
+0x00CC6666
+0x00996666
+0x00666666
+0x00336666
+0x00006666
+0x00FF3366
+0x00CC3366
+0x00993366
+0x00663366
+0x00333366
+0x00003366
+0x00FF0066
+0x00CC0066
+0x00990066
+0x00660066
+0x00330066
+0x00000066
+0x00FFFF33
+0x00CCFF33
+0x0099FF33
+0x0066FF33
+0x0033FF33
+0x0000FF33
+0x00FFCC33
+0x00CCCC33
+0x0099CC33
+0x0066CC33
+0x0033CC33
+0x0000CC33
+0x00FF9933
+0x00CC9933
+0x00999933
+0x00669933
+0x00339933
+0x00009933
+0x00FF6633
+0x00CC6633
+0x00996633
+0x00666633
+0x00336633
+0x00006633
+0x00FF3333
+0x00CC3333
+0x00993333
+0x00663333
+0x00333333
+0x00003333
+0x00FF0033
+0x00CC0033
+0x00990033
+0x00660033
+0x00330033
+0x00000033
+0x00FFFF00
+0x00CCFF00
+0x0099FF00
+0x0066FF00
+0x0033FF00
+0x0000FF00
+0x00FFCC00
+0x00CCCC00
+0x0099CC00
+0x0066CC00
+0x0033CC00
+0x0000CC00
+0x00FF9900
+0x00CC9900
+0x00999900
+0x00669900
+0x00339900
+0x00009900
+0x00FF6600
+0x00CC6600
+0x00996600
+0x00666600
+0x00336600
+0x00006600
+0x00FF3300
+0x00CC3300
+0x00993300
+0x00663300
+0x00333300
+0x00003300
+0x00FF0000
+0x00CC0000
+0x00990000
+0x00660000
+0x00330000
+0x00000000
+0x00EEEEEE
+0x00DDDDDD
+0x00BBBBBB
+0x00AAAAAA
+0x00888888
+0x00777777
+0x00555555
+0x00444444
+0x00222222
+0x00111111
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00000000
+0x00FFFFFF
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/bmconv.exe has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/mifconv.exe has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/imageplugin_bin/xerces-c_2_6.dll has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/mock_carbide_ui/makepackage.bat	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+@echo off
+rem
+rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+rem All rights reserved.
+rem This component and the accompanying materials are made available
+rem under the terms of "Eclipse Public License v1.0"
+rem which accompanies this distribution, and is available
+rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+rem
+rem Initial Contributors:
+rem Nokia Corporation - initial contribution.
+rem
+rem Contributors:
+rem
+rem Description:
+rem
+
+python %~dp0\makepackage.py %*
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/mock_carbide_ui/makepackage.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, random
+
+output_dir = ''
+uid = None
+
+for i, item in enumerate(sys.argv):
+    if item == '-output' and i + 1 < len(sys.argv):
+        output_dir = sys.argv[i + 1]
+    elif item == '-uid' and i + 1 < len(sys.argv):
+        uid = sys.argv[i + 1]
+
+if uid is None:
+    uid = "%016x" % random.getrandbits(64)
+else:
+    if uid.lower().startswith('0x'):
+        uid = uid[2:]
+
+#print "uid = %s" % uid
+
+
+def write_file(file_path, data):
+    dir = os.path.dirname(file_path)
+    if dir != '' and not os.path.exists(dir):
+        os.makedirs(dir)
+    
+    f = open(file_path, "wb")
+    try:        f.write(data)
+    finally:    f.close()
+
+write_file(os.path.join(output_dir, 'themepackage.mbm'), 'xyz')
+write_file(os.path.join(output_dir, 'themepackage.mif'), 'zyx')
+write_file(os.path.join(output_dir, 'themepackage.skn'), 'foo')
+
+pkg_data = r"""
+IF PACKAGE(0X102032BE) ; CHECK FOR S60 3.1 STUB SIS
+"themepackage.mbm" - "!:\resource\skins\%(uid)s\themepackage.mbm"
+"themepackage.mif" - "!:\resource\skins\%(uid)s\themepackage.mif"
+ELSE
+"themepackage.mbm" - "!:\private\10207114\import\%(uid)s\themepackage.mbm"
+"themepackage.mif" - "!:\private\10207114\import\%(uid)s\themepackage.mif"
+ENDIF
+"themepackage.skn" - "!:\private\10207114\import\%(uid)s\themepackage.skn"
+;Dummy entry for the possible skin .ini file,so that it gets removed on uninstall
+"" - "!:\private\10207114\import\%(uid)s\%(uid)s.ini",FN
+""" % {'uid': uid}
+
+write_file(os.path.join(output_dir, 'themepackage.pkg'), pkg_data)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>test_project</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.tools.variant.confml.core.ConfMLLayerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.nokia.s60ct.build.CenRepBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.tools.variant.confml.core.ConfMLLayerNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/basic_setting_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/bitmask_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Bitmask test" version="1">
+  <feature ref="BitmaskTest" name="Bitmask test">
+    <desc>Feature with bitmask flags</desc>
+    <setting ref="Bit0" name="Bit 0" type="boolean">
+      <desc>A boolean setting for bit 0</desc>
+    </setting>
+    <setting ref="Bit1" name="Bit 1" type="boolean">
+      <desc>A boolean setting for bit 1</desc>
+    </setting>
+    <setting ref="Bit2" name="Bit 2" type="boolean">
+      <desc>A boolean setting for bit 2</desc>
+    </setting>
+    <setting ref="Bit3" name="Bit 3" type="boolean">
+      <desc>A boolean setting for bit 3</desc>
+    </setting>
+    <setting ref="Bit4" name="Bit 4" type="boolean">
+      <desc>A boolean setting for bit 4</desc>
+    </setting>
+    <setting ref="Bit5" name="Bit 5" type="boolean">
+      <desc>A boolean setting for bit 5</desc>
+    </setting>
+  </feature>
+  <data>
+    <BitmaskTest>
+      <Bit0>true</Bit0>
+      <Bit1>false</Bit1>
+      <Bit2>true</Bit2>
+      <Bit3>false</Bit3>
+      <Bit4>true</Bit4>
+      <Bit5>false</Bit5>
+    </BitmaskTest>
+  </data>
+  
+  <rfs>
+    <BitmaskTest>
+      <Bit0>false</Bit0>
+      <Bit1>true</Bit1>
+      <Bit2>false</Bit2>
+      <Bit3>true</Bit3>
+      <Bit4>false</Bit4>
+      <Bit5>true</Bit5>
+    </BitmaskTest>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/file_folder_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Time types test">
+  <confml:feature ref="FileFolderTest" name="File &amp; folder types test">
+    <confml:desc>Feature with file and folder setting types</confml:desc>
+    <confml:setting ref="FolderSetting" name="Folder setting" type="folder">
+      <confml:desc>A folder setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting ref="FileSetting" name="File setting" type="file">
+      <confml:desc>A file setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:FileFolderTest>
+      <confml:FolderSetting>
+        <confml:localPath>default_folder</confml:localPath>
+        <confml:targetPath>default_target_folder/</confml:targetPath>
+      </confml:FolderSetting>
+      <confml:FileSetting>
+        <confml:localPath>default_file.txt</confml:localPath>
+        <confml:targetPath>default_target_folder/default_file_renamed.txt</confml:targetPath>
+      </confml:FileSetting>
+    </confml:FileFolderTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/hcr_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+<confml:feature ref="HcrTest" name="HCR test feature">
+	<confml:setting ref="Int32Setting" name="Int32 setting" type="int"/>
+	<confml:setting ref="BoolSetting" name="Bool setting" type="boolean"/>
+	<confml:setting ref="TextSetting" name="Text setting" type="string"/>
+</confml:feature>
+<confml:data>
+	<confml:HcrTest>
+		<confml:Int32Setting>123456789</confml:Int32Setting>
+		<confml:BoolSetting>true</confml:BoolSetting>
+		<confml:TextSetting>Some testing text</confml:TextSetting>
+	</confml:HcrTest>
+</confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/sequence_setting_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="SequenceSettingTest" name="Sequence setting test">
+    <confml:desc>Feature with a sequence setting (ConfML v2.0)</confml:desc>
+    <confml:setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <confml:desc>A sequence setting</confml:desc>
+      <confml:setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <confml:desc>A folder sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <confml:desc>A real sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <confml:desc>A file sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <confml:desc>An int sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <confml:desc>A string sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <confml:desc>A boolean sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <confml:desc>A selection sub-setting</confml:desc>
+        <confml:option name="Op0" value="0"/>
+        <confml:option name="Op1" value="1"/>
+        <confml:option name="Op2" value="2"/>
+        <confml:option name="Op3" value="3"/>
+        <confml:option name="Op4" value="4"/>
+      </confml:setting>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:SequenceSettingTest>
+      <confml:SequenceSetting template="true">
+        <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.0</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>1</confml:IntSubSetting>
+        <confml:StringSubSetting>template</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>0</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def1_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.25</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def1_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>128</confml:IntSubSetting>
+        <confml:StringSubSetting>def1</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def2_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def2_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>def2</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+    </confml:SequenceSettingTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/sound_file_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Time types test">
+  <confml:feature ref="SoundFileTest" name="Sound file test">
+    <confml:setting ref="SoundFilePath" name="Sound file path" type="string"/>
+  </confml:feature>
+  <confml:data>
+    <confml:SoundFileTest>
+      <confml:SoundFilePath>Z:\\data\\sounds\\some_sound.mp3</confml:SoundFilePath>
+    </confml:SoundFileTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/theme_uids.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Theme UIDs" version="1">
+  <feature ref="ThemeUids" name="Theme UIDs">
+    <desc>Feature for storing theme UIDs</desc>
+    
+    <setting ref="Theme1Uid1" name="Theme 1 UID 1" type="string"/>
+    <setting ref="Theme1Uid2" name="Theme 1 UID 2" type="string"/>
+    <setting ref="Theme1Uid3" name="Theme 1 UID 3" type="string"/>
+    
+    <setting ref="Theme2Uid1" name="Theme 2 UID 1" type="string"/>
+    <setting ref="Theme2Uid2" name="Theme 2 UID 2" type="string"/>
+  </feature>
+  <data>
+    <ThemeUids>
+      <Theme1Uid1>0x00000000</Theme1Uid1>
+      <Theme1Uid2>0x00000000</Theme1Uid2>
+      <Theme1Uid3>0x00000000</Theme1Uid3>
+      
+      <Theme2Uid1>0x00000000</Theme2Uid1>
+      <Theme2Uid2>0x00000000</Theme2Uid2>
+    </ThemeUids>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/confml/time_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Time types test">
+  <confml:feature ref="TimeTypesTest" name="Time types test">
+    <confml:desc>Feature with date-time etc. setting types</confml:desc>
+    <confml:setting ref="DateSetting" name="Date setting" type="date">
+      <confml:desc>A date setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="TimeSetting" name="Time setting" type="time">
+      <confml:desc>A time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DateTimeSetting" name="Date-time setting" type="dateTime">
+      <confml:desc>A date-time setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="DurationSetting" name="Duration setting" type="duration">
+      <confml:desc>A duration setting</confml:desc>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:TimeTypesTest>
+      <confml:DateSetting>2009-02-02</confml:DateSetting>
+      <confml:TimeSetting>07:30:15</confml:TimeSetting>
+      <confml:DateTimeSetting>2009-02-02-07:00:00</confml:DateTimeSetting>
+      <confml:DurationSetting>P5Y4M3DT12H25M15S</confml:DurationSetting>
+    </confml:TimeTypesTest>
+  </confml:data>
+</confml:configuration>
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/bitmask_test_12341002.crml has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_12341000.crml has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_12341001.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature1_sequence.gcfml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<file xmlns="http://www.s60.com/xml/genconfml/1" name="sequence_setting_test.txt" target="data\">
+	<setting ref="Feature1/SequenceSetting"/>
+	<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/TR/xhtml1/strict">
+		<xsl:output method="text" encoding="UTF-16"/>
+		<xsl:template match="configuration/data">
+			<xsl:for-each select="Feature1/SequenceSetting">
+				<xsl:value-of select="FolderSubSetting"/>,<xsl:value-of select="RealSubSetting"/>,<xsl:value-of select="FileSubSetting"/>,<xsl:value-of select="IntSubSetting"/>,<xsl:value-of select="StringSubSetting"/>,<xsl:value-of select="BooleanSubSetting"/>,<xsl:value-of select="SelectionSubSetting"/><xsl:text>&#xA;</xsl:text>
+			</xsl:for-each>
+		</xsl:template>
+	</xsl:stylesheet>
+</file>
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/feature2_ABCD0000.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/hcr_test.hcrml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hcr xmlns="http://www.symbianfoundation.org/xml/hcrml/1">
+<output file="hcr_test.h" type="header">
+  <category name="KTestCategory" uid="0xABCDDCBA">
+    <setting ref="HcrTest.Int32Setting"     name="KInt32Setting"    type="int32"    id="0"/>
+    <setting ref="HcrTest.BoolSetting"      name="KBoolSetting"     type="bool"     id="1"/>
+    <setting ref="HcrTest.TextSetting"      name="KTextSetting"     type="text8"    id="2"/>
+  </category>
+</output>
+</hcr>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/sound_file_test_10000000.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="SoundFileTest" uidValue="0x10000000" owner="0x10000000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="SoundFileTest/SoundFilePath" name="Sound file path" type="string" int="0x00000001" readOnly="false">
+    <access type="R" capabilities="AlwaysPass"/>
+    <access type="W" capabilities="WriteDeviceData"/>
+  </key>
+</repository>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/theme_uids_20000000.crml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<repository xmlns="http://www.s60.com/xml/cenrep/1" uidName="ThemeUids" uidValue="0x20000000">
+  <access type="R" capabilities="AlwaysPass"/>
+  <access type="W" capabilities="AlwaysPass"/>
+  <key ref="ThemeUids/Theme1Uid1" type="string" int="0x11"/>
+  <key ref="ThemeUids/Theme1Uid2" type="string" int="0x12"/>
+  <key ref="ThemeUids/Theme1Uid3" type="string" int="0x13"/>
+  
+  <key ref="ThemeUids/Theme2Uid1" type="string" int="0x21"/>
+  <key ref="ThemeUids/Theme2Uid2" type="string" int="0x22"/>
+</repository>
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/implml/time_types_test_12341003.crml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/base/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Base layer">
+  <xi:include href="confml/basic_setting_types_test.confml"/>
+  <xi:include href="confml/bitmask_test.confml"/>
+  <xi:include href="confml/feature1.confml"/>
+  <xi:include href="confml/feature2.confml"/>
+  <xi:include href="confml/file_folder_test.confml"/>
+  <xi:include href="confml/hcr_test.confml"/>
+  <xi:include href="confml/sequence_setting_test.confml"/>
+  <xi:include href="confml/sound_file_test.confml"/>
+  <xi:include href="confml/theme_uids.confml"/>
+  <xi:include href="confml/time_types_test.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/confml/custom.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2"
+ name="Custom configuration settings">
+  <confml:feature ref="CustomConfSettings" name="Custom configuration settings">
+    <confml:desc>Settings for configuring the base layer's settings via rules and other implementation files on this layer</confml:desc>
+    
+    <confml:setting ref="ConfigureBitmask" name="Configure bitmask" type="boolean">
+      <confml:desc>Sets whether the feature BitmaskTest is configured with pre-defined values</confml:desc>
+    </confml:setting>
+    
+    <confml:setting ref="BmpAnimationFolder" name="BMP animation images folder" type="folder">
+      <confml:desc>The folder used for generating an .mbm file</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SvgAnimationFolder" name="SVG animation images folder" type="folder">
+      <confml:desc>The folder used for generating a .mif file</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFile" name="Sound file" type="file">
+      <confml:desc>Sound file.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFolder" name="Sound folder (for copying sound file to)" type="folder">
+      <confml:desc>Sound folder.</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="SoundFileName" name="Sound file name (for copying sound file to)" type="string"/>
+    
+    <confml:setting ref="ThemeFolder" name="Theme folder" type="folder">
+      <confml:desc>Folder containing themes</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="Theme1File" name="Theme 1 file" type="file">
+      <confml:desc>TPF file for theme 1</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+    <confml:setting ref="Theme2File" name="Theme 2 file" type="file">
+      <confml:desc>TPF file for theme 2</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    
+  </confml:feature>
+  
+  <confml:data>
+    <confml:CustomConfSettings>
+      <confml:ConfigureBitmask>false</confml:ConfigureBitmask>
+      
+      <confml:BmpAnimationFolder><confml:localPath></confml:localPath></confml:BmpAnimationFolder>
+      <confml:SvgAnimationFolder><confml:localPath></confml:localPath></confml:SvgAnimationFolder>
+      <confml:SoundFile><confml:localPath></confml:localPath></confml:SoundFile>
+      <confml:SoundFolder><confml:localPath></confml:localPath></confml:SoundFolder>
+      <confml:SoundFileName>default.mp3</confml:SoundFileName>
+      <confml:ThemeFolder><confml:localPath></confml:localPath></confml:ThemeFolder>
+      <confml:Theme1File><confml:localPath></confml:localPath></confml:Theme1File>
+      <confml:Theme2File><confml:localPath></confml:localPath></confml:Theme2File>
+      
+    </confml:CustomConfSettings>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/confml/view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+  <confml:view name="Test view">
+    <confml:desc>Testing view located on layer 1.</confml:desc>
+    <confml:group name="ConfML v1.0 settings">
+      <confml:setting ref="Feature1/RealSetting"/>
+      <confml:setting ref="Feature1/IntSetting"/>
+      <confml:setting ref="Feature1/StringSetting"/>
+      <confml:setting ref="Feature1/BooleanSetting"/>
+      <confml:setting ref="Feature1/SelectionSetting"/>
+      <confml:setting ref="Feature1/SequenceSetting"/>
+      <confml:setting ref="Feature2/SequenceSetting"/>
+      <confml:setting ref="StringToIntSequenceFeature/SequenceSetting"/>
+      <confml:setting ref="NameIdMappingTest/StringToInt"/>
+    </confml:group>
+    <confml:group name="ConfML v2.0 settings">
+      <confml:setting ref="BasicSettingTypesTest/RealSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/IntSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/StringSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/BooleanSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/SelectionSetting"/>
+      <confml:setting ref="FileFolderTest/FolderSetting"/>
+      <confml:setting ref="FileFolderTest/FileSetting"/>
+      <confml:setting ref="SequenceSettingTest/SequenceSetting"/>
+    </confml:group>
+    <confml:group name="Custom ConfML settings">
+      <confml:setting ref="CustomConfSettings/*"/>
+    </confml:group>
+    <confml:group name="Name-ID mapping test settings">
+      <confml:group name="Source sequences">
+        <confml:setting ref="NameIdMappingTestSourceSequences/*"/>
+      </confml:group>
+      <confml:group name="Target settings">
+        <confml:setting ref="NameIdMappingTestTargetSettings/*"/>
+      </confml:group>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/bmp_animation.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="animations/anim1.mbm"  palette='bin/ThirdPartyBitmap.pal' tooldir="bin"> 
+        <input dir="${CustomConfSettings.BmpAnimationFolder.localPath}" depth="c8">
+            <include pattern="bmp$"/>
+        </input>
+    </output>
+</imageml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/configure_bitmask.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+<rule>
+CustomConfSettings.ConfigureBitmask configures
+  BitmaskTest.Bit0 = '0' and
+  BitmaskTest.Bit1 = '1' and
+  BitmaskTest.Bit2 = '0' and
+  BitmaskTest.Bit3 = '1' and
+  BitmaskTest.Bit4 = '0' and
+  BitmaskTest.Bit5 = '1'
+</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/sound.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    
+    <container>
+        <phase name="pre"/>
+        <ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+            <rule>CustomConfSettings.SoundFile.localPath configures SoundFileTest.SoundFilePath = SoundFileTest.SoundFilePath filenamejoin CustomConfSettings.SoundFile.localPath</rule>
+        </ruleml>
+    </container>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="content/${SoundFileTest.SoundFilePath}">
+            <input dir="${CustomConfSettings.SoundFile.localPath}"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/sound2.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/1">
+  <input dir="${CustomConfSettings.SoundFile.localPath}"/>
+  <output dir="content/${CustomConfSettings.SoundFolder.localPath}/${CustomConfSettings.SoundFileName}"/>
+</content>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/svg_animation.imageml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<imageml xmlns="http://www.s60.com/xml/imageml/1">
+    <output file="animations/anim2.mif" tooldir="bin"> 
+        <input dir="${CustomConfSettings.SvgAnimationFolder.localPath}">
+            <include pattern="svg$"/>
+        </input>
+    </output>
+</imageml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/themes.thememl	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<thememl xmlns="http://www.s60.com/xml/thememl/1">
+
+    <carbideuiPath>mock_carbide_ui</carbideuiPath>
+    
+    <!-- <themeDir>CustomConfSettings/themes</themeDir> -->
+    
+    <activeTheme uid="0x12340001">
+		<refSetting>CustomConfSettings/Theme1File</refSetting>
+    	<platformUID>ThemeUids/Theme1Uid1</platformUID>
+        <platformUID>ThemeUids/Theme1Uid2</platformUID>
+        <platformUID>ThemeUids/Theme1Uid3</platformUID>
+    </activeTheme>
+    
+    <activeTheme uid="0x12340002">
+		<refSetting>CustomConfSettings/Theme2File</refSetting>
+    	<platformUID>ThemeUids/Theme2Uid1</platformUID>
+        <platformUID>ThemeUids/Theme2Uid2</platformUID>
+    </activeTheme>
+</thememl>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/implml/unicode_rule_test.ruleml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+  <rule>True configures Feature1.StringSetting = Feature1.StringSetting + " " + BasicSettingTypesTest.StringSetting + u" カタカナ"</rule>
+</ruleml>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/custom/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Custom configuration layer">
+  <xi:include href="confml/custom.confml"/>
+  <xi:include href="confml/view.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:IntSetting>555</confml:IntSetting>
+      <confml:StringSetting>カタカナ &lt;&amp;></confml:StringSetting>
+    </confml:BasicSettingTypesTest>
+    <confml:CustomConfSettings>
+      <confml:ConfigureBitmask>true</confml:ConfigureBitmask>
+      <confml:BmpAnimationFolder><confml:localPath>animation</confml:localPath></confml:BmpAnimationFolder>
+      <confml:SvgAnimationFolder><confml:localPath>svg_animation</confml:localPath></confml:SvgAnimationFolder>
+      <confml:SoundFile><confml:localPath>local_sounds/test.mp3</confml:localPath></confml:SoundFile>
+      <confml:SoundFolder><confml:localPath>sound_folder</confml:localPath></confml:SoundFolder>
+      <confml:SoundFileName>test2.mp3</confml:SoundFileName>
+      <!--<confml:ThemeFolder><confml:localPath>themes</confml:localPath></confml:ThemeFolder>-->
+      <confml:Theme1File><confml:localPath>themes/mock_theme_1.tpf</confml:localPath></confml:Theme1File>
+      <confml:Theme2File><confml:localPath>themes/mock_theme_2.tpf</confml:localPath></confml:Theme2File>
+    </confml:CustomConfSettings>
+    
+      <confml:SequenceSettingTest>
+        <confml:SequenceSetting extensionPolicy="replace">
+          <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+          <confml:RealSubSetting>10.10</confml:RealSubSetting>
+          <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+          <confml:IntSubSetting>120</confml:IntSubSetting>
+          <confml:StringSubSetting>&lt;&amp;カタカナ&gt;</confml:StringSubSetting>
+          <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+          <confml:SelectionSubSetting>2</confml:SelectionSubSetting>
+        </confml:SequenceSetting>
+      </confml:SequenceSettingTest>
+      
+      <confml:Feature1>
+      <confml:SequenceSetting extensionPolicy="append">
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>test</confml:StringSubSetting>
+        <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      </confml:Feature1>
+     
+    <confml:HcrTest>
+      <confml:Int32Setting>1234</confml:Int32Setting>
+    </confml:HcrTest>
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame01.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame02.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame03.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame04.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame05.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame06.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame07.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame08.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame09.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame10.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame11.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame12.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame13.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame14.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame15.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame16.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame17.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame18.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame19.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/animation/frame20.bmp has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/local_sounds/test.mp3 has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_01.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="translate(0,0.001)">
+<g transform="translate(6.998,7.107)">
+<path d="M46.031,14.244c4.218-1.156,6.435-1.481,10.946-1.481c0.001,5.782,0,11.564,0.001,17.346 c-2.868,0.001-4.246,0.199-6.834,0.902C48.793,25.416,47.382,19.837,46.031,14.244z" fill="#87A8CB"/>
+<path d="M35.228,18.866c3.556-2.126,5.473-2.997,9.469-4.233c1.524,5.544,3.107,11.07,4.632,16.616 c-2.44,0.753-3.592,1.283-5.702,2.572C40.842,28.826,38.012,23.859,35.228,18.866z" fill="#87A8CB"/>
+<path d="M26.064,26.108c2.759-2.827,4.302-4.103,7.615-6.272c2.997,4.864,6.034,9.705,9.03,14.571 c-1.958,1.312-2.858,2.083-4.45,3.784C34.195,34.163,30.129,30.137,26.064,26.108z" fill="#87A8CB"/>
+<path d="M19.067,35.432c1.849-3.283,2.958-4.835,5.452-7.659c4.283,3.804,8.565,7.615,12.85,11.421 c-1.434,1.697-2.064,2.627-3.108,4.588C29.189,41.013,24.139,38.202,19.067,35.432z" fill="#87A8CB"/>
+<path d="M14.764,46.301c0.853-3.517,1.477-5.225,3.04-8.455c5.256,2.44,10.49,4.933,15.746,7.373 c-0.878,1.925-1.223,2.94-1.695,5.02C26.153,48.948,20.466,47.596,14.764,46.301z" fill="#87A8CB"/>
+<path d="M13.68,58.139c-0.199-3.458-0.101-5.272,0.45-8.688c5.794,0.865,11.58,1.779,17.375,2.645 c-0.301,2.015-0.355,3.05-0.246,5.152C25.4,57.541,19.542,57.85,13.68,58.139z" fill="#A2C2DD"/>
+<path d="M16.044,69.621c-1.092-3.037-1.5-4.617-1.984-7.836c5.807-0.761,11.604-1.563,17.409-2.324 c0.268,1.949,0.492,2.902,1.104,4.726C27.058,65.983,21.559,67.823,16.044,69.621z" fill="#A2C2DD"/>
+<path d="M21.416,79.951c-1.75-2.494-2.521-3.818-3.817-6.573c5.289-2.296,10.559-4.636,15.848-6.933 c0.731,1.651,1.168,2.442,2.164,3.927C30.877,73.561,26.151,76.764,21.416,79.951z" fill="#A2C2DD"/>
+<path d="M29.284,88.574c-2.194-1.859-3.221-2.879-5.093-5.051c4.337-3.675,8.677-7.347,13.014-11.023 c1.078,1.293,1.672,1.897,2.955,2.996C36.543,79.863,32.9,84.208,29.284,88.574z" fill="#A2C2DD"/>
+<path d="M39.132,94.923c-2.45-1.155-3.631-1.828-5.871-3.337c3.064-4.779,6.172-9.527,9.234-14.308 c1.322,0.89,2.024,1.288,3.496,1.969C43.727,84.483,41.399,89.689,39.132,94.923z" fill="#A2C2DD"/>
+<path d="M50.449,98.441c-2.547-0.411-3.795-0.715-6.216-1.499c1.592-5.51,3.249-10.999,4.842-16.509 c1.473,0.46,2.239,0.639,3.817,0.879C52.091,87.024,51.247,92.73,50.449,98.441z" fill="#A2C2DD"/>
+<path d="M62.594,98.599c-2.384,0.312-3.622,0.39-6.068,0.362c0.054-5.782,0.111-11.563,0.167-17.343 c1.543,0.016,2.208-0.03,3.627-0.221C61.06,87.133,61.85,92.862,62.594,98.599z" fill="#CADCEC"/>
+<path d="M73.993,95.458c-1.973,0.85-2.991,1.218-5.078,1.821c-1.586-5.568-3.244-11.114-4.83-16.684 c1.244-0.365,1.852-0.589,3.029-1.107C69.383,84.823,71.722,90.124,73.993,95.458z" fill="#CADCEC"/>
+<path d="M83.915,89.474c-1.518,1.22-2.313,1.79-3.961,2.833c-3.079-4.92-6.202-9.808-9.28-14.728 c0.986-0.631,1.46-0.977,2.368-1.714C76.661,80.408,80.297,84.932,83.915,89.474z" fill="#CADCEC"/>
+<path d="M91.872,81.098c-1.041,1.438-1.598,2.13-2.778,3.452c-4.319-3.878-8.629-7.774-12.951-11.653 c0.706-0.796,1.039-1.213,1.663-2.078C82.504,74.234,87.174,77.684,91.872,81.098z" fill="#CADCEC"/>
+<path d="M97.381,70.781c-0.565,1.53-0.883,2.278-1.585,3.734c-5.224-2.527-10.411-5.121-15.637-7.647 c0.422-0.871,0.611-1.317,0.951-2.232C86.546,66.659,91.945,68.759,97.381,70.781z" fill="#CADCEC"/>
+<path d="M99.949,58.98c-0.114,1.511-0.205,2.258-0.442,3.729c-5.712-0.944-11.41-1.945-17.121-2.888 c0.143-0.875,0.198-1.319,0.267-2.217C88.42,58.051,94.183,58.535,99.949,58.98z" fill="#CADCEC"/>
+<path d="M99.184,46.881c0.256,1.236,0.362,1.86,0.529,3.123c-5.739,0.756-11.469,1.564-17.208,2.319 c-0.102-0.741-0.168-1.11-0.325-1.836C87.854,49.308,93.511,48.061,99.184,46.881z" fill="#DEE9F3"/>
+<path d="M95.278,35.919c0.486,0.933,0.715,1.41,1.144,2.378c-5.323,2.349-10.612,4.765-15.935,7.115 c-0.263-0.574-0.402-0.856-0.698-1.411C84.963,41.326,90.103,38.594,95.278,35.919z" fill="#DEE9F3"/>
+<path d="M88.67,26.529c0.591,0.638,0.881,0.965,1.438,1.634c-4.491,3.732-8.972,7.48-13.461,11.213 c-0.338-0.398-0.513-0.596-0.87-0.977C80.076,34.445,84.371,30.485,88.67,26.529z" fill="#DEE9F3"/>
+<path d="M79.791,19.211c0.596,0.369,0.888,0.56,1.468,0.952c-3.3,4.816-6.645,9.598-9.944,14.415 c-0.346-0.236-0.521-0.349-0.877-0.574C73.538,29.061,76.69,24.154,79.791,19.211z" fill="#DEE9F3"/>
+<path d="M69.082,14.458c0.516,0.147,0.773,0.227,1.281,0.392c-1.817,5.518-3.716,11.003-5.534,16.522 c-0.3-0.098-0.453-0.146-0.757-0.235C65.715,25.566,67.439,20.028,69.082,14.458z" fill="#DEE9F3"/>
+<path d="M56.979,12.763c0.373,0.001,0.558,0.003,0.931,0.01c-0.126,5.782-0.263,11.562-0.389,17.342 c-0.217-0.005-0.324-0.006-0.542-0.006C56.98,24.327,56.978,18.545,56.979,12.763z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_02.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(0.791 0.613 -0.612 0.791 52.656 -25.796)">
+<g transform="translate(6.998,7.107)">
+<path d="M45.42,14.606c4.218-1.155,6.436-1.478,10.947-1.479c0,5.78-0.001,11.563,0.001,17.345 c-2.869-0.001-4.247,0.2-6.836,0.902C48.182,25.781,46.772,20.202,45.42,14.606z" fill="#87A8CB"/>
+<path d="M34.618,19.231c3.555-2.128,5.473-2.999,9.468-4.235c1.525,5.545,3.108,11.07,4.631,16.616 c-2.44,0.753-3.591,1.282-5.701,2.572C40.231,29.189,37.402,24.223,34.618,19.231z" fill="#87A8CB"/>
+<path d="M25.454,26.472c2.759-2.827,4.302-4.104,7.615-6.273c2.997,4.866,6.034,9.706,9.03,14.572 c-1.958,1.312-2.857,2.084-4.45,3.784C33.584,34.527,29.517,30.5,25.454,26.472z" fill="#87A8CB"/>
+<path d="M18.456,35.797c1.85-3.284,2.957-4.836,5.452-7.66c4.284,3.805,8.565,7.616,12.848,11.42 c-1.433,1.699-2.062,2.629-3.107,4.59C28.577,41.376,23.529,38.565,18.456,35.797z" fill="#87A8CB"/>
+<path d="M14.154,46.666c0.853-3.519,1.476-5.225,3.039-8.457c5.257,2.441,10.49,4.933,15.747,7.374 c-0.877,1.925-1.224,2.94-1.695,5.02C25.542,49.311,19.856,47.96,14.154,46.666z" fill="#87A8CB"/>
+<path d="M13.07,58.503c-0.2-3.459-0.101-5.273,0.449-8.69c5.795,0.868,11.58,1.78,17.375,2.646 c-0.302,2.014-0.355,3.05-0.246,5.151C24.789,57.905,18.93,58.213,13.07,58.503z" fill="#A2C2DD"/>
+<path d="M15.433,69.985c-1.091-3.039-1.499-4.617-1.984-7.836c5.806-0.763,11.605-1.563,17.41-2.325 c0.267,1.949,0.492,2.901,1.105,4.727C26.448,66.346,20.948,68.188,15.433,69.985z" fill="#A2C2DD"/>
+<path d="M20.805,80.316c-1.749-2.496-2.52-3.819-3.817-6.574c5.288-2.297,10.559-4.636,15.848-6.933 c0.731,1.651,1.167,2.442,2.164,3.928C30.266,73.925,25.539,77.128,20.805,80.316z" fill="#A2C2DD"/>
+<path d="M28.672,88.938c-2.193-1.858-3.22-2.878-5.094-5.052c4.339-3.675,8.679-7.347,13.015-11.022 c1.079,1.293,1.674,1.897,2.955,2.997C35.931,80.226,32.289,84.572,28.672,88.938z" fill="#A2C2DD"/>
+<path d="M38.522,95.287c-2.451-1.154-3.633-1.829-5.871-3.337c3.063-4.779,6.172-9.527,9.233-14.308 c1.322,0.89,2.025,1.289,3.495,1.968C43.116,84.846,40.787,90.052,38.522,95.287z" fill="#A2C2DD"/>
+<path d="M49.838,98.804c-2.546-0.41-3.795-0.716-6.216-1.499c1.592-5.509,3.25-10.997,4.842-16.507 c1.472,0.459,2.239,0.638,3.817,0.878C51.482,87.388,50.637,93.093,49.838,98.804z" fill="#A2C2DD"/>
+<path d="M61.983,98.963c-2.384,0.313-3.621,0.39-6.068,0.361c0.054-5.781,0.112-11.562,0.168-17.342 c1.543,0.015,2.208-0.032,3.626-0.221C60.451,87.496,61.239,93.226,61.983,98.963z" fill="#CADCEC"/>
+<path d="M73.382,95.821c-1.972,0.852-2.991,1.218-5.078,1.821c-1.585-5.569-3.243-11.114-4.829-16.685 c1.244-0.366,1.852-0.588,3.028-1.105C68.772,85.186,71.111,90.487,73.382,95.821z" fill="#CADCEC"/>
+<path d="M83.305,89.837c-1.517,1.22-2.313,1.789-3.962,2.835c-3.079-4.92-6.201-9.809-9.278-14.729 c0.984-0.632,1.459-0.975,2.367-1.713C76.05,80.773,79.686,85.296,83.305,89.837z" fill="#CADCEC"/>
+<path d="M91.261,81.461c-1.041,1.439-1.598,2.131-2.777,3.453c-4.321-3.879-8.631-7.775-12.951-11.654 c0.705-0.796,1.038-1.213,1.662-2.078C81.893,74.596,86.565,78.047,91.261,81.461z" fill="#CADCEC"/>
+<path d="M96.77,71.145c-0.565,1.531-0.884,2.277-1.586,3.734c-5.222-2.526-10.41-5.12-15.636-7.647 c0.421-0.872,0.611-1.318,0.951-2.233C85.933,67.022,91.334,69.121,96.77,71.145z" fill="#CADCEC"/>
+<path d="M99.339,59.344c-0.115,1.51-0.205,2.258-0.443,3.729c-5.712-0.944-11.41-1.945-17.121-2.887 c0.144-0.876,0.198-1.319,0.266-2.218C87.81,58.415,93.573,58.897,99.339,59.344z" fill="#CADCEC"/>
+<path d="M98.572,47.245c0.258,1.237,0.364,1.86,0.529,3.124c-5.738,0.756-11.469,1.561-17.208,2.318 c-0.102-0.742-0.168-1.11-0.325-1.838C87.243,49.67,92.899,48.425,98.572,47.245z" fill="#DEE9F3"/>
+<path d="M94.668,36.281c0.485,0.933,0.714,1.411,1.143,2.378c-5.323,2.349-10.614,4.766-15.936,7.115 c-0.262-0.572-0.4-0.854-0.697-1.41C84.352,41.69,89.493,38.957,94.668,36.281z" fill="#DEE9F3"/>
+<path d="M88.06,26.893c0.591,0.639,0.88,0.965,1.437,1.634c-4.491,3.732-8.971,7.48-13.461,11.213 c-0.337-0.398-0.513-0.595-0.869-0.976C79.465,34.809,83.759,30.848,88.06,26.893z" fill="#DEE9F3"/>
+<path d="M79.181,19.574c0.595,0.37,0.888,0.56,1.468,0.953c-3.301,4.815-6.645,9.598-9.944,14.415 c-0.346-0.237-0.522-0.351-0.878-0.574C72.927,29.425,76.079,24.518,79.181,19.574z" fill="#DEE9F3"/>
+<path d="M68.472,14.822c0.514,0.147,0.773,0.227,1.28,0.392c-1.817,5.517-3.717,11.002-5.534,16.522 c-0.299-0.098-0.452-0.146-0.756-0.235C65.104,25.93,66.828,20.392,68.472,14.822z" fill="#DEE9F3"/>
+<path d="M56.369,13.126c0.372,0.001,0.559,0.004,0.93,0.011c-0.125,5.781-0.263,11.561-0.389,17.341 c-0.217-0.006-0.326-0.005-0.543-0.006C56.368,24.69,56.368,18.909,56.369,13.126z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_03.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(0.279 0.961 -0.96 0.279 107.603 -15.314)">
+<g transform="translate(6.998,7.107)">
+<path d="M45.2,15.209c4.218-1.156,6.435-1.479,10.947-1.48c0,5.782-0.001,11.563,0,17.346 c-2.868-0.001-4.246,0.2-6.834,0.901C47.961,26.384,46.551,20.805,45.2,15.209z" fill="#87A8CB"/>
+<path d="M34.397,19.834c3.556-2.126,5.473-2.997,9.468-4.233c1.524,5.544,3.108,11.07,4.631,16.616 c-2.441,0.752-3.591,1.282-5.703,2.572C40.01,29.793,37.182,24.826,34.397,19.834z" fill="#87A8CB"/>
+<path d="M25.232,27.075c2.76-2.827,4.303-4.104,7.616-6.272c2.997,4.865,6.034,9.705,9.029,14.571 c-1.958,1.313-2.857,2.083-4.45,3.784C33.363,35.13,29.296,31.103,25.232,27.075z" fill="#87A8CB"/>
+<path d="M18.235,36.399c1.85-3.283,2.957-4.834,5.452-7.659c4.283,3.804,8.566,7.614,12.848,11.419 c-1.434,1.699-2.063,2.629-3.105,4.59C28.357,41.978,23.308,39.168,18.235,36.399z" fill="#87A8CB"/>
+<path d="M13.932,47.268c0.853-3.518,1.476-5.225,3.04-8.456c5.257,2.441,10.49,4.934,15.747,7.374 c-0.879,1.926-1.223,2.939-1.696,5.02C25.321,49.914,19.634,48.563,13.932,47.268z" fill="#87A8CB"/>
+<path d="M12.849,59.107c-0.199-3.459-0.102-5.273,0.449-8.69c5.794,0.866,11.581,1.779,17.376,2.646 c-0.302,2.014-0.354,3.049-0.246,5.151C24.568,58.508,18.712,58.817,12.849,59.107z" fill="#A2C2DD"/>
+<path d="M15.212,70.588c-1.092-3.037-1.499-4.617-1.982-7.836c5.805-0.762,11.603-1.562,17.408-2.324 c0.268,1.949,0.492,2.902,1.106,4.726C26.226,66.95,20.728,68.791,15.212,70.588z" fill="#A2C2DD"/>
+<path d="M20.585,80.919c-1.75-2.496-2.523-3.82-3.816-6.574c5.286-2.298,10.559-4.636,15.847-6.933 c0.73,1.65,1.166,2.442,2.164,3.928C30.045,74.528,25.318,77.73,20.585,80.919z" fill="#A2C2DD"/>
+<path d="M28.453,89.541c-2.194-1.858-3.221-2.879-5.094-5.052c4.338-3.676,8.678-7.347,13.014-11.023 c1.079,1.293,1.673,1.897,2.955,2.997C35.711,80.83,32.069,85.175,28.453,89.541z" fill="#A2C2DD"/>
+<path d="M38.301,95.89c-2.451-1.154-3.633-1.827-5.871-3.337c3.063-4.78,6.171-9.527,9.234-14.308 c1.322,0.891,2.025,1.289,3.496,1.969C42.896,85.449,40.565,90.656,38.301,95.89z" fill="#A2C2DD"/>
+<path d="M49.616,99.408c-2.545-0.411-3.795-0.716-6.216-1.499c1.593-5.509,3.25-10.997,4.843-16.508 c1.473,0.46,2.24,0.639,3.818,0.879C51.261,87.991,50.416,93.696,49.616,99.408z" fill="#A2C2DD"/>
+<path d="M61.762,99.567c-2.383,0.312-3.621,0.389-6.068,0.361c0.054-5.783,0.112-11.563,0.167-17.343 c1.543,0.016,2.208-0.031,3.626-0.221C60.229,88.1,61.02,93.829,61.762,99.567z" fill="#CADCEC"/>
+<path d="M73.162,96.425c-1.972,0.852-2.991,1.218-5.079,1.821c-1.587-5.569-3.245-11.115-4.831-16.685 c1.246-0.366,1.853-0.59,3.03-1.106C68.553,85.789,70.892,91.091,73.162,96.425z" fill="#CADCEC"/>
+<path d="M83.085,90.442c-1.518,1.219-2.314,1.788-3.962,2.833c-3.078-4.919-6.201-9.809-9.279-14.729 c0.986-0.631,1.46-0.976,2.367-1.713C75.828,81.375,79.466,85.9,83.085,90.442z" fill="#CADCEC"/>
+<path d="M91.04,82.064c-1.041,1.439-1.598,2.131-2.777,3.453c-4.32-3.879-8.63-7.775-12.951-11.654 c0.706-0.796,1.038-1.212,1.662-2.078C81.673,75.201,86.343,78.651,91.04,82.064z" fill="#CADCEC"/>
+<path d="M96.55,71.749c-0.567,1.529-0.884,2.277-1.586,3.733c-5.225-2.526-10.411-5.121-15.637-7.647 c0.422-0.871,0.611-1.318,0.951-2.233C85.714,67.626,91.114,69.725,96.55,71.749z" fill="#CADCEC"/>
+<path d="M99.118,59.947c-0.114,1.511-0.205,2.258-0.443,3.729c-5.712-0.943-11.411-1.945-17.121-2.888 c0.142-0.874,0.198-1.318,0.266-2.216C87.589,59.018,93.353,59.501,99.118,59.947z" fill="#CADCEC"/>
+<path d="M98.352,47.848c0.257,1.235,0.363,1.86,0.53,3.124c-5.74,0.756-11.469,1.563-17.208,2.318 c-0.103-0.741-0.168-1.11-0.326-1.837C87.022,50.273,92.678,49.028,98.352,47.848z" fill="#DEE9F3"/>
+<path d="M94.447,36.885c0.485,0.934,0.715,1.411,1.143,2.378c-5.321,2.35-10.613,4.765-15.936,7.117 c-0.262-0.573-0.4-0.856-0.695-1.411C84.132,42.293,89.272,39.561,94.447,36.885z" fill="#DEE9F3"/>
+<path d="M87.839,27.496c0.591,0.639,0.88,0.965,1.437,1.633c-4.491,3.733-8.971,7.482-13.461,11.214 c-0.339-0.398-0.514-0.595-0.87-0.976C79.245,35.412,83.539,31.453,87.839,27.496z" fill="#DEE9F3"/>
+<path d="M78.96,20.178c0.596,0.369,0.888,0.56,1.466,0.953c-3.299,4.815-6.644,9.598-9.944,14.415 c-0.345-0.236-0.521-0.35-0.876-0.574C72.707,30.029,75.859,25.121,78.96,20.178z" fill="#DEE9F3"/>
+<path d="M68.25,15.426c0.516,0.147,0.773,0.227,1.28,0.391c-1.817,5.518-3.715,11.004-5.532,16.523 c-0.301-0.099-0.452-0.145-0.758-0.236C64.884,26.534,66.608,20.996,68.25,15.426z" fill="#DEE9F3"/>
+<path d="M56.147,13.73c0.375,0,0.56,0.003,0.931,0.01c-0.125,5.782-0.263,11.561-0.388,17.343 c-0.216-0.005-0.326-0.006-0.543-0.006C56.147,25.293,56.148,19.512,56.147,13.73z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_04.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(-0.338 0.941 -0.94 -0.338 145.896 25.463)">
+<g transform="translate(6.998,7.107)">
+<path d="M45.37,15.867c4.216-1.155,6.435-1.479,10.946-1.479c0,5.781,0.001,11.563,0.001,17.344 c-2.869,0.001-4.247,0.201-6.834,0.904C48.132,27.04,46.722,21.463,45.37,15.867z" fill="#87A8CB"/>
+<path d="M34.568,20.491c3.555-2.125,5.473-2.998,9.468-4.233c1.523,5.544,3.108,11.069,4.632,16.615 c-2.441,0.752-3.592,1.283-5.704,2.572C40.182,30.451,37.353,25.484,34.568,20.491z" fill="#87A8CB"/>
+<path d="M25.402,27.732c2.76-2.827,4.303-4.103,7.617-6.271c2.996,4.865,6.033,9.704,9.029,14.571 c-1.959,1.311-2.858,2.083-4.45,3.784C33.535,35.788,29.468,31.762,25.402,27.732z" fill="#87A8CB"/>
+<path d="M18.407,37.057c1.85-3.283,2.957-4.835,5.452-7.661c4.283,3.806,8.564,7.616,12.848,11.421 c-1.433,1.699-2.063,2.628-3.107,4.59C28.528,42.636,23.479,39.825,18.407,37.057z" fill="#87A8CB"/>
+<path d="M14.103,47.927c0.853-3.518,1.476-5.225,3.04-8.457c5.258,2.441,10.489,4.933,15.748,7.374 c-0.878,1.926-1.223,2.939-1.695,5.02C25.491,50.573,19.806,49.221,14.103,47.927z" fill="#87A8CB"/>
+<path d="M13.02,59.765c-0.2-3.458-0.102-5.274,0.449-8.69c5.795,0.866,11.581,1.778,17.376,2.645 c-0.303,2.014-0.356,3.05-0.246,5.152C24.739,59.165,18.881,59.475,13.02,59.765z" fill="#A2C2DD"/>
+<path d="M15.383,71.245c-1.091-3.037-1.499-4.617-1.983-7.835c5.806-0.763,11.604-1.563,17.408-2.325 c0.268,1.949,0.493,2.902,1.105,4.727C26.397,67.608,20.898,69.449,15.383,71.245z" fill="#A2C2DD"/>
+<path d="M20.754,81.577c-1.749-2.495-2.521-3.82-3.816-6.573c5.288-2.298,10.558-4.637,15.848-6.934 c0.731,1.65,1.168,2.441,2.164,3.928C30.216,75.185,25.49,78.388,20.754,81.577z" fill="#A2C2DD"/>
+<path d="M28.623,90.2c-2.194-1.86-3.221-2.879-5.094-5.053c4.338-3.674,8.678-7.347,13.015-11.022 c1.078,1.292,1.672,1.897,2.954,2.997C35.882,81.488,32.24,85.832,28.623,90.2z" fill="#A2C2DD"/>
+<path d="M38.472,96.548c-2.45-1.155-3.632-1.83-5.871-3.337c3.064-4.78,6.172-9.528,9.234-14.307 c1.322,0.891,2.025,1.287,3.495,1.969C43.066,86.108,40.737,91.314,38.472,96.548z" fill="#A2C2DD"/>
+<path d="M49.788,100.066c-2.546-0.411-3.796-0.716-6.216-1.5c1.592-5.509,3.248-10.998,4.842-16.508 c1.474,0.459,2.241,0.64,3.817,0.879C51.431,88.649,50.586,94.353,49.788,100.066z" fill="#A2C2DD"/>
+<path d="M61.932,100.224c-2.383,0.312-3.62,0.389-6.068,0.362c0.054-5.783,0.112-11.564,0.167-17.344 c1.544,0.016,2.208-0.031,3.627-0.221C60.4,88.758,61.19,94.486,61.932,100.224z" fill="#CADCEC"/>
+<path d="M73.332,97.083c-1.972,0.85-2.989,1.219-5.078,1.822c-1.586-5.57-3.243-11.115-4.83-16.686 c1.246-0.365,1.853-0.588,3.029-1.105C68.722,86.447,71.061,91.749,73.332,97.083z" fill="#CADCEC"/>
+<path d="M83.255,91.099c-1.518,1.22-2.314,1.79-3.962,2.834c-3.078-4.919-6.203-9.809-9.28-14.729 c0.987-0.632,1.461-0.976,2.368-1.713C76,82.033,79.637,86.558,83.255,91.099z" fill="#CADCEC"/>
+<path d="M91.21,82.723c-1.041,1.438-1.597,2.13-2.776,3.452c-4.321-3.879-8.63-7.774-12.952-11.654 c0.705-0.795,1.039-1.212,1.663-2.078C81.843,75.859,86.514,79.308,91.21,82.723z" fill="#CADCEC"/>
+<path d="M96.721,72.406c-0.566,1.53-0.885,2.278-1.588,3.734c-5.222-2.526-10.41-5.12-15.636-7.647 c0.421-0.871,0.61-1.317,0.951-2.233C85.884,68.285,91.284,70.383,96.721,72.406z" fill="#CADCEC"/>
+<path d="M99.289,60.605c-0.115,1.511-0.206,2.258-0.443,3.73c-5.711-0.944-11.41-1.945-17.121-2.889 c0.142-0.874,0.198-1.319,0.267-2.217C87.759,59.676,93.522,60.159,99.289,60.605z" fill="#CADCEC"/>
+<path d="M98.523,48.506c0.256,1.237,0.362,1.86,0.528,3.124c-5.738,0.756-11.469,1.563-17.208,2.318 c-0.102-0.741-0.167-1.109-0.325-1.837C87.194,50.931,92.849,49.686,98.523,48.506z" fill="#DEE9F3"/>
+<path d="M94.617,37.543c0.486,0.934,0.714,1.409,1.143,2.378c-5.322,2.35-10.613,4.766-15.936,7.117 c-0.261-0.573-0.4-0.856-0.696-1.411C84.303,42.95,89.443,40.218,94.617,37.543z" fill="#DEE9F3"/>
+<path d="M88.009,28.154c0.591,0.639,0.881,0.964,1.438,1.632c-4.49,3.733-8.97,7.481-13.461,11.215 c-0.338-0.399-0.512-0.595-0.87-0.978C79.414,36.068,83.71,32.11,88.009,28.154z" fill="#DEE9F3"/>
+<path d="M79.132,20.836c0.594,0.369,0.887,0.561,1.466,0.953c-3.299,4.815-6.645,9.598-9.944,14.414 c-0.345-0.237-0.521-0.35-0.877-0.573C72.876,30.687,76.029,25.78,79.132,20.836z" fill="#DEE9F3"/>
+<path d="M68.422,16.083c0.515,0.148,0.773,0.227,1.28,0.392c-1.817,5.518-3.716,11.003-5.534,16.522 c-0.3-0.099-0.451-0.145-0.756-0.236C65.055,27.192,66.779,21.653,68.422,16.083z" fill="#DEE9F3"/>
+<path d="M56.318,14.388c0.373,0,0.559,0.003,0.932,0.011c-0.126,5.781-0.264,11.561-0.389,17.341 c-0.216-0.005-0.325-0.006-0.542-0.006C56.318,25.951,56.317,20.17,56.318,14.388z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_05.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(-0.827 0.563 -0.562 -0.827 152.907 80.959)">
+<g transform="translate(6.998,7.107)">
+<path d="M45.872,16.268c4.217-1.155,6.435-1.481,10.947-1.479c0,5.781-0.001,11.563,0,17.345 c-2.868,0-4.247,0.2-6.834,0.902C48.633,27.442,47.224,21.864,45.872,16.268z" fill="#87A8CB"/>
+<path d="M35.069,20.892c3.555-2.127,5.473-2.998,9.469-4.236c1.524,5.545,3.108,11.071,4.631,16.616 c-2.44,0.753-3.591,1.283-5.703,2.573C40.684,30.851,37.854,25.884,35.069,20.892z" fill="#87A8CB"/>
+<path d="M25.904,28.133c2.76-2.828,4.303-4.103,7.617-6.272c2.997,4.865,6.033,9.705,9.029,14.571 c-1.958,1.312-2.856,2.084-4.45,3.784C34.036,36.189,29.969,32.161,25.904,28.133z" fill="#87A8CB"/>
+<path d="M18.907,37.457c1.85-3.282,2.958-4.835,5.452-7.66c4.283,3.805,8.565,7.616,12.848,11.421 c-1.433,1.698-2.063,2.629-3.106,4.589C29.029,43.036,23.981,40.226,18.907,37.457z" fill="#87A8CB"/>
+<path d="M14.604,48.327c0.853-3.518,1.477-5.226,3.041-8.457c5.257,2.442,10.489,4.934,15.746,7.374 c-0.877,1.926-1.223,2.941-1.695,5.021C25.994,50.973,20.307,49.621,14.604,48.327z" fill="#87A8CB"/>
+<path d="M13.521,60.165c-0.199-3.459-0.102-5.274,0.449-8.69c5.795,0.866,11.58,1.778,17.376,2.646 c-0.302,2.013-0.355,3.048-0.247,5.152C25.241,59.565,19.383,59.875,13.521,60.165z" fill="#A2C2DD"/>
+<path d="M15.884,71.645c-1.09-3.036-1.498-4.616-1.983-7.836c5.806-0.762,11.605-1.563,17.409-2.324 c0.268,1.95,0.494,2.9,1.105,4.728C26.899,68.008,21.399,69.85,15.884,71.645z" fill="#A2C2DD"/>
+<path d="M21.257,81.978c-1.75-2.496-2.522-3.82-3.816-6.576c5.287-2.298,10.558-4.635,15.848-6.931 c0.73,1.648,1.167,2.44,2.164,3.927C30.718,75.586,25.991,78.788,21.257,81.978z" fill="#A2C2DD"/>
+<path d="M29.124,90.6c-2.193-1.859-3.22-2.879-5.092-5.054c4.337-3.674,8.677-7.346,13.013-11.022 c1.08,1.292,1.674,1.898,2.956,2.996C36.383,81.889,32.741,86.233,29.124,90.6z" fill="#A2C2DD"/>
+<path d="M38.974,96.947c-2.45-1.153-3.633-1.828-5.872-3.335c3.063-4.78,6.172-9.528,9.235-14.309 c1.322,0.89,2.024,1.288,3.496,1.969C43.567,86.508,41.239,91.714,38.974,96.947z" fill="#A2C2DD"/>
+<path d="M50.289,100.466c-2.547-0.41-3.795-0.715-6.215-1.499c1.592-5.51,3.249-10.999,4.842-16.509 c1.474,0.461,2.24,0.64,3.817,0.88C51.933,89.048,51.088,94.754,50.289,100.466z" fill="#A2C2DD"/>
+<path d="M62.434,100.625c-2.383,0.311-3.622,0.389-6.068,0.361c0.054-5.781,0.112-11.562,0.167-17.342 c1.543,0.015,2.208-0.033,3.627-0.221C60.901,89.159,61.692,94.886,62.434,100.625z" fill="#CADCEC"/>
+<path d="M73.834,97.483c-1.973,0.851-2.991,1.218-5.078,1.822c-1.586-5.57-3.244-11.115-4.832-16.686 c1.246-0.366,1.853-0.589,3.029-1.106C69.225,86.847,71.563,92.149,73.834,97.483z" fill="#CADCEC"/>
+<path d="M83.756,91.499c-1.518,1.22-2.312,1.79-3.961,2.835c-3.078-4.921-6.202-9.81-9.279-14.73 c0.984-0.631,1.46-0.976,2.367-1.713C76.502,82.432,80.138,86.958,83.756,91.499z" fill="#CADCEC"/>
+<path d="M91.712,83.122c-1.041,1.439-1.598,2.131-2.777,3.454c-4.321-3.879-8.632-7.774-12.952-11.654 c0.706-0.796,1.039-1.211,1.664-2.078C82.346,76.258,87.015,79.709,91.712,83.122z" fill="#CADCEC"/>
+<path d="M97.221,72.807c-0.565,1.529-0.883,2.277-1.585,3.732c-5.224-2.525-10.412-5.12-15.637-7.645 c0.421-0.873,0.61-1.32,0.95-2.234C86.385,68.685,91.785,70.784,97.221,72.807z" fill="#CADCEC"/>
+<path d="M99.791,61.005c-0.115,1.511-0.206,2.258-0.442,3.729c-5.714-0.942-11.41-1.944-17.122-2.888 c0.143-0.874,0.199-1.318,0.267-2.215C88.26,60.076,94.024,60.559,99.791,61.005z" fill="#CADCEC"/>
+<path d="M99.025,48.906c0.256,1.236,0.363,1.86,0.529,3.123c-5.739,0.756-11.469,1.564-17.208,2.318 c-0.103-0.742-0.168-1.109-0.326-1.836C87.694,51.332,93.35,50.086,99.025,48.906z" fill="#DEE9F3"/>
+<path d="M95.119,37.943c0.485,0.934,0.715,1.41,1.144,2.378c-5.323,2.35-10.613,4.766-15.936,7.116 c-0.262-0.571-0.4-0.855-0.697-1.41C84.805,43.352,89.944,40.619,95.119,37.943z" fill="#DEE9F3"/>
+<path d="M88.511,28.554c0.592,0.639,0.88,0.965,1.438,1.633c-4.491,3.733-8.97,7.48-13.461,11.213 c-0.338-0.399-0.513-0.595-0.869-0.977C79.916,36.468,84.211,32.51,88.511,28.554z" fill="#DEE9F3"/>
+<path d="M79.633,21.235c0.595,0.37,0.888,0.561,1.466,0.953c-3.299,4.815-6.645,9.598-9.943,14.414 c-0.346-0.236-0.522-0.35-0.877-0.573C73.378,31.087,76.531,26.18,79.633,21.235z" fill="#DEE9F3"/>
+<path d="M68.923,16.482c0.515,0.149,0.774,0.228,1.28,0.392c-1.817,5.518-3.716,11.004-5.533,16.524 c-0.301-0.1-0.453-0.146-0.758-0.236C65.556,27.592,67.28,22.053,68.923,16.482z" fill="#DEE9F3"/>
+<path d="M56.82,14.787c0.373,0.001,0.559,0.003,0.931,0.011c-0.125,5.781-0.263,11.561-0.39,17.342 c-0.215-0.004-0.325-0.006-0.541-0.006C56.82,26.351,56.82,20.57,56.82,14.787z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_06.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(-1 0 0.001 -1 128 128)">
+<g transform="translate(6.998,7.107)">
+<path d="M46.514,16.3c4.217-1.155,6.435-1.477,10.946-1.478c0.001,5.782,0,11.562,0.001,17.344 c-2.869,0-4.247,0.201-6.835,0.904C49.275,27.475,47.865,21.897,46.514,16.3z" fill="#87A8CB"/>
+<path d="M35.711,20.925c3.556-2.126,5.473-2.998,9.468-4.235c1.524,5.545,3.107,11.072,4.631,16.617 c-2.44,0.751-3.59,1.281-5.702,2.572C41.325,30.884,38.495,25.918,35.711,20.925z" fill="#87A8CB"/>
+<path d="M26.545,28.165c2.76-2.827,4.304-4.102,7.616-6.272c2.996,4.865,6.034,9.705,9.03,14.572 c-1.958,1.313-2.858,2.083-4.45,3.784C34.676,36.221,30.611,32.195,26.545,28.165z" fill="#87A8CB"/>
+<path d="M19.55,37.491c1.849-3.283,2.957-4.835,5.451-7.659c4.283,3.804,8.566,7.615,12.849,11.42 c-1.434,1.699-2.063,2.628-3.107,4.588C29.67,43.069,24.622,40.259,19.55,37.491z" fill="#87A8CB"/>
+<path d="M15.246,48.36c0.853-3.518,1.477-5.225,3.04-8.458c5.257,2.443,10.49,4.933,15.747,7.375 c-0.879,1.925-1.224,2.94-1.696,5.021C26.634,51.005,20.949,49.654,15.246,48.36z" fill="#87A8CB"/>
+<path d="M14.163,60.198c-0.2-3.458-0.102-5.274,0.449-8.69c5.795,0.868,11.58,1.779,17.376,2.646 c-0.302,2.014-0.356,3.049-0.247,5.152C25.881,59.598,20.024,59.906,14.163,60.198z" fill="#A2C2DD"/>
+<path d="M16.526,71.678c-1.092-3.037-1.499-4.617-1.984-7.835c5.806-0.764,11.605-1.563,17.41-2.326 c0.268,1.949,0.492,2.902,1.105,4.728C27.54,68.041,22.041,69.883,16.526,71.678z" fill="#A2C2DD"/>
+<path d="M21.897,82.01c-1.749-2.495-2.522-3.819-3.816-6.573c5.288-2.299,10.559-4.636,15.849-6.933 c0.73,1.65,1.167,2.441,2.164,3.927C31.359,75.619,26.631,78.822,21.897,82.01z" fill="#A2C2DD"/>
+<path d="M29.765,90.633c-2.194-1.859-3.22-2.878-5.093-5.053c4.338-3.674,8.677-7.347,13.013-11.023 c1.08,1.293,1.673,1.897,2.955,2.997C37.025,81.92,33.383,86.265,29.765,90.633z" fill="#A2C2DD"/>
+<path d="M39.615,96.981c-2.452-1.155-3.633-1.83-5.872-3.336c3.064-4.78,6.172-9.528,9.233-14.309 c1.323,0.891,2.025,1.288,3.495,1.969C44.208,86.54,41.88,91.747,39.615,96.981z" fill="#A2C2DD"/>
+<path d="M50.931,100.5c-2.547-0.412-3.796-0.717-6.217-1.5c1.593-5.51,3.249-10.999,4.842-16.508 c1.473,0.46,2.24,0.639,3.817,0.878C52.574,89.082,51.729,94.787,50.931,100.5z" fill="#A2C2DD"/>
+<path d="M63.076,100.657c-2.383,0.313-3.623,0.391-6.069,0.362c0.054-5.781,0.111-11.563,0.168-17.343 c1.542,0.017,2.207-0.03,3.626-0.22C61.544,89.19,62.332,94.92,63.076,100.657z" fill="#CADCEC"/>
+<path d="M74.475,97.516c-1.973,0.85-2.991,1.218-5.078,1.821c-1.586-5.57-3.244-11.114-4.83-16.685 c1.244-0.365,1.852-0.589,3.029-1.105C69.865,86.88,72.204,92.181,74.475,97.516z" fill="#CADCEC"/>
+<path d="M84.397,91.533c-1.518,1.219-2.312,1.789-3.961,2.832c-3.078-4.918-6.201-9.808-9.28-14.728 c0.986-0.631,1.46-0.976,2.367-1.714C77.142,82.466,80.779,86.991,84.397,91.533z" fill="#CADCEC"/>
+<path d="M92.354,83.155c-1.041,1.439-1.599,2.131-2.778,3.453c-4.32-3.879-8.63-7.774-12.951-11.655 c0.705-0.796,1.037-1.213,1.662-2.078C82.987,76.292,87.656,79.741,92.354,83.155z" fill="#CADCEC"/>
+<path d="M97.863,72.84c-0.566,1.53-0.883,2.277-1.586,3.732c-5.224-2.525-10.411-5.118-15.636-7.645 c0.421-0.872,0.61-1.319,0.951-2.233C87.027,68.716,92.427,70.817,97.863,72.84z" fill="#CADCEC"/>
+<path d="M100.431,61.039c-0.114,1.511-0.205,2.257-0.442,3.728c-5.712-0.943-11.409-1.944-17.121-2.887 c0.143-0.875,0.199-1.319,0.267-2.217C88.902,60.108,94.666,60.592,100.431,61.039z" fill="#CADCEC"/>
+<path d="M99.665,48.94c0.257,1.235,0.363,1.86,0.529,3.123c-5.739,0.756-11.469,1.563-17.208,2.319 c-0.103-0.743-0.168-1.11-0.325-1.838C88.335,51.364,93.992,50.119,99.665,48.94z" fill="#DEE9F3"/>
+<path d="M95.76,37.975c0.485,0.936,0.715,1.411,1.143,2.378c-5.323,2.35-10.612,4.768-15.935,7.116 c-0.263-0.572-0.401-0.855-0.698-1.411C85.446,43.384,90.585,40.651,95.76,37.975z" fill="#DEE9F3"/>
+<path d="M89.152,28.587c0.59,0.639,0.88,0.965,1.438,1.634c-4.491,3.733-8.97,7.481-13.462,11.213 c-0.338-0.398-0.512-0.595-0.869-0.977C80.558,36.501,84.853,32.543,89.152,28.587z" fill="#DEE9F3"/>
+<path d="M80.274,21.269c0.594,0.368,0.888,0.559,1.466,0.952c-3.299,4.816-6.644,9.598-9.943,14.415 c-0.346-0.237-0.522-0.351-0.877-0.573C74.02,31.121,77.172,26.212,80.274,21.269z" fill="#DEE9F3"/>
+<path d="M69.564,16.517c0.515,0.148,0.772,0.227,1.28,0.391c-1.817,5.518-3.716,11.005-5.533,16.524 c-0.3-0.1-0.453-0.146-0.757-0.235C66.198,27.626,67.922,22.087,69.564,16.517z" fill="#DEE9F3"/>
+<path d="M57.462,14.822c0.373,0,0.558,0.003,0.931,0.01c-0.126,5.781-0.264,11.562-0.39,17.341 c-0.215-0.005-0.324-0.005-0.541-0.006C57.462,26.384,57.461,20.603,57.462,14.822z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_07.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(-0.79 -0.612 0.613 -0.79 75.345 153.796)">
+<g transform="translate(6.998,7.107)">
+<path d="M47.093,15.953c4.218-1.156,6.435-1.479,10.946-1.481c0,5.783,0,11.564,0,17.345 c-2.869,0.001-4.248,0.2-6.835,0.903C49.854,27.127,48.444,21.549,47.093,15.953z" fill="#87A8CB"/>
+<path d="M36.291,20.578c3.555-2.128,5.473-2.998,9.468-4.235c1.523,5.544,3.108,11.071,4.631,16.616 c-2.441,0.752-3.591,1.282-5.702,2.571C41.905,30.537,39.074,25.57,36.291,20.578z" fill="#87A8CB"/>
+<path d="M27.125,27.818c2.76-2.826,4.304-4.102,7.616-6.272c2.996,4.866,6.034,9.706,9.029,14.572 c-1.957,1.312-2.857,2.083-4.449,3.784C35.256,35.874,31.19,31.847,27.125,27.818z" fill="#87A8CB"/>
+<path d="M20.128,37.144c1.849-3.284,2.958-4.836,5.452-7.66c4.283,3.805,8.565,7.616,12.847,11.421 c-1.432,1.699-2.062,2.627-3.106,4.588C30.25,42.722,25.201,39.912,20.128,37.144z" fill="#87A8CB"/>
+<path d="M15.825,48.012c0.853-3.517,1.478-5.224,3.04-8.457c5.257,2.441,10.489,4.933,15.747,7.374 c-0.877,1.927-1.223,2.94-1.694,5.02C27.214,50.657,21.527,49.307,15.825,48.012z" fill="#87A8CB"/>
+<path d="M14.742,59.85c-0.2-3.459-0.101-5.273,0.45-8.69c5.794,0.867,11.579,1.78,17.375,2.647 c-0.302,2.012-0.355,3.049-0.245,5.151C26.461,59.251,20.603,59.559,14.742,59.85z" fill="#A2C2DD"/>
+<path d="M17.105,71.332c-1.091-3.037-1.499-4.617-1.984-7.835c5.807-0.763,11.606-1.563,17.41-2.326 c0.268,1.95,0.492,2.902,1.105,4.728C28.12,67.694,22.62,69.535,17.105,71.332z" fill="#A2C2DD"/>
+<path d="M22.476,81.662c-1.749-2.495-2.52-3.819-3.816-6.574c5.288-2.298,10.558-4.636,15.848-6.932 c0.73,1.651,1.168,2.442,2.164,3.928C31.938,75.271,27.212,78.475,22.476,81.662z" fill="#A2C2DD"/>
+<path d="M30.345,90.285c-2.194-1.859-3.221-2.879-5.093-5.053c4.338-3.675,8.677-7.347,13.013-11.022 c1.078,1.292,1.672,1.897,2.956,2.996C37.603,81.574,33.961,85.919,30.345,90.285z" fill="#A2C2DD"/>
+<path d="M40.194,96.634c-2.45-1.155-3.633-1.83-5.871-3.338c3.063-4.779,6.171-9.527,9.233-14.308 c1.322,0.89,2.025,1.289,3.496,1.968C44.788,86.193,42.459,91.399,40.194,96.634z" fill="#A2C2DD"/>
+<path d="M51.51,100.152c-2.545-0.411-3.796-0.717-6.216-1.5c1.593-5.51,3.249-10.998,4.841-16.508 c1.474,0.46,2.241,0.639,3.818,0.879C53.153,88.734,52.309,94.44,51.51,100.152z" fill="#A2C2DD"/>
+<path d="M63.654,100.309c-2.383,0.313-3.621,0.39-6.069,0.361c0.055-5.781,0.113-11.562,0.17-17.343 c1.542,0.016,2.206-0.031,3.626-0.221C62.122,88.844,62.912,94.572,63.654,100.309z" fill="#CADCEC"/>
+<path d="M75.054,97.168c-1.972,0.851-2.99,1.218-5.079,1.822c-1.586-5.57-3.243-11.115-4.83-16.685 c1.244-0.366,1.852-0.589,3.028-1.105C70.445,86.533,72.784,91.834,75.054,97.168z" fill="#CADCEC"/>
+<path d="M84.976,91.185c-1.517,1.22-2.313,1.79-3.96,2.833c-3.079-4.918-6.203-9.808-9.279-14.728 c0.985-0.63,1.46-0.975,2.366-1.714C77.723,82.118,81.358,86.644,84.976,91.185z" fill="#CADCEC"/>
+<path d="M92.933,82.808c-1.041,1.438-1.599,2.131-2.778,3.452c-4.319-3.879-8.63-7.774-12.951-11.654 c0.706-0.796,1.039-1.213,1.664-2.078C83.567,75.945,88.236,79.394,92.933,82.808z" fill="#CADCEC"/>
+<path d="M98.441,72.492c-0.565,1.53-0.882,2.277-1.585,3.733c-5.223-2.526-10.41-5.119-15.636-7.647 c0.422-0.871,0.611-1.318,0.95-2.232C87.607,68.369,93.007,70.469,98.441,72.492z" fill="#CADCEC"/>
+<path d="M101.011,60.691c-0.114,1.511-0.206,2.258-0.442,3.729c-5.713-0.943-11.411-1.944-17.122-2.888 c0.143-0.875,0.199-1.319,0.267-2.216C89.481,59.761,95.245,60.245,101.011,60.691z" fill="#CADCEC"/>
+<path d="M100.245,48.592c0.257,1.236,0.363,1.86,0.529,3.124c-5.738,0.756-11.468,1.563-17.207,2.318 c-0.103-0.742-0.169-1.109-0.326-1.836C88.914,51.016,94.572,49.771,100.245,48.592z" fill="#DEE9F3"/>
+<path d="M96.34,37.629c0.485,0.934,0.714,1.41,1.144,2.377c-5.322,2.35-10.613,4.766-15.936,7.116 c-0.263-0.572-0.402-0.856-0.697-1.41C86.025,43.036,91.165,40.305,96.34,37.629z" fill="#DEE9F3"/>
+<path d="M89.732,28.239c0.591,0.639,0.88,0.966,1.438,1.634c-4.491,3.734-8.971,7.481-13.462,11.214 c-0.337-0.399-0.512-0.594-0.87-0.977C81.137,36.154,85.432,32.195,89.732,28.239z" fill="#DEE9F3"/>
+<path d="M80.853,20.921c0.596,0.369,0.887,0.561,1.467,0.952c-3.299,4.817-6.644,9.6-9.943,14.415 c-0.347-0.236-0.523-0.35-0.877-0.573C74.6,30.772,77.751,25.865,80.853,20.921z" fill="#DEE9F3"/>
+<path d="M70.143,16.169c0.516,0.147,0.773,0.227,1.281,0.391c-1.817,5.518-3.716,11.004-5.534,16.523 c-0.3-0.099-0.452-0.145-0.757-0.235C66.776,27.278,68.501,21.739,70.143,16.169z" fill="#DEE9F3"/>
+<path d="M58.041,14.474c0.374,0,0.559,0.003,0.931,0.011c-0.126,5.781-0.263,11.561-0.39,17.341 c-0.216-0.005-0.324-0.005-0.542-0.005C58.041,26.037,58.04,20.256,58.041,14.474z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_08.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(-0.309 -0.951 0.952 -0.309 22.91 144.645)">
+<g transform="translate(6.998,7.107)">
+<path d="M47.321,15.354c4.218-1.155,6.435-1.479,10.947-1.479c0.001,5.782,0,11.563,0,17.345 c-2.868,0-4.246,0.201-6.833,0.903C50.082,26.528,48.671,20.95,47.321,15.354z" fill="#87A8CB"/>
+<path d="M36.518,19.979c3.556-2.126,5.473-2.998,9.468-4.234c1.524,5.544,3.107,11.07,4.632,16.616 c-2.441,0.752-3.591,1.282-5.703,2.571C42.132,29.938,39.302,24.971,36.518,19.979z" fill="#87A8CB"/>
+<path d="M27.353,27.22c2.759-2.828,4.303-4.103,7.616-6.272c2.996,4.865,6.032,9.706,9.029,14.572 c-1.958,1.312-2.858,2.083-4.451,3.784C35.485,35.275,31.417,31.248,27.353,27.22z" fill="#87A8CB"/>
+<path d="M20.356,36.545c1.85-3.284,2.959-4.835,5.451-7.66c4.285,3.804,8.567,7.615,12.85,11.42 c-1.434,1.699-2.063,2.629-3.108,4.589C30.477,42.123,25.428,39.312,20.356,36.545z" fill="#87A8CB"/>
+<path d="M16.053,47.414c0.853-3.518,1.476-5.225,3.04-8.458c5.256,2.442,10.49,4.934,15.747,7.374 c-0.878,1.926-1.223,2.94-1.695,5.02C27.441,50.059,21.755,48.708,16.053,47.414z" fill="#87A8CB"/>
+<path d="M14.969,59.252c-0.199-3.458-0.101-5.273,0.449-8.689c5.796,0.866,11.58,1.779,17.377,2.646 c-0.303,2.013-0.357,3.049-0.247,5.151C26.69,58.652,20.831,58.961,14.969,59.252z" fill="#A2C2DD"/>
+<path d="M17.333,70.732c-1.091-3.037-1.499-4.617-1.984-7.836c5.807-0.762,11.605-1.563,17.41-2.324 c0.267,1.949,0.492,2.9,1.104,4.726C28.347,67.094,22.848,68.936,17.333,70.732z" fill="#A2C2DD"/>
+<path d="M22.706,81.063c-1.751-2.494-2.522-3.818-3.817-6.573c5.288-2.298,10.559-4.637,15.848-6.934 c0.729,1.65,1.167,2.442,2.165,3.929C32.166,74.673,27.44,77.876,22.706,81.063z" fill="#A2C2DD"/>
+<path d="M30.573,89.686c-2.195-1.859-3.221-2.878-5.093-5.052c4.338-3.675,8.677-7.348,13.013-11.024 c1.079,1.293,1.673,1.897,2.956,2.998C37.831,80.975,34.19,85.319,30.573,89.686z" fill="#A2C2DD"/>
+<path d="M40.422,96.034c-2.451-1.155-3.632-1.829-5.87-3.337c3.063-4.779,6.171-9.527,9.234-14.307 c1.322,0.89,2.023,1.288,3.495,1.968C45.016,85.594,42.687,90.801,40.422,96.034z" fill="#A2C2DD"/>
+<path d="M51.738,99.553c-2.546-0.41-3.796-0.715-6.217-1.499c1.593-5.51,3.249-10.998,4.842-16.508 c1.473,0.46,2.24,0.639,3.818,0.878C53.381,88.136,52.537,93.841,51.738,99.553z" fill="#A2C2DD"/>
+<path d="M63.883,99.711c-2.384,0.312-3.623,0.389-6.069,0.362c0.054-5.782,0.112-11.563,0.168-17.344 c1.543,0.016,2.207-0.03,3.626-0.22C62.35,88.245,63.14,93.973,63.883,99.711z" fill="#CADCEC"/>
+<path d="M75.282,96.57c-1.972,0.85-2.991,1.218-5.078,1.822c-1.587-5.571-3.245-11.116-4.831-16.686 c1.244-0.365,1.852-0.589,3.03-1.105C70.673,85.934,73.011,91.236,75.282,96.57z" fill="#CADCEC"/>
+<path d="M85.205,90.586c-1.517,1.22-2.314,1.789-3.962,2.833c-3.078-4.919-6.202-9.808-9.277-14.727 c0.985-0.632,1.458-0.976,2.366-1.714C77.951,81.519,81.587,86.044,85.205,90.586z" fill="#CADCEC"/>
+<path d="M93.16,82.208c-1.041,1.439-1.598,2.132-2.777,3.453c-4.32-3.88-8.629-7.773-12.951-11.654 c0.707-0.796,1.039-1.212,1.663-2.077C83.794,75.346,88.463,78.795,93.16,82.208z" fill="#CADCEC"/>
+<path d="M98.67,71.893c-0.565,1.531-0.884,2.278-1.586,3.734c-5.222-2.526-10.41-5.12-15.636-7.647 c0.421-0.871,0.611-1.318,0.951-2.232C87.835,67.77,93.235,69.87,98.67,71.893z" fill="#CADCEC"/>
+<path d="M101.239,60.092c-0.114,1.511-0.206,2.257-0.443,3.729c-5.712-0.943-11.41-1.945-17.121-2.888 c0.143-0.876,0.199-1.318,0.266-2.217C89.71,59.163,95.473,59.646,101.239,60.092z" fill="#CADCEC"/>
+<path d="M100.473,47.993c0.256,1.236,0.363,1.861,0.53,3.123c-5.74,0.757-11.471,1.564-17.209,2.318 c-0.103-0.741-0.169-1.109-0.326-1.837C89.142,50.419,94.799,49.172,100.473,47.993z" fill="#DEE9F3"/>
+<path d="M96.568,37.03c0.485,0.933,0.714,1.41,1.143,2.378c-5.322,2.349-10.613,4.765-15.936,7.116 c-0.26-0.573-0.4-0.856-0.696-1.412C86.253,42.438,91.391,39.705,96.568,37.03z" fill="#DEE9F3"/>
+<path d="M89.96,27.641c0.59,0.638,0.88,0.965,1.438,1.634c-4.492,3.733-8.971,7.481-13.461,11.214 c-0.339-0.399-0.513-0.596-0.87-0.977C81.365,35.555,85.659,31.597,89.96,27.641z" fill="#DEE9F3"/>
+<path d="M81.082,20.323c0.595,0.368,0.886,0.559,1.466,0.952c-3.299,4.816-6.646,9.599-9.944,14.416 c-0.345-0.237-0.522-0.35-0.876-0.574C74.826,30.173,77.979,25.267,81.082,20.323z" fill="#DEE9F3"/>
+<path d="M70.372,15.57c0.515,0.148,0.773,0.226,1.28,0.391c-1.818,5.518-3.716,11.003-5.533,16.524 c-0.3-0.1-0.453-0.145-0.757-0.235C67.004,26.679,68.729,21.14,70.372,15.57z" fill="#DEE9F3"/>
+<path d="M58.269,13.875c0.372-0.001,0.559,0.003,0.93,0.01c-0.125,5.781-0.263,11.561-0.388,17.341 c-0.217-0.004-0.324-0.005-0.541-0.006C58.268,25.438,58.269,19.657,58.269,13.875z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_09.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(0.339 -0.94 0.941 0.339 -17.895 102.537)">
+<g transform="translate(6.998,7.107)">
+<path d="M47.168,14.693c4.218-1.157,6.435-1.48,10.948-1.481c-0.001,5.783-0.001,11.564,0,17.346 c-2.869-0.001-4.247,0.2-6.835,0.902C49.929,25.865,48.521,20.287,47.168,14.693z" fill="#87A8CB"/>
+<path d="M36.366,19.317c3.555-2.127,5.473-2.999,9.468-4.233c1.524,5.543,3.109,11.07,4.631,16.616 c-2.439,0.752-3.591,1.282-5.702,2.572C41.98,29.275,39.149,24.309,36.366,19.317z" fill="#87A8CB"/>
+<path d="M27.202,26.557c2.759-2.827,4.303-4.104,7.615-6.271c2.997,4.865,6.035,9.706,9.029,14.571 c-1.956,1.312-2.857,2.084-4.45,3.784C35.333,34.612,31.265,30.586,27.202,26.557z" fill="#87A8CB"/>
+<path d="M20.203,35.882c1.851-3.283,2.958-4.835,5.452-7.66c4.284,3.805,8.566,7.615,12.849,11.42 c-1.433,1.699-2.062,2.629-3.107,4.589C30.325,41.46,25.277,38.65,20.203,35.882z" fill="#87A8CB"/>
+<path d="M15.901,46.751c0.854-3.519,1.476-5.225,3.041-8.457c5.256,2.442,10.488,4.933,15.746,7.374 c-0.877,1.926-1.223,2.94-1.694,5.02C27.29,49.396,21.604,48.046,15.901,46.751z" fill="#87A8CB"/>
+<path d="M14.818,58.588c-0.2-3.458-0.102-5.272,0.449-8.689c5.795,0.866,11.58,1.779,17.376,2.646 c-0.304,2.014-0.356,3.049-0.246,5.152C26.536,57.989,20.679,58.298,14.818,58.588z" fill="#A2C2DD"/>
+<path d="M17.18,70.07c-1.09-3.037-1.5-4.616-1.984-7.835c5.808-0.764,11.605-1.564,17.41-2.326 c0.268,1.95,0.493,2.901,1.103,4.727C28.195,66.432,22.696,68.274,17.18,70.07z" fill="#A2C2DD"/>
+<path d="M22.553,80.401c-1.75-2.495-2.522-3.819-3.816-6.573c5.288-2.298,10.558-4.636,15.847-6.933 c0.731,1.65,1.169,2.441,2.165,3.928C32.014,74.01,27.286,77.214,22.553,80.401z" fill="#A2C2DD"/>
+<path d="M30.421,89.024c-2.194-1.859-3.221-2.879-5.093-5.053c4.337-3.675,8.677-7.347,13.013-11.022 c1.079,1.292,1.673,1.897,2.955,2.998C37.68,80.313,34.037,84.658,30.421,89.024z" fill="#A2C2DD"/>
+<path d="M40.27,95.372c-2.451-1.153-3.632-1.828-5.871-3.337c3.063-4.779,6.171-9.527,9.234-14.307 c1.322,0.89,2.025,1.288,3.496,1.969C44.864,84.932,42.534,90.139,40.27,95.372z" fill="#A2C2DD"/>
+<path d="M51.586,98.891c-2.546-0.411-3.795-0.716-6.215-1.5c1.592-5.509,3.248-10.998,4.841-16.508 c1.473,0.46,2.241,0.639,3.818,0.879C53.229,87.474,52.385,93.178,51.586,98.891z" fill="#A2C2DD"/>
+<path d="M63.731,99.049c-2.382,0.312-3.622,0.39-6.069,0.363c0.054-5.782,0.113-11.564,0.169-17.344 c1.542,0.017,2.206-0.03,3.626-0.221C62.199,87.581,62.988,93.31,63.731,99.049z" fill="#CADCEC"/>
+<path d="M75.13,95.908c-1.973,0.852-2.99,1.217-5.078,1.82c-1.586-5.568-3.243-11.114-4.83-16.684 c1.244-0.365,1.853-0.59,3.029-1.106C70.52,85.272,72.86,90.574,75.13,95.908z" fill="#CADCEC"/>
+<path d="M85.052,89.924c-1.517,1.221-2.313,1.79-3.962,2.834c-3.077-4.919-6.2-9.808-9.279-14.728 c0.986-0.632,1.46-0.976,2.368-1.714C77.798,80.858,81.435,85.382,85.052,89.924z" fill="#CADCEC"/>
+<path d="M93.009,81.546c-1.041,1.439-1.598,2.132-2.778,3.455c-4.321-3.88-8.63-7.776-12.951-11.656 c0.706-0.795,1.038-1.212,1.662-2.077C83.642,74.683,88.312,78.134,93.009,81.546z" fill="#CADCEC"/>
+<path d="M98.518,71.23c-0.565,1.53-0.883,2.277-1.586,3.734c-5.223-2.526-10.408-5.12-15.635-7.647 c0.421-0.871,0.61-1.318,0.95-2.232C87.682,67.107,93.082,69.209,98.518,71.23z" fill="#CADCEC"/>
+<path d="M101.087,59.43c-0.114,1.511-0.205,2.257-0.443,3.728c-5.712-0.944-11.409-1.944-17.121-2.888 c0.143-0.876,0.198-1.32,0.266-2.216C89.556,58.5,95.321,58.984,101.087,59.43z" fill="#CADCEC"/>
+<path d="M100.321,47.33c0.256,1.237,0.362,1.86,0.528,3.124c-5.739,0.756-11.469,1.563-17.208,2.319 c-0.103-0.741-0.168-1.11-0.326-1.837C88.991,49.756,94.647,48.511,100.321,47.33z" fill="#DEE9F3"/>
+<path d="M96.415,36.367c0.486,0.934,0.714,1.411,1.143,2.379c-5.323,2.35-10.613,4.765-15.935,7.116 c-0.262-0.573-0.401-0.855-0.697-1.41C86.101,41.775,91.24,39.043,96.415,36.367z" fill="#DEE9F3"/>
+<path d="M89.807,26.978c0.591,0.639,0.88,0.965,1.437,1.635c-4.49,3.731-8.97,7.48-13.46,11.213 c-0.337-0.399-0.513-0.594-0.87-0.976C81.213,34.894,85.508,30.934,89.807,26.978z" fill="#DEE9F3"/>
+<path d="M80.929,19.661c0.595,0.369,0.888,0.56,1.467,0.952c-3.3,4.817-6.646,9.598-9.944,14.415 c-0.346-0.236-0.522-0.349-0.877-0.573C74.676,29.511,77.828,24.605,80.929,19.661z" fill="#DEE9F3"/>
+<path d="M70.22,14.908c0.515,0.147,0.773,0.227,1.28,0.392c-1.819,5.519-3.716,11.003-5.534,16.523 c-0.3-0.1-0.452-0.146-0.756-0.237C66.853,26.017,68.577,20.478,70.22,14.908z" fill="#DEE9F3"/>
+<path d="M58.116,13.213c0.374-0.001,0.56,0.002,0.931,0.01c-0.126,5.782-0.264,11.561-0.388,17.341 c-0.217-0.004-0.326-0.004-0.542-0.005C58.116,24.776,58.117,18.995,58.116,13.213z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/svg_animation/wait_animation_10.svg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1 Tiny//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11-tiny.dtd">
+<svg width="100" height="100" viewBox="14.04 13.314 100 100">
+<g transform="matrix(1 0.001 -0.2 0.781 12.826 14.037)">
+<g transform="matrix(0.828 -0.562 0.563 0.828 -24.906 47.041)">
+<g transform="translate(6.998,7.107)">
+<path d="M46.635,14.263c4.217-1.156,6.435-1.481,10.947-1.482c0,5.784,0.001,11.566,0.001,17.347 c-2.869,0-4.246,0.199-6.835,0.902C49.396,25.437,47.987,19.857,46.635,14.263z" fill="#87A8CB"/>
+<path d="M35.833,18.886c3.555-2.126,5.473-2.998,9.467-4.234c1.524,5.543,3.107,11.07,4.632,16.616 c-2.44,0.752-3.592,1.282-5.702,2.571C41.447,28.845,38.616,23.878,35.833,18.886z" fill="#87A8CB"/>
+<path d="M26.667,26.127c2.76-2.827,4.303-4.103,7.617-6.272c2.996,4.865,6.033,9.705,9.029,14.571 c-1.958,1.312-2.857,2.084-4.45,3.785C34.798,34.182,30.732,30.156,26.667,26.127z" fill="#87A8CB"/>
+<path d="M19.671,35.453c1.848-3.283,2.957-4.835,5.45-7.66c4.283,3.805,8.565,7.616,12.849,11.421 c-1.433,1.699-2.063,2.628-3.107,4.587C29.792,41.031,24.743,38.22,19.671,35.453z" fill="#87A8CB"/>
+<path d="M15.367,46.321c0.854-3.519,1.477-5.226,3.041-8.457c5.257,2.442,10.488,4.934,15.746,7.375 c-0.877,1.925-1.223,2.94-1.695,5.021C26.757,48.966,21.07,47.616,15.367,46.321z" fill="#87A8CB"/>
+<path d="M14.285,58.16c-0.2-3.459-0.102-5.273,0.449-8.69c5.794,0.866,11.581,1.779,17.376,2.647 c-0.302,2.013-0.356,3.05-0.247,5.152C26.004,57.56,20.145,57.869,14.285,58.16z" fill="#A2C2DD"/>
+<path d="M16.648,69.639c-1.092-3.036-1.499-4.615-1.984-7.835c5.806-0.762,11.605-1.561,17.408-2.324 c0.268,1.95,0.493,2.902,1.105,4.727C27.661,66.002,22.162,67.845,16.648,69.639z" fill="#A2C2DD"/>
+<path d="M22.019,79.971c-1.749-2.495-2.521-3.819-3.815-6.573c5.288-2.298,10.558-4.636,15.848-6.934 c0.73,1.651,1.167,2.442,2.164,3.929C31.481,73.581,26.754,76.783,22.019,79.971z" fill="#A2C2DD"/>
+<path d="M29.888,88.594c-2.194-1.859-3.22-2.878-5.093-5.051c4.338-3.675,8.678-7.348,13.013-11.024 c1.079,1.292,1.673,1.897,2.956,2.997C37.146,79.882,33.505,84.227,29.888,88.594z" fill="#A2C2DD"/>
+<path d="M39.736,94.943c-2.45-1.156-3.632-1.83-5.871-3.339c3.063-4.778,6.171-9.526,9.234-14.306 c1.322,0.889,2.024,1.287,3.496,1.968C44.33,84.502,42.002,89.708,39.736,94.943z" fill="#A2C2DD"/>
+<path d="M51.053,98.46c-2.547-0.41-3.796-0.715-6.217-1.499c1.593-5.511,3.249-10.999,4.842-16.509 c1.473,0.46,2.239,0.641,3.818,0.879C52.695,87.042,51.851,92.748,51.053,98.46z" fill="#A2C2DD"/>
+<path d="M63.197,98.62c-2.383,0.311-3.622,0.388-6.068,0.36c0.054-5.782,0.111-11.562,0.167-17.344 c1.544,0.018,2.208-0.031,3.626-0.219C61.664,87.153,62.454,92.881,63.197,98.62z" fill="#CADCEC"/>
+<path d="M74.597,95.477c-1.972,0.851-2.991,1.218-5.078,1.821c-1.587-5.569-3.244-11.115-4.831-16.685 c1.244-0.365,1.853-0.59,3.029-1.105C69.987,84.841,72.326,90.142,74.597,95.477z" fill="#CADCEC"/>
+<path d="M84.52,89.493c-1.517,1.22-2.313,1.79-3.962,2.833c-3.078-4.919-6.201-9.809-9.278-14.728 c0.985-0.632,1.459-0.975,2.367-1.713C77.266,80.427,80.901,84.953,84.52,89.493z" fill="#CADCEC"/>
+<path d="M92.476,81.117c-1.041,1.439-1.598,2.131-2.778,3.453c-4.321-3.881-8.63-7.774-12.951-11.655 c0.706-0.796,1.038-1.212,1.663-2.076C83.108,74.253,87.779,77.702,92.476,81.117z" fill="#CADCEC"/>
+<path d="M97.984,70.8c-0.566,1.53-0.883,2.278-1.585,3.734c-5.225-2.526-10.411-5.12-15.636-7.646 c0.421-0.872,0.61-1.318,0.951-2.232C87.149,66.678,92.549,68.777,97.984,70.8z" fill="#CADCEC"/>
+<path d="M100.553,59c-0.114,1.511-0.204,2.258-0.443,3.729c-5.712-0.942-11.41-1.944-17.121-2.889 c0.143-0.875,0.199-1.318,0.266-2.216C89.024,58.07,94.787,58.554,100.553,59z" fill="#CADCEC"/>
+<path d="M99.788,46.9c0.256,1.237,0.363,1.86,0.528,3.125c-5.739,0.755-11.468,1.562-17.208,2.318 c-0.103-0.742-0.168-1.111-0.325-1.838C88.458,49.326,94.114,48.081,99.788,46.9z" fill="#DEE9F3"/>
+<path d="M95.882,35.938c0.485,0.933,0.715,1.409,1.143,2.376c-5.323,2.351-10.613,4.767-15.936,7.117 c-0.261-0.574-0.4-0.855-0.697-1.41C85.568,41.345,90.707,38.612,95.882,35.938z" fill="#DEE9F3"/>
+<path d="M89.274,26.548c0.591,0.64,0.881,0.966,1.439,1.633c-4.492,3.734-8.971,7.483-13.462,11.215 c-0.338-0.399-0.513-0.595-0.87-0.977C80.679,34.464,84.974,30.504,89.274,26.548z" fill="#DEE9F3"/>
+<path d="M80.396,19.23c0.596,0.369,0.888,0.56,1.467,0.952c-3.299,4.816-6.645,9.598-9.944,14.416 c-0.345-0.237-0.521-0.351-0.877-0.574C74.141,29.082,77.295,24.174,80.396,19.23z" fill="#DEE9F3"/>
+<path d="M69.686,14.477c0.515,0.148,0.772,0.227,1.28,0.391c-1.817,5.519-3.716,11.005-5.535,16.523 c-0.299-0.098-0.452-0.144-0.757-0.234C66.32,25.586,68.044,20.048,69.686,14.477z" fill="#DEE9F3"/>
+<path d="M57.583,12.782c0.373,0.001,0.559,0.004,0.931,0.011c-0.125,5.781-0.263,11.561-0.389,17.342 c-0.216-0.004-0.325-0.006-0.542-0.006C57.583,24.345,57.583,18.563,57.583,12.782z" fill="#FFFFFF"/>
+</g>
+</g>
+</g>
+</svg>
\ No newline at end of file
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_1.tpf has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_2.tpf has changed
Binary file configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/content/themes/mock_theme_3.tpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/data/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Data layer">
+  <xi:include href="confml/data.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/testdata/generate/project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="base/root.confml"/>
+  <xi:include href="custom/root.confml"/>
+  <xi:include href="data/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/unittest_crml_dc.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,189 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+TEMP_DIR        = os.path.normpath(os.path.join(ROOT_PATH, 'temp/crml_dc'))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action='compare'):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+        assert os.path.split(SOURCE_ROOT)[1] == 'source'
+        cmd = 'python "%s" %s' % (os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts/cone_tool.py')), action)
+        return cmd
+
+def get_crml_dc_testdata_dir():
+    # If running from the working copy
+    dir1 = os.path.normpath(os.path.join(ROOT_PATH, '../ConeCRMLPlugin/CRMLPlugin/tests'))
+    if os.path.isdir(dir1): return dir1
+    
+    # If running from standalone
+    dir2 = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/compare/crml_dc'))
+    if os.path.isdir(dir2): return dir2
+    
+    raise RuntimeError("CRML DC test data found neither in '%s' nor '%s'!" % (dir1, dir2))
+
+
+class TestCompareAction(BaseTestCase):
+    
+    def setUp(self):
+        if not os.path.exists(TEMP_DIR):
+            os.makedirs(TEMP_DIR)
+    
+    def _run_crml_dc_test(self, crml_file_name_without_extension, do_filtering=True):
+        testdata_dir = get_crml_dc_testdata_dir()
+        report_file = 'crml_dc_%s.csv' % crml_file_name_without_extension
+        if do_filtering:
+            impl_filter = '%s' % crml_file_name_without_extension
+        else:
+            impl_filter = '.*'
+        self._run_comparison_test(
+            source_project  = os.path.join(testdata_dir, 'comp_project_1'),
+            source_conf     = 'root.confml',
+            target_project  = os.path.join(testdata_dir, 'comp_project_2'),
+            target_conf     = 'root.confml',
+            report_type     = 'crml_dc_csv',
+            report_file     = report_file,
+            impl_filter     = impl_filter,
+            check_against_expected_output = True)
+    
+    def test_crml_dc_00000001_simple_keys(self):        self._run_crml_dc_test('00000001_simple_keys')
+    def test_crml_dc_00000002_bitmask_keys(self):       self._run_crml_dc_test('00000002_bitmask_keys')
+    def test_crml_dc_00000003_key_ranges(self):         self._run_crml_dc_test('00000003_key_ranges')
+    def test_crml_dc_00000004_key_type_changed(self):   self._run_crml_dc_test('00000004_key_type_changed')
+    def test_crml_dc_00000005_repo_attrs_changed(self): self._run_crml_dc_test('00000005_repo_attrs_changed')
+    def test_crml_dc_10000001_removed_repo(self):       self._run_crml_dc_test('10000001_removed_repo')
+    def test_crml_dc_20000001_added_repo(self):         self._run_crml_dc_test('20000001_added_repo')
+    def test_crml_dc_00000006_renamed_repo(self):       self._run_crml_dc_test('00000006_renamed_repo')
+    def test_crml_dc_30000000_duplicate_repo(self):     self._run_crml_dc_test('30000000_duplicate_repo')
+    def test_crml_dc_all(self):                         self._run_crml_dc_test('all', do_filtering=False)
+    
+    def test_crml_dc_html_report(self):
+        testdata_dir = get_crml_dc_testdata_dir()
+        
+        # Ignore the portion of the data where the path to the target is shown
+        ignore_patterns = [r'<tr>\s*<td>Target:</td>\s*<td>.*[\\,/]comp_project_2;root.confml</td>']
+        
+        self._run_comparison_test(
+            source_project  = os.path.join(testdata_dir, 'comp_project_1'),
+            source_conf     = 'root.confml',
+            target_project  = os.path.join(testdata_dir, 'comp_project_2'),
+            target_conf     = 'root.confml',
+            report_type     = 'crml_dc',
+            report_file     = 'crml_dc.html',
+            check_against_expected_output = True,
+            data_ignore_patterns = ignore_patterns)
+    
+    def _run_comparison_test(self, **kwargs):
+        """
+        Run comparison test.
+        
+        @param source_project: The source project, relative to the test data directory or an
+            absolute path.
+        @param source_conf: The source configuration.
+        @param target_project: The target project, relative to the test data directory
+            If not given or None, the source project will be used also for this.
+        @param target_conf: The target configuration.
+        @param template: The template file used for the report, relative to the test data directory.
+        @param report_type: The report type. Should not be used with the 'template' parameter.
+        @param report_file: The location where the report is written. This will also be used as
+            the name of the expected report file against which the actual report is checked.
+        @param impl_filter: Implementation filter to use.
+        @param check_against_expected_output: If True, the actual report is checked against an
+            expected file with the same name. Otherwise it is just checked that the output
+            file has been created and it contains something.
+        @param data_ignore_patterns: List of regular expression patterns for ignoring some portions
+            of the data when checking against expected output. The patterns are used to remove
+            data portions before doing the actual comparison.
+        """
+        # Get parameters
+        # ---------------
+        def get_project_absdir(project_dir):
+            if os.path.isabs(project_dir):
+                return project_dir
+            else:
+                return os.path.normpath(os.path.join(TESTDATA_DIR, project_dir))
+        
+        source_conf = kwargs['source_conf']
+        target_conf = kwargs['target_conf']
+        source_project = get_project_absdir(kwargs['source_project'])
+        target_project = kwargs.get('target_project', None)
+        
+        if target_project != None:
+            target_project = get_project_absdir(target_project)
+            target_conf = target_project + ';' + target_conf
+        
+        template = kwargs.get('template', None)
+        report_type = kwargs.get('report_type', None)
+        if template and report_type:
+            raise ValueError("Both 'template' and 'report_type' parameters given")
+        elif not template and not report_type:
+            raise ValueError("Neither 'template' not 'report_type' parameter given")
+        elif template:
+            template = os.path.normpath(os.path.join(TESTDATA_DIR, template))
+        
+        report_file = kwargs['report_file']
+        check_against_expected_output = kwargs['check_against_expected_output']
+        actual_report = os.path.normpath(os.path.join(TEMP_DIR, report_file))
+        
+        impl_filter = kwargs.get('impl_filter', None)
+        
+        
+        # Generate output
+        # ----------------
+        if report_type:
+            command = '%s -p "%s" -s "%s" -t "%s" --report-type "%s" --report "%s"' \
+                % (get_cmd(), source_project, source_conf, target_conf, report_type, actual_report)
+        else:
+            command = '%s -p "%s" -s "%s" -t "%s" --template "%s" --report "%s"' \
+                % (get_cmd(), source_project, source_conf, target_conf, template, actual_report)
+        
+        if impl_filter:
+            command += ' --impl-filter "%s"' % impl_filter
+        
+        self.remove_if_exists(actual_report)
+        self.run_command(command)
+        
+        
+        # Check output
+        # -------------
+        if check_against_expected_output:
+            expected_report = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/crml_dc_expected', report_file))
+            ignore_patterns = kwargs.get('data_ignore_patterns', [])
+            self.assert_file_contents_equal(expected_report, actual_report, ignore_patterns)
+        else:
+            self.assert_exists_and_contains_something(actual_report)
+        
+        
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/integration-test/unittest_generate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,155 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import zip_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action='generate'):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+        assert os.path.split(SOURCE_ROOT)[1] == 'source'
+        cmd = 'python "%s" %s' % (os.path.normpath(os.path.join(SOURCE_ROOT, 'scripts/cone_tool.py')), action)
+        return cmd
+
+class TestSymbianGenerateAllImplsOnLastLayer(BaseTestCase):
+    
+    def _prepare_workdir(self, workdir):
+        workdir = os.path.join(ROOT_PATH, workdir)
+        self.recreate_dir(workdir)
+        
+        # Get the binaries needed for ImageML to work
+        bin_target_dir = os.path.join(workdir, "bin")
+        self.recreate_dir(bin_target_dir)
+        bin_source_dir = os.path.join(ROOT_PATH, "testdata/generate/imageplugin_bin")
+        for name in os.listdir(bin_source_dir):
+            source_path = os.path.join(bin_source_dir, name)
+            target_path = os.path.join(bin_target_dir, name)
+            if os.path.isfile(source_path):
+                shutil.copy2(source_path, target_path)
+        
+        # Create the mock carbide.ui directory
+        target_dir = os.path.join(workdir, "mock_carbide_ui")
+        self.recreate_dir(target_dir)
+        def copy_file(file_name):
+            source_file = os.path.join(ROOT_PATH, "testdata/generate/mock_carbide_ui", file_name)
+            target_file = os.path.join(target_dir, file_name)
+            shutil.copy2(source_file, target_file)
+        copy_file('makepackage.bat')
+        copy_file('makepackage.py')
+        
+        return workdir
+    
+    def test_generate_all_impls_on_last_layer_on_file_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll1', project_dir)
+    
+    def test_generate_all_impls_on_last_layer_on_zip_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "testdata/generate/project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        project_zip = os.path.join(ROOT_PATH, "temp/generation_test_project.zip")
+        self.remove_if_exists(project_zip)
+        zip_dir.zip_dir(project_dir, project_zip, [zip_dir.SVN_IGNORE_PATTERN])
+        self.assert_exists_and_contains_something(project_zip)
+        
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll2', project_zip)
+    
+    def _run_test_generate_all_impls_on_last_layer(self, workdir, project):
+        # Create a temp workdir and go there to run the test
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir(workdir)
+        os.chdir(workdir)
+        
+        try:
+            # Run the generation command
+            cmd = '%s -p "%s" --output output --layer -1 --add-setting-file imaker_variantdir.cfg' % (get_cmd(), project)
+            self.run_command(cmd)
+            
+            # Check that all expected output files are generated
+            def check(path):
+                self.assert_exists_and_contains_something("output/" + path)
+            
+            try:
+                check("content/animations/anim1.mbm")
+                check("content/animations/anim2.mif")
+            except AssertionError:
+                if ' ' in ROOT_PATH:
+                    self.fail("Known bug (#177)")
+                else:
+                    raise
+            
+            check("content/data/sounds/test.mp3")
+            check("content/data/sequence_setting_test.txt")
+            check("content/private/10202BE9/10000000.txt")
+            check("content/private/10202BE9/12341001.txt")
+            check("content/private/10202BE9/12341002.txt")
+            check("content/private/10202BE9/20000000.txt")
+            check("content/sound_folder/test2.mp3")
+            check("hcr_test.h")
+            check("content/private/10207114/import/12340001/themepackage.mbm")
+            check("content/private/10207114/import/12340001/themepackage.mif")
+            check("content/private/10207114/import/12340001/themepackage.skn")
+            
+            # Check that files that should not have been generated are not
+            def check_not_gen(path):
+                self.assertFalse(os.path.exists("output/" + path),
+                                 "'%s' was generated when it should not have been!" % path)
+            check_not_gen("content/private/10202BE9/ABCD0000.txt")
+            check_not_gen("content/private/10202BE9/12341000.txt")
+            
+            # Check that the data has been generated correctly
+            self.assert_file_contains(
+                "output/content/private/10202BE9/12341002.txt",
+                "0x1 int 42 0 cap_rd=alwayspass cap_wr=WriteDeviceData",
+                encoding='utf-16')
+            self.assert_file_contains(
+                "output/content/private/10202BE9/10000000.txt",
+                r'0x1 string "Z:\\data\\sounds\\test.mp3" 0 cap_rd=alwayspass cap_wr=WriteDeviceData',
+                encoding='utf-16')
+            self.assert_file_contains(
+                "output/content/private/10202BE9/12341001.txt",
+                u'0x1 string "default string カタカナ <&> カタカナ" 0 cap_rd=alwayspass cap_wr=WriteDeviceData',
+                encoding='utf-16')
+            self.assert_file_contains(
+                "output/content/private/10202BE9/20000000.txt",
+                ['0x11 string "305397761" 0',
+                 '0x12 string "305397761" 0',
+                 '0x13 string "305397761" 0',
+                 '0x21 string "305397762" 0',
+                 '0x22 string "305397762" 0'],
+                encoding='utf-16')
+        finally:
+            os.chdir(orig_workdir)
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/plugins/symbian/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys, os, re, unittest
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+PLUGINS_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '..'))
+assert os.path.split(PLUGINS_ROOT)[1] == 'plugins'
+if PLUGINS_ROOT not in sys.path: sys.path.append(PLUGINS_ROOT)
+import plugin_utils
+
+if __name__ == "__main__":
+    # Collect a list of plug-in source paths and plug-in module names
+    paths_and_modnames = plugin_utils.find_plugin_sources(ROOT_PATH)
+    # Create a test suite from them
+    suite = plugin_utils.collect_suite_from_source_list(paths_and_modnames)
+    # Run the suite
+    unittest.TextTestRunner(verbosity=2).run(suite)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,158 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+# Script for running all ConE unit tests (cone, plug-ins and scripts).
+#
+
+import os, sys, re, imp
+import unittest
+
+# Path to the directory where this file is located
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+# For module 'testautomation'
+sys.path.append(os.path.join(ROOT_PATH, 'testautomation'))
+
+from testautomation import testcli
+import cone
+import cone.public.plugin
+
+def _load_module(path):
+    if not path.endswith('.py'):
+        raise ValueError("Given parameter ('%s') is not a .py file" % path)
+    
+    dir = os.path.dirname(path)
+    sys.path.insert(0, dir)
+    try:
+        modname = path.replace('.', '_')
+        return imp.load_source(modname, path)
+    finally:
+        del sys.path[0]
+        # Since the module name __init__ is needed in many places,
+        # but its contents may differ, remove it from sys.modules
+        # in order to force reloading every time
+        if '__init__' in sys.modules:
+            del sys.modules['__init__']
+
+def _collect_unittest_suite_from_file(file_path):
+    suite = unittest.TestSuite()
+    module = _load_module(file_path)
+    suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+    return suite
+
+
+def _find_unittest_files(path, recursive=True):
+    """
+    Find all unittest_*.py files under the given directory.
+    """
+    pattern = re.compile(r'^unittest_.*\.py$')
+    unittest_files = []
+    if recursive:
+        for root, dirs, files in os.walk(path, topdown=True):
+            for filename in files:
+                if pattern.match(filename) != None:
+                    filepath = os.path.abspath(os.path.join(root, filename))
+                    unittest_files.append(filepath)
+    else:
+        for filename in os.listdir(path):
+            if pattern.match(filename) != None:
+                filepath = os.path.abspath(os.path.join(path, filename))
+                unittest_files.append(filepath)
+    
+    return unittest_files
+
+def _collect_unittest_suite_from_path(path, recursive=True):
+    """
+    Collect a test suite containing all test cases loaded from
+    unittest_*.py files in the given directory.
+    """
+    path = os.path.abspath(path)
+    
+    # Collect the list of .py files containing unit tests
+    unittest_files = _find_unittest_files(path, recursive)
+    
+    # Load the files as modules and load tests from them
+    suite = unittest.TestSuite()
+    for file in unittest_files:
+        module = _load_module(file)
+        suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+    return suite
+
+def _collect_suite():
+    def get_suite(path):
+        return _collect_unittest_suite_from_path(os.path.join(ROOT_PATH, path))
+    def get_suite_from_file(file_path):
+        return _collect_unittest_suite_from_file(os.path.join(ROOT_PATH, file_path))
+    
+    suite = unittest.TestSuite()
+    suite.addTests(get_suite('cone'))
+    suite.addTests(get_suite('scripts/tests'))
+    suite.addTests(get_suite('plugins'))
+    suite.addTests(get_suite('testautomation'))
+    
+    # Tests can also be loaded from a file:
+    #suite.addTests(get_suite_from_file('cone/public/tests/unittest_rules_on_configuration.py'))
+    
+    
+    # Force-reload all ConE plug-in reader classes, since the __init__.py
+    # files in the imported test cases have added plug-in sources to sys.path
+    cone.public.plugin.ImplFactory.force_reload_reader_classes()
+    
+    return suite
+
+def _run_without_nose():
+    suite = _collect_suite()
+    unittest.TextTestRunner(verbosity=2).run(suite)
+
+def _run_with_nose():
+    # Call plugin_utils.init_all() so that all plug-ins are loaded
+    # (otherwise script tests, plug-in unit tests and plug-in integration
+    # tests would not work)
+    PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, 'plugins'))
+    assert os.path.isdir(PLUGIN_SOURCE_ROOT)
+    sys.path.append(PLUGIN_SOURCE_ROOT)
+    import plugin_utils
+    plugin_utils.init_all()
+    
+    # Find all unittest_*.py files
+    test_files = []
+    def add_tests(path):
+        test_files.extend(_find_unittest_files(os.path.join(ROOT_PATH, path)))
+    add_tests('cone')
+    add_tests('scripts/tests')
+    add_tests('plugins')
+    add_tests('testautomation')
+    
+    
+    # Configure nose
+    import nose
+    plugins = nose.plugins.manager.DefaultPluginManager()
+    conf = nose.config.Config(plugins=plugins, testNames=test_files)
+    
+    # Run the tests
+    args = ['--verbosity=3',
+            '--with-xunit',
+            '--xunit-file=cone-alltests.xml',
+            #'--collect-only',
+            ]
+    nose.run(config=conf, argv=[sys.argv[0]] + args)
+
+def main():
+    if '--with-nose' in sys.argv:
+        _run_with_nose()
+    else:
+        _run_without_nose()
+
+if __name__ == '__main__':
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/compare_api_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,92 @@
+{% extends "cone_base.html" %}
+{% block title %}Compare API{% endblock %}
+{% block content %}
+    <h1>Configuration API compare</h1><br>
+    {% set columns = {'fqr':'Full reference',
+                       'name':'Name',
+                       'type':'Type',
+                       'desc':'Description',
+                       } %}
+    
+    <table class="report">
+    <tr>
+        <th class="featureName" colspan="{{ columns|length }}">{{ data.sourcedata.name }}</th>
+        <th class="featureName">&nbsp;</th>
+        <th class="featureName" colspan="{{ columns|length }}">{{ data.targetdata.name }}</th>
+    </tr>
+    <tr>
+        {%- for item in columns -%}
+        <th class="featureName">{{ columns[item] }}</th>
+        {%- endfor -%}
+        
+        <th class="featureName">&nbsp;</th>
+        
+        {%- for item in columns -%}
+        <th class="featureName">{{ columns[item] }}</th>
+        {%- endfor -%}
+    </tr>
+    {%- for fqr in data.sourcedata.features -%}
+       {%- if fqr in data.targetdata.features and not data.sourcedata.features[fqr]._compare(data.targetdata.features[fqr], columns.keys()) -%}
+       <!-- report all rows that have some column different  -->
+           <tr>
+           {%- for colname in columns -%} 
+              {%- if data.sourcedata.features[fqr][colname] != data.targetdata.features[fqr][colname] %}
+                <td bgcolor="yellow">"{{ data.sourcedata.features[fqr][colname] }}"</td>
+              {%- else %}
+                <td>{{ data.sourcedata.features[fqr][colname] }}</td>
+              {%- endif -%}
+           {%- endfor -%}
+           
+           <td>&nbsp;</td>
+           
+           {%- for colname in columns -%} 
+              {%- if data.sourcedata.features[fqr][colname] != data.targetdata.features[fqr][colname] %}
+                <td bgcolor="yellow">"{{ data.targetdata.features[fqr][colname] }}"</td>
+              {%- else %}
+                <td>{{ data.targetdata.features[fqr][colname] }}</td>
+              {%- endif -%}
+           {%- endfor -%}
+           </tr>
+       {% endif -%}
+    {%- endfor -%}
+    
+    
+    {#- ----------------------------------------- -#}
+    {#- Report features that are only on one side -#}
+    {#- ----------------------------------------- -#}
+    
+    {%- for fqr in data.sourcedata.features -%}
+       {%- if fqr not in data.targetdata.features -%}
+           <tr>
+           {%- for colname in columns -%} 
+                <td>{{ data.sourcedata.features[fqr][colname] }}</td>
+           {%- endfor -%}
+           
+           <td>&nbsp;</td>
+           
+           {%- for colname in columns -%} 
+              <td></td>
+           {%- endfor -%}
+           </tr>
+       {% endif -%}
+    {%- endfor -%}
+    
+    {%- for fqr in data.targetdata.features -%}
+       {%- if fqr not in data.sourcedata.features -%}
+           <tr>
+           {%- for colname in columns -%} 
+              <td></td>
+           {%- endfor -%}
+           
+           <td>&nbsp;</td>
+           
+           {%- for colname in columns -%} 
+                <td>{{ data.targetdata.features[fqr][colname] }}</td>
+           {%- endfor -%}
+           </tr>
+       {% endif -%}
+    {%- endfor -%}
+    
+    
+    </table>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/compare_data_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+{% extends "cone_base.html" %}
+{% block title %}Compare data{% endblock %}
+{% block content %}
+    <h1>Configuration data comparison</h1><br>
+    
+    <table class="report">
+      <tr>
+        <td>Source:</td>
+        <td>{{ data.sourcedata.name }}</td>
+      </tr>
+      <tr>
+        <td>Target:</td>
+        <td>{{ data.targetdata.name }}</td>
+      </tr>
+    </table>
+    
+    <br/>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">Full reference</th>
+        <th class="featureName">Name</th>
+        <th class="featureName">Source value</th>
+        <th class="featureName">Target value</th>
+    </tr>
+    {%- for fqr in data.sourcedata.features|sort -%}
+       {%- if fqr in data.targetdata.features and not data.sourcedata.features[fqr]._compare(data.targetdata.features[fqr], ['value']) -%}
+           <tr>
+              <td>{{ data.sourcedata.features[fqr]['fqr'] }}</td>
+              <td>{{ data.sourcedata.features[fqr]['name'] }}</td>
+              <td>{{ data.sourcedata.features[fqr]['value'] }}</td>
+              <td>{{ data.targetdata.features[fqr]['value'] }}</td>
+           </tr>
+       {% endif -%}
+    {%- endfor -%}
+
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/cone_base.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,121 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+{% block head %}
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>{% block title %}{% endblock %} - ConE</title>
+{% endblock head %}
+</head>
+<body>
+<div id="content">{% block content %}{% endblock %}</div>
+<div id="footer">{% block footer %}{% endblock %}</div>
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/cone_common.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,283 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#!/usr/bin/env python
+## 
+# @author Teemu Rytkonen
+
+import os
+import sys
+import logging
+import logging.config
+import re, fnmatch
+from optparse import Option
+import cone_tool
+
+
+""" 
+try to import cone and modify the sys.paths if it does not succeed.
+This is done mainly for local installation and testing purposes. 
+"""
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+try:
+    from cone.public import api, settings
+except ImportError:
+    sys.path.append(os.path.join(ROOT_PATH))
+    sys.path.append(os.path.join(ROOT_PATH,'..'))
+    from cone.public import api, settings
+
+# Common command line options used by all sub-actions
+COMMON_OPTIONS = [
+    Option("--print-settings",
+           dest="print_settings",
+           action="store_true",
+           help="Print all the default settings from the current setting container.",
+           default=False),
+    
+    Option("--print-supported-impls",
+           action="store_true",
+           help="Print all supported ImplML XML namespaces and file extensions.",
+           default=False),
+    
+    Option("--print-runtime-info",
+           action="store_true",
+           help="Print runtime information about ConE.",
+           default=False),
+    
+    Option("-v", "--verbose",\
+          dest="verbose",\
+          help="""Print error, warning and information on system out.
+                  Possible choices: Default is 3. 
+                                    NONE (all)    0
+                                    CRITICAL      1
+                                    ERROR         2
+                                    WARNING       3
+                                    INFO          4
+                                    DEBUG         5""",
+          metavar="LEVEL",
+          default="3"),
+    
+    Option("--log-file",
+           dest="log_file",
+           action="store",
+           type="string",
+           help="Location of the used log file. Default is 'cone.log'",
+           metavar="FILE",
+           default="cone.log"),
+
+    Option("--log-config",
+           dest="log_conf",
+           action="store",
+           type="string",
+           help="Location of the used logging configuration file. Default is 'logging.ini'",
+           metavar="FILE"),
+           
+    Option("--username",
+           dest="username",
+           action="store",
+           type="string",
+           help="Username for webstorage operations. Not needed for filestorage or cpf storage. If the username \
+           is not given, the tool will use the loggged in username.",
+           metavar="USERNAME"),
+
+    Option("--password",
+           dest="password",
+           action="store",
+           type="string",
+           help="Password for webstorage operations. Not needed for filestorage or cpf storage. If the password \
+           is not given, the tool will prompt for password if needed.",
+           metavar="PASSWORD"),
+]
+
+def handle_common_options(options, settings=None):
+    """
+    Handle common command line options.
+    @param options: The parsed command line options.
+    @param settings: The settings to print if --print-settings is used.
+    Can be None, in which case the default settings are printed.
+    """
+    if options.log_conf:
+        open_log(options.verbose, options.log_file, options.log_conf)
+    else:
+        open_log(options.verbose, options.log_file)
+    
+    exit = False
+    
+    if options.print_settings:
+        if settings == None:
+            settings = get_settings([])
+        print_settings(settings)
+        exit = True
+    
+    if options.print_supported_impls:
+        from cone.public import plugin
+        print "Supported ImplML namespaces:"
+        for ns in sorted(plugin.get_supported_namespaces()):
+            print ns
+        
+        print ""
+        print "Supported ImplML file extensions:"
+        for ns in plugin.get_supported_file_extensions():
+            print ns
+        exit = True
+    
+    if options.print_runtime_info:
+        print _get_runtime_info()
+        print "\nsys.path contents:"
+        print '\n'.join(sys.path)
+        exit = True
+    
+    if exit: sys.exit()
+    
+def _get_runtime_info():
+    if hasattr(sys, 'executable'):  executable = sys.executable
+    else:                           executable = 'N/A'
+    info = ["ConE version:    %s" % cone_tool.VERSION,
+            "Python version:  %s" % sys.version,
+            "Platform:        %s" % sys.platform,
+            "Executable:      %s" % executable,
+            "Command line:    %s" % ' '.join(sys.argv),
+            "Working dir:     %s" % os.getcwd(),
+            "Script location: %s" % ROOT_PATH]
+    return '\n'.join(info)
+
+def open_log(verbose, log_file, log_conf_file=os.path.join(ROOT_PATH, 'logging.ini')):
+    try:
+        log_dir = os.path.dirname(log_file)
+        if log_dir != '' and not os.path.exists(log_dir):
+            os.makedirs(log_dir)
+        
+        if (os.path.exists(log_conf_file)):
+            defaults = {'logfile': log_file, 'level': get_log_level_for_config(verbose)}
+            logging.config.fileConfig(log_conf_file, defaults)
+        else:
+            print "Failed to load logging configuration file: %s" % log_conf_file
+        
+        logger = logging.getLogger('cone')
+        logger.info("Runtime info:\n%s" % _get_runtime_info())
+        logger.debug("sys.path contents:\n%s" % '\n'.join(sys.path))
+        
+        def get_var(varname):
+            try:                return os.environ[varname]
+            except KeyError:    return 'N/A'
+        logger.debug("PATH: %s" % get_var('PATH'))
+        logger.debug("PYTHONPATH: %s" % get_var('PYTHONPATH'))
+    except IOError, e:
+        print "Cannot create log file. ", e
+
+def get_settings(files):
+    parser = settings.SettingsFactory.cone_parser()
+    parser.read(files)
+    return parser
+
+def print_settings(parser):
+    print_section(parser,"DEFAULT")
+    for section in parser.sections():
+        print_section(parser,section)
+
+def print_section(parser, section):
+    print "[%s]" % section
+    for (name,value) in parser.items(section):
+        print "  %s = %s" % (name,value)
+
+
+def get_log_level(level):
+    """
+    Change the given user input log level to logging categorisation
+    """
+    # If the level is empty, revert to the default
+    if level in ('', None):
+        level = '3'
+    
+    if level == '0' : return logging.NOTSET
+    elif level == '1' : return logging.CRITICAL
+    elif level == '2' : return logging.ERROR
+    elif level == '3' : return logging.WARNING
+    elif level == '4' : return logging.INFO
+    elif level == '5' : return logging.DEBUG
+    else : return logging.NOTSET
+
+def get_log_level_for_config(level):
+    """
+    Change the given user input to log level to logging configuration file
+    """
+
+    # If the level is empty, revert to the default
+    if level in ('', None):
+        level = 'WARNING'
+    
+    if level == '0' : return 'NOTSET'
+    elif level == '1' : return 'CRITICAL'
+    elif level == '2' : return 'ERROR'
+    elif level == '3' : return 'WARNING'
+    elif level == '4' : return 'INFO'
+    elif level == '5' : return 'DEBUG'
+    else : return 'NOTSET'
+
+
+class ConfigurationNotFoundError(Exception):
+    """
+    Exception raised by get_config_list_from_project() if an invalid
+    configuration is given.
+    """
+    pass
+
+def get_config_list_from_project(project, configs, config_wildcards, config_regexes):
+    """
+    Return a list of configuration root names based on the given parameters.
+    @param project: The project from which to get the configuration list.
+    @param configs: List of configuration names to add. All of these should exist
+        in the project, or a ConfigurationNotFoundError is raised.
+    @param config_wildcards: List of wildcard patterns for including configurations.
+    @param config_regexs: List of regular expression patters for including configurations.
+    @return: A distinct list of configuration names matched by the given parameters. The
+        list contains matched configurations in the following order:
+            1. Configurations specified in configs
+            2. Configurations matched by wildcard patterns
+            3. Configurations matched by regular expressions
+        If a configuration is matched by more than one of these, the first match determines
+        its placement in the list.
+    @raise ConfigurationNotFoundError: A configuration specified in configs is not
+        actually found in the project.
+    """
+    config_list = []
+        
+    configs_in_project = sorted(project.list_configurations())
+    
+    # Handle configurations specified with --configuration first
+    for config in configs:
+        if config not in configs_in_project:
+            raise ConfigurationNotFoundError("No such configuration: %s" % config)
+        if config not in config_list:
+            config_list.append(config)
+    
+    # Then handle wildcards
+    if config_wildcards:
+        for config in configs_in_project:
+            for wildcard in config_wildcards:
+                if fnmatch.fnmatch(config, wildcard):
+                    if config not in config_list:
+                        config_list.append(config)
+    
+    # Lastly handle regexes
+    if config_regexes:
+        for config in configs_in_project:
+            for pattern in config_regexes:
+                if re.match(pattern, config) is not None:
+                    if config not in config_list:
+                        config_list.append(config)
+    
+    return config_list
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/cone_defaults.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,51 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+
+[DEFAULT]
+# Settings for cone implmentation plugins 
+# default path setting for all plugins 
+# output path is a concatenation of output_root, output_subdir and plugin_output
+output_root=output
+output_subdir=
+plugin_output=
+output=%(output_root)s/%(output_subdir)s/%(plugin_output)s
+
+# plugin tags can be set as a dictionary
+plugin_tags     = {}
+
+# plugin phase can be pre, normal or post
+plugin_phase    = normal
+
+# Sections for different plugins
+[CRML]
+plugin_output   = private/10202BE9
+plugin_tags     = {'target' : ['rofs2','rofs3']}
+
+[GCFML]
+plugin_tags     = {'target' : ['rofs2','rofs3']}
+
+[CONTENT]
+plugin_tags     = {'target' : ['rofs3']}
+
+[MAKEML]
+plugin_tags     = {'target' : ['makefile']}
+
+[RULEML]
+plugin_tags     = {}
+
+[IMAGEML]
+plugin_tags     = {'target' : ['rofs3']}
+
+[THEMEML]
+plugin_tags     = {'target' : ['rofs3']}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/cone_subaction.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,78 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import sys
+import fnmatch 
+import re
+import logging
+
+
+def get_subactions(path,pattern):
+    """ Find out the cone subscripts that are present in the ROOT_PATH """
+    subacts = ActionContainer()
+    for file in os.listdir(path):
+        if fnmatch.fnmatch(file, pattern):
+            sact = SubAction(file,pattern)
+            subacts[sact.name] = sact
+    return subacts
+
+def get_log_level(level):
+    """
+    Change the given user input log level to logging categorisation
+    """
+    if level == 0 : return logging.NOTSET
+    elif level == 1 : return logging.CRITICAL
+    elif level == 2 : return logging.ERROR
+    elif level == 3 : return logging.WARNING
+    elif level == 4 : return logging.INFO
+    elif level == 5 : return logging.DEBUG
+    else : return logging.NOTSET
+
+class ActionContainer(object):
+    def __init__(self):
+        self._actions = {}
+
+    def __len__(self):
+        return len(self._actions)
+
+    def __getitem__(self, key):
+        return self._actions[key]
+
+    def __setitem__( self, key, value):
+        self._actions[key] = value
+
+    def __delitem__( self, key):
+        del self._actions[key]
+
+    def __iter__( self):
+        return self._actions.__iter__()
+
+class SubAction(object):
+    def __init__(self, scriptname, pattern):
+        self._scriptname = scriptname
+        self._pattern = pattern
+
+    @property
+    def name(self):
+        """ translate the pattern """
+        pattern = fnmatch.translate(self._pattern).replace('.*', '(.*)')
+        m = re.match(pattern, self._scriptname)
+        return m.group(1)
+
+    def run(self):
+        module = __import__(self._scriptname.replace('.py',''))
+        module.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/cone_tool.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,81 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys
+
+if sys.version_info[0] >= 3 or sys.version_info[0] <= 1:
+    print("WARNING: You are using not officially supported Python version:", sys.version_info[0], ".", sys.version_info[1], ".", sys.version_info[2])
+    print("Officially supported versions are 2.5 and 2.6")
+    sys.exit(1)
+elif sys.version_info[0] == 2:
+    if sys.version_info[1] == 5 or sys.version_info[1] == 6:
+        pass
+    elif sys.version_info[1] == 4 or sys.version_info[1] >= 7:
+        print("WARNING: You are using not officially supported Python version:", sys.version_info[0], ".", sys.version_info[1], ".", sys.version_info[2])
+        print("Officially supported versions are 2.5 and 2.6")
+    else:
+        print("WARNING: You are using not officially supported Python version:", sys.version_info[0], ".", sys.version_info[1], ".", sys.version_info[2])
+        print("Officially supported versions are 2.5 and 2.6")
+        sys.exit(1)
+
+import os
+import fnmatch 
+import re
+import logging
+from optparse import OptionParser, OptionGroup
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+import cone
+import cone_subaction
+from cone.public import settings
+
+CONE_SCRIPT_PATTERN = 'conesub_*.py'
+ROOT_PATH           = os.path.dirname(os.path.abspath(__file__))
+SUBS                = cone_subaction.get_subactions(ROOT_PATH, CONE_SCRIPT_PATTERN)
+ACTIONS             = [sub for sub in SUBS]
+logger              = logging.getLogger('cone')
+VERSION             = cone.__version__
+if cone._svnrevision not in ("", "exported"):
+    VERSION += " (SVN %s)" % cone._svnrevision
+CONE_USAGE          = "%prog [action] [options]."
+CONE_ACTIONS        = '\n'
+for act in ACTIONS:
+     CONE_ACTIONS += '    %s\n' % act
+CONE_ACTION_HELP    = "Available actions %s\nUse %%prog [action] -h to get action specific help." % CONE_ACTIONS
+
+def main():
+    parser = OptionParser(usage="%s\n\n%s" % (CONE_USAGE,CONE_ACTION_HELP),
+                          version="%%prog %s" % VERSION,
+                          prog="ConE")
+    
+    # Set the path for cone .cfg files to the same directory as this script
+    settings.SettingsFactory.configpath = ROOT_PATH
+    
+    try:
+        action = sys.argv[1]
+        subaction = SUBS[action]
+        print "Running action %s" % subaction.name
+    except (IndexError, KeyError):
+        (options, args) = parser.parse_args()
+        parser.error("Action must be given! See --help.")
+    
+    subaction.run()
+
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_compare.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,288 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import sys
+import logging
+from optparse import OptionParser, OptionGroup
+import codecs
+
+import cone_common
+import time
+
+from cone.public import api, plugin, utils, exceptions
+from time import gmtime, strftime
+import report_util
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+VERSION = '1.0'
+
+log = logging.getLogger('cone')
+
+REPORT_SHORTCUTS = {
+    'api': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'compare_api_report_template.html'),
+        'api_comparison.html',
+        'Report changes in feature definitions'),
+                       
+    'data': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'compare_data_report_template.html'),
+        'data_comparison.html',
+        'Report changes in data values'),
+                       
+    'crml_dc': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'crml_dc_report_template.html'),
+        'crml_dc_report.html',
+        'Report CRML data compatibility issues'),
+                       
+    'crml_dc_csv': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'crml_dc_report_template.csv'),
+        'crml_dc_report.csv',
+        'Report CRML data compatibility issues (CSV format)'),
+}
+DEFAULT_SHORTCUT = 'data'
+
+def main():
+    shortcut_container = report_util.ReportShortcutContainer(REPORT_SHORTCUTS,
+                                                             DEFAULT_SHORTCUT)
+    
+    gset = cone_common.get_settings([os.path.join(ROOT_PATH,'conesub_compare.cfg')])
+
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+    
+    group = OptionGroup(parser, 'Compare options',
+                    'The generate function will create target files from a specific configuration.'\
+                    'The generate will always work with read-only mode of the project, so no changes are saved to project')
+    
+    group.add_option("-s", "--sourceconfiguration",\
+                        dest="sourceconfiguration",\
+                        help="defines the name of the sourceconfiguration for the compare action. "\
+                             "The configuration is expected to be located current storage.",\
+                        metavar="CONFIG")
+    
+    group.add_option("-t", "--targetconfiguration",\
+                        dest="targetconfiguration",\
+                        help="defines the name of the target configuration for the compare action. "\
+                             "The configuration can be located in the current storage or it the configuration"\
+                             "definition can contain a path to a storage. The storage definition is given as a path"\
+                             "before semicolon. e.g. x:\data\configproject;productx.confml, test.cpf;root.confml",\
+                        metavar="CONFIG")
+
+#    group.add_option("--compare-dict",\
+#                   dest="compare_dict",\
+#                   action="store",
+#                   type="string",
+#                   help="Compare elements as a dictionary",
+#                   metavar="DICT",\
+#                   default=None)
+
+    group.add_option("--report",\
+                   dest="report_file",\
+                   action="store",
+                   type="string",
+                   help="The file where the comparison report is written."\
+                        "By default this value is determined by the used "\
+                        "report type. Example: --report report.html.",
+                   metavar="FILE",\
+                   default=None)
+
+    group.add_option("--template",\
+                   dest="template",\
+                   action="store",
+                   type="string",
+                   help="Template used in a report generation. By default "\
+                        "this value is determined by the used report type. "\
+                        "Example: --template report_template.html.",
+                   metavar="FILE",\
+                   default=None)
+    
+    group.add_option("--report-type",
+                   dest="report_type",
+                   action="store",
+                   type="string",
+                   help="The type of the report to generate. This is a convenience "\
+                        "switch for setting the used template.                     "\
+                        "Possible values:\n                                      "\
+                        + shortcut_container.get_shortcut_help_text(),
+                   metavar="TYPE",\
+                   default=None)
+    
+    group.add_option("--impl-filter",\
+                   dest="impl_filter",\
+                   action="store",
+                   type="string",
+                   help="The pattern used for filtering implementations for the "\
+                        "comparison. See the switch --impl in action generate for "\
+                        "more info. ",
+                   metavar="PATTERN",\
+                   default=None)
+    
+    start_time = time.time()
+    
+    parser.add_option_group(group)
+    (options, args) = parser.parse_args()
+    
+    cone_common.handle_common_options(options, settings=gset)
+    
+    if not options.sourceconfiguration: parser.error("sourceconfiguration must be given")
+    if not options.targetconfiguration: parser.error("targetconfiguration must be given")
+    if options.report_type and options.template:
+        parser.error("both --report-type and --template supplied; use only one of them")
+    if not shortcut_container.is_valid_shortcut(options.report_type):
+        parser.error("Invalid report type: %s" % options.report_type)
+    
+    template_file, report_file = shortcut_container.determine_template_and_report(
+        options.report_type,
+        options.template,
+        options.report_file,
+        'comparison')
+    
+    action = CompareAction(options.project,
+                           options.sourceconfiguration,
+                           options.targetconfiguration,
+                           template    = template_file,
+                           report_file = report_file,
+                           impl_filter = options.impl_filter)
+    result = action.run_action()
+    
+    resmap = {True: 0, False: 1}
+    sys.exit(resmap[result])
+
+
+
+class CompareAction(object):
+    
+    def __init__(self, current, sourceconfig, targetconfig, **kwargs):
+        self.current = current
+        self.sourceconfig = sourceconfig
+        self.targetconfig = targetconfig
+        self.reportfile = kwargs.get("report_file", 'compare.html')
+        self.reporttemplate = kwargs.get('template', '')
+        self.columns = kwargs.get('columns', None)
+        self.impl_filter = kwargs.get('impl_filter',)
+
+    def run_action(self):
+        """
+        Run the action.
+        @return: True if successful, False if not.
+        """
+        
+        currentprj = api.Project(api.Storage.open(self.current,"r"))
+        targetprj = None
+        (targetproject,targetconf) = self.parse_target_configuration(self.targetconfig)
+        print "Compare %s <> %s in %s" % (self.sourceconfig, targetconf, targetproject)
+        if targetproject != '':
+            targetprj = api.Project(api.Storage.open(targetproject,"r"))
+        else:
+            # The comparison doesn't seem to work if the same project
+            #    object is used
+            #targetprj = currentprj
+            targetprj = api.Project(api.Storage.open(self.current,"r"))
+            
+        source = currentprj.get_configuration(self.sourceconfig)
+        target = targetprj.get_configuration(targetconf)
+
+        print "Writing report to %s" % self.reportfile
+        sourcedata = {}
+        targetdata = {}
+        sourcedata['name'] = self.sourceconfig
+        targetdata['name'] = self.targetconfig
+        sourcedata['features'] = self.get_feature_api_data(source)
+        targetdata['features'] = self.get_feature_api_data(target)
+        
+        impl_comp_data_proxy = ImplComparisonDataProxy(source,
+                                                       target,
+                                                       self.impl_filter)
+        
+        template_data = {'sourcedata': sourcedata,
+                         'targetdata': targetdata,
+                         'impl_data':  impl_comp_data_proxy}
+        
+        result = report_util.generate_report(self.reporttemplate,
+                                             self.reportfile,
+                                             {'data': template_data})
+        print "Done."
+        return result
+        
+    def parse_target_configuration(self,configpath):
+        """
+        return tuple (storage, configpath) from storagepath;root.confml.
+        returns ('', 'root.confml') from root.confml 
+        """
+        elems = configpath.rsplit(';',2)
+        if len(elems) > 1:
+            return (elems[0],elems[1])
+        else:
+            return ('',elems[0])
+
+    def get_feature_api_data(self,config):
+        # Traverse through all features in the api
+        # and construct the data rows
+        data = {}
+        for elem in config.get_default_view().get_features('**'):
+            data[elem.fqr] = elem._obj
+        return data
+
+class ImplComparisonDataProxy(object):
+    """
+    Proxy object for loading implementation comparison data on demand.
+    """
+    def __init__(self, sourceconfig, targetconfig, impl_filter):
+        self.sourceconfig = sourceconfig
+        self.targetconfig = targetconfig
+        if impl_filter is None: self.impl_filter = '.*'
+        else:                   self.impl_filter = impl_filter
+        
+        self._flat_data = None
+    
+    @property
+    def flat(self):
+        try:
+            if self._flat_data is None:
+                self._flat_data = self._get_flat_comparison_data()
+            return self._flat_data
+        except Exception, e:
+            utils.log_exception(log, 'Error retrieving ImplComparisonDataProxy.flat!')
+            raise
+    
+    def _get_flat_comparison_data(self):
+        log.debug("Loading implementations for comparison (impl filter = '%s')..." % (self.impl_filter))
+        
+        try:
+            source_impls = plugin.get_impl_set(self.sourceconfig, self.impl_filter)
+            target_impls = plugin.get_impl_set(self.targetconfig, self.impl_filter)
+        except Exception, e:
+            utils.log_exception(log, 'Failed to load implementations!')
+            raise
+        
+        log.debug("%d impl(s) in source." % len(source_impls))
+        log.debug("%d impl(s) in target." % len(target_impls))
+        
+        log.debug("Generating flat comparison results...")
+        result = source_impls.flat_compare(target_impls)
+        log.debug("Generated %d result row(s)" % len(result))
+        return result
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_export.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,259 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import fnmatch
+import logging
+from optparse import OptionParser, OptionGroup
+
+import cone_common
+from cone.public import api, plugin, utils, exceptions
+
+
+VERSION     = '1.0'
+DEFAULT_EXT = '.cpf'
+
+logger    = logging.getLogger('cone')
+DATA_NAME = 'confml/data.confml'
+
+def main():
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-c", "--configuration",
+                        dest="configs",
+                        action="append",
+                        help="Defines the name of the configuration for the action, can be "\
+                             "specified multiple times to include multiple configurations.",
+                        metavar="CONFIG",
+                        default=[])
+    
+    parser.add_option("--config-wildcard",
+                      action="append",
+                      dest="config_wildcards",
+                      help="Wildcard pattern for including configurations, e.g. "\
+                           "product_langpack_*_root.confml",
+                      metavar="WILDCARD",
+                      default=[])
+    
+    parser.add_option("--config-regex",
+                      action="append",
+                      dest="config_regexes",
+                      help="Regular expression for including configurations, e.g. "\
+                           "product_langpack_\\d{2}_root.confml",
+                      metavar="REGEX",
+                      default=[])
+    
+    parser.add_option("-p", "--project",
+                       dest="project",
+                       help="defines the location of current project. Default is the "\
+                            "current working directory.",\
+                       default=".",
+                       metavar="STORAGE")
+    
+    group = OptionGroup(parser, 'Export options',
+                        'The export action is intended for exporting configurations '\
+                        'from one project (storage) to another. A project can be a '\
+                        'folder, a CPF or ZIP file, or a Carbon web storage URL. '\
+                        # An ugly way to make newlines, someone should look into
+                        # sub-classing optparse.HelpFormatter... 
+                        '                                                                          '\
+                        'Two different ways of exporting are supported: '\
+                        '                                                                          '\
+                        '1. Exporting multiple configurations into one new project using --remote '\
+                        '                                                                          '\
+                        '2. Exporting configurations into a number of new projects using --export-dir')
+    
+    group.add_option("-r", "--remote",
+                   dest="remote",
+                   help="Defines the location of remote storage. All configurations included using "\
+                        "--configuration, --config-wildcard and --config-regex are exported into "\
+                        "the storage. If the remote storage location is not given, the default "\
+                        "location is determined based on the first included source configuration name. "\
+                        "E.g. 'example.confml' would be exported into 'example.cpf'",
+                   metavar="STORAGE")
+    
+    group.add_option("--export-dir",
+                     help="Defines the directory where each included configuration is exported "\
+                          "as a new project.",
+                     default=None)
+    
+    group.add_option("--export-format",
+                     help="Defines the format into which projects are exported when using "\
+                          "--export-dir. Possible values are 'cpf' (the default) and 'dir'.",
+                     default=None)
+    
+    group.add_option("-a","--add",
+                   dest="added",
+                   action="append",
+                   type="string",
+                   help="Adds a configuration layer to the given configuration as last element. "\
+                        "The add operation can be used several times in a single command and it "\
+                        "can create even an empty layer. "\
+                        "Example --add foo/root.confml --add bar/root-confml.",
+                   metavar="CONFIG",
+                   default=None)
+
+    group.add_option("--exclude-folders",
+                        dest="exclude_empty_folders",
+                        action="store_true",
+                        help="Excludes empty folders from export",
+                        default=False)
+    
+    parser.add_option_group(group)
+    (options, args) = parser.parse_args()
+    
+    cone_common.handle_common_options(options)
+    
+    # Check options
+    if options.export_format and options.export_dir is None:
+        parser.error("--export-format can only be used in conjunction with --export-dir")
+    if options.export_dir and options.remote:
+        parser.error("--export-dir and --remote cannot be used at the same time")
+    if options.export_format and options.export_format.lower() not in ('dir', 'cpf'):
+        parser.error("Invalid export format '%s'" % options.export_format)
+    if options.export_dir and not (options.configs or options.config_wildcards or options.config_regexes):
+        parser.error("Use of --export-dir requires at least one configuration to be specified")
+    if options.export_dir and os.path.isfile(options.export_dir):
+        parser.error("Given export directory '%s' is a file")
+    
+    # Open the project and find out the active configuration
+    project = api.Project(api.Storage.open(options.project, "r"))
+    try:
+        active_root = project.get_storage().get_active_configuration()
+    except AttributeError:
+        active_root = None
+    
+    # Collect the list of configurations specified from the command line
+    config_list = []
+    if options.configs or options.config_wildcards or options.config_regexes:
+        try:
+            config_list = cone_common.get_config_list_from_project(
+                project          = project,
+                configs          = options.configs,
+                config_wildcards = options.config_wildcards,
+                config_regexes   = options.config_regexes)
+        except cone_common.ConfigurationNotFoundError, e:
+            parser.error(str(e))
+    
+    # Use the active configuration if no configurations are specifically given
+    if len(config_list) == 0:
+        if active_root is None:
+            parser.error("No configurations given and the project does not have an active root")
+        else:
+            logger.info('No configurations given! Using active root configuration %s' % active_root)
+            config_list = [active_root]
+    
+    # Perform the export
+    if options.export_dir:
+        _export_to_dir(project       = project,
+                       export_dir    = options.export_dir,
+                       export_format = options.export_format or 'cpf',
+                       configs       = config_list,
+                       added_layers  = options.added,
+                       empty_folders = not options.exclude_empty_folders)
+    else:
+        _export_to_storage(project                 = project,
+                           remote_project_location = options.remote,
+                           configs                 = config_list,
+                           added_layers            = options.added,
+                           empty_folders           = not options.exclude_empty_folders)
+    
+
+def _export_to_storage(project, remote_project_location, configs, added_layers, empty_folders):
+    assert len(configs) > 0
+    
+    # If the remote storage is not given, determine it automatically based
+    # on the first specified configuration name
+    if not remote_project_location:
+        remotename, ext = os.path.splitext(os.path.basename(configs[0]))
+        remotename += DEFAULT_EXT
+        logger.info('No remote storage given! Using source configuration name %s' % remotename)
+        remote_project_location = remotename
+    
+    remote_project = api.Project(api.Storage.open(remote_project_location, "w"))
+    for config_path in configs:
+        config = project.get_configuration(config_path)
+        project.export_configuration(config,
+                                     remote_project.storage,
+                                     empty_folders = empty_folders)
+        print "Export %s to %s done!" % (config_path, remote_project_location)
+    
+    # Setting first as active configuration if there are more than one configuration defined.
+    configs = remote_project.list_configurations()
+    if len(configs):
+        try:
+            remote_project.get_storage().set_active_configuration(configs[0])
+        except AttributeError:
+            pass
+    
+    remote_project.save()
+    remote_project.close()
+    
+    _add_layers(project, remote_project_location, added_layers, empty_folders)
+    
+def _add_layers(source_project, remote_project_location, added_configs, empty_folders):
+    """
+    Add new configuration layers from source_project into 
+    """
+    if not added_configs:
+        return
+    
+    target_project = api.Project(api.Storage.open(remote_project_location, "a"))
+    for target_config_name in target_project.list_configurations():
+        target_config = target_project.get_configuration(target_config_name)
+        
+        for added_config_name in added_configs:
+            # Add layers only once
+            if not target_project.storage.is_resource(added_config_name):
+                logger.info('Adding configuration %s' % added_config_name)
+                
+                if source_project.storage.is_resource(added_config_name):
+                    # The configuration exists in the source project, export it from there
+                    existing_config = source_project.get_configuration(added_config_name)
+                    source_project.export_configuration(existing_config,
+                                                        target_project.storage,
+                                                        empty_folders = empty_folders)
+                else:
+                    # The given configuration does not exist in the source project,
+                    # create a new empty layer
+                    logger.info("Creating new layer %s." % added_config_name)
+                    new_config = target_project.create_configuration(added_config_name)
+                    new_config.create_configuration(DATA_NAME)
+            
+            # Include the added configuration in the configuration root
+            target_config.include_configuration(utils.resourceref.norm(added_config_name))
+    
+    target_project.save()
+    target_project.close()
+
+def _export_to_dir(project, export_dir, export_format, configs, added_layers, empty_folders):
+    if not os.path.exists(export_dir):
+        os.makedirs(export_dir)
+    
+    for config in configs:
+        remote_name, _ = os.path.splitext(os.path.basename(config))
+        if export_format.lower() == 'cpf':
+            remote_name += '.cpf'
+        elif export_format.lower() == 'dir':
+            remote_name += '/'
+        
+        remote_name = os.path.join(export_dir, remote_name)
+        _export_to_storage(project, remote_name, [config], added_layers, empty_folders)
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_generate.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+
+# conesub_generate action specific configuration. The configuration option names 
+# are the same what are documented in the command line help.
+
+[DEFAULT]
+verbose   = 3
+# layers as a plural, which can be a comma separated list of layer ids.
+layers    = -1
+# implementation path filter 
+impls     =  
+impl-tags =
+sets      =
+adds      =
+report    =           
+template  =
+
+# extra settings to configure generation
+# read cfg files 
+cfgsettings = imaker_variantdir.cfg 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_generate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,418 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import sys
+import logging
+from optparse import OptionParser, OptionGroup
+import cone_common
+import time
+from os import path 
+from cone.public import api, plugin, utils, exceptions
+import generation_report
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+VERSION = '1.0'
+
+
+def main():    
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-c", "--configuration",\
+                        dest="configuration",\
+                        help="defines the name of the configuration for the action",\
+                        metavar="CONFIG")
+
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+    
+    gen_group = OptionGroup(parser, 'Generate options',
+                    'The generate function will create target files from a specific configuration.'\
+                    'The generate will always work with read-only mode of the project, so no changes are saved to project')
+  
+    gen_group.add_option("-o", "--output",\
+                   dest="output",\
+                   help="defines the target folder where the files are is generated or copied",\
+                   metavar="FOLDER",\
+                   default="output")
+
+    gen_group.add_option("-l", "--layer",\
+                   dest="layers",\
+                   type="int",
+                   action="append",
+                   help="define layers of the configuration that are included to the output. "\
+                        "The layer operation can be used several times in a single command."\
+                        "Example -l -1 --layer=-2, which would append a layers -1 and -2 to the layers => layers = -1,-2",
+                   metavar="LAYER",\
+                   default=None)
+    
+    gen_group.add_option("--all-layers",
+                   dest="all_layers",
+                   action="store_true",
+                   help="Include all layers in generation. This switch overrides all other layer "\
+                        "configurations (iMaker API and using the --layer parameter)",
+                   default=False)
+
+    gen_group.add_option("-i", "--impl",\
+                   dest="impls",\
+                   action="append",
+                   help=\
+"""Define a Python regular expression filter for actual ImplML plugin(s) that needs to be executed. The whole path to ImplML filename is used in the regexp matching.
+The impl operation can be used several times in a single command.
+                                                                        
+Example1 --impl crml => matches for any ImplML file that has a CrML string in the path.
+Example2 --impl makeml$ => matches for ImplML file that has ends with MakeML string.
+""",
+                   metavar="IMPLS",\
+                   default=None)
+
+    gen_group.add_option("--impl-tag",\
+                   dest="tags",\
+                   type="string",
+                   action="append",
+                   help="define a tag for the implementations that are included to the output. "\
+                        "A tag is name value pair and has the following format: name:value, e.g. target:rofs3."\
+                        "Example --impl-tag=target:uda --impl-tag=target:content, which would include impls include both tags.",
+                   metavar="TAG",\
+                   default=None)
+
+    gen_group.add_option("--impl-tag-policy",\
+                   dest="tags_policy",\
+                   type="string",
+                   action="append",
+                   help="Policy for implementation tags. May have one of the following values: --impl-tag-policy=AND, --impl-tag-policy=OR. "\
+                   "Default is OR.",
+                   metavar="TAGS_POLICY",\
+                   default=None)
+    
+    gen_group.add_option("-s", "--set",\
+                   dest="overrides",\
+                   action="append",
+                   type="string",
+                   help="Override a ConfML reference in the execution."\
+                        "The set operation can be used several times in a single command."\
+                        "Example -s foo.bar=10 -s foo.fea='test'.",
+                   metavar="SET",\
+                   default=None)
+
+    gen_group.add_option("--add",\
+                   dest="added",\
+                   action="append",
+                   type="string",
+                   help="Add a given configuration to the given configuration as last element."\
+                        "The add operation can be used several times in a single command."\
+                        "Example --add foo/root.confml --add bar/root-confml.",
+                   metavar="CONF",\
+                   default=None)
+
+    gen_group.add_option("-r", "--report",\
+                   dest="report",\
+                   action="store",
+                   type="string",
+                   help="Generates a report about settings that are properly generated."\
+                        "Example -r report.html.",
+                   metavar="FILE",\
+                   default=None)
+
+    gen_group.add_option("-t", "--template",\
+                   dest="template",\
+                   action="store",
+                   type="string",
+                   help="Template used in report generation."\
+                        "Example -t report_template.html.",
+                   metavar="FILE",\
+                   default=None)
+    
+    gen_group.add_option("--report-data-output",\
+                   type="string",
+                   help="Specifies a file where intermediary report data is generated.",
+                   metavar="FILE",\
+                   default=None)
+
+    gen_group.add_option("-n", "--dryrun",\
+                   dest="dryrun",\
+                   action="store_true",
+                   help="Executes generation without generation output.",
+                   default=False)
+
+    gen_group.add_option("--add-setting-file",\
+                   dest="settings",\
+                   action="append",
+                   type="string",
+                   help="Generate specific settings in ini format."\
+                        "Example -o my_generate_settings.cfg.",
+                   metavar="FILE",\
+                   default=None)
+    
+    layers = None
+    current = None
+    remote = None
+    
+    start_time = time.time()
+    
+    parser.add_option_group(gen_group)
+    (options, args) = parser.parse_args()
+
+    settinglist = [os.path.join(ROOT_PATH,'conesub_generate.cfg')]
+    if options.settings:
+        for setting_file in options.settings:
+            settinglist.append(os.path.normpath(os.path.join(ROOT_PATH, setting_file)))            
+    gset = cone_common.get_settings(settinglist)
+    
+    cone_common.handle_common_options(options, settings=gset)
+          
+    current = api.Project(api.Storage.open(options.project,"r"))
+    active_root = current.get_storage().get_active_configuration()
+    if not options.configuration:
+        if active_root == "":
+            parser.error("configuration must be given")
+        else:
+            logging.getLogger('cone').info('No configuration given! Using active root configuration %s' % active_root)
+            options.configuration = active_root
+    try:
+        config  = current.get_configuration(options.configuration)
+    except exceptions.NotFound:
+        parser.error("No such configuration: %s" % options.configuration)
+    reffilters = None
+    implfilters = None
+    impltags = None
+    
+    # Include possible additional configurations
+    if options.added:
+        for configname in options.added:
+            logging.getLogger('cone').info('Adding configuration %s' % configname) 
+            config.include_configuration(utils.resourceref.norm(configname))
+    
+    # Get defs from configuration         
+    try:
+        layer_str_list = (config.get_default_view().get_feature('imakerapi.cone_layers').get_value() or '').split(',')
+        # Make sure that empty layers definitions are ignored
+        layer_str_list = utils.distinct_array(layer_str_list)
+        if '' in layer_str_list:
+            layer_str_list.remove('')
+        # converting layrs identifiers from strings to int
+        layerdefs = []
+        for layerstr in layer_str_list:
+            try:
+                layerdefs.append(int(layerstr))
+            except ValueError, e:
+                logging.getLogger('cone').error('Invalid layer filter %s' % layerstr)
+        implfilters = (config.get_default_view().get_feature('imakerapi.cone_impls').get_value() or '').split(',')
+    except exceptions.NotFound:
+        layerdefs = []
+        implfilters = []
+        pass
+
+    # Get filters from command line if they exist => cmd overrides configuration
+    if options.layers:
+        layerdefs = options.layers
+    if options.impls:
+        implfilters = options.impls
+    if options.tags and len(options.tags) > 0:
+        impltags = {}
+        for tag in options.tags:
+            (name,value) = tag.split(':',2)
+            existingvalue = impltags.get(name,[])
+            existingvalue.append(value)
+            impltags[name] = existingvalue
+        logging.getLogger('cone').info('Tag filter %s' % impltags)
+    else:
+        impltags = None
+    
+    tags_policy = 'OR'
+    if options.tags_policy:
+        tags_policy = options.tags_policy[0]
+    
+    # Finally, --all-layers overrides all other layer settings
+    if options.all_layers:
+        layerdefs = []
+    
+    logging.getLogger('cone').info('Layer filter %s' % layerdefs)
+    
+    # Add reffilters only if the given layerids are somehow reasonable    
+    if len(layerdefs) > 0:
+        # get the data references from given layers
+        logging.getLogger('cone').info('Getting layer specific data reference from %s' % layerdefs)
+        reffilters = []
+        for layerid in utils.distinct_array(layerdefs): 
+            logging.getLogger('cone').info('Searching layer %s' % layerid)            
+            layer = config.get_configuration_by_index(layerid)
+            refs = _get_new_refs(reffilters, layer.list_leaf_datas())
+            logging.getLogger('cone').info("Refs from layer '%s'\n%s" % (layer.get_path(), '\n'.join(refs)))
+            reffilters += refs
+    
+
+    if options.overrides:
+        config.add_configuration(api.Configuration('tempdata.confml'))
+        for override in options.overrides:
+            (ref,value) = override.split('=',1) 
+            config.get_default_view().get_feature(ref).set_value(value)
+            
+    # Make sure that the output folder exists
+    if not os.path.exists(options.output):
+        os.makedirs(options.output)
+
+    impls = plugin.filtered_impl_set(config,implfilters)
+    impls.output = options.output
+    
+    logging.getLogger('cone').info("Supported implementation file extensions: %r" % plugin.get_supported_file_extensions())
+    
+#    logging.getLogger('cone').debug('Loaded implementations:')
+#    for impl in impls:
+#        msg = "File '%s', impl. type '%s', class '%s', phase '%s'" % \
+#              (impl.ref, impl.IMPL_TYPE_ID, type(impl).__name__, impl.invocation_phase())
+#        logging.getLogger('cone').debug(msg)
+    
+    
+    # Create temporary variables
+    temp_feature_refs = impls.create_temp_features(config)
+    if reffilters is not None:
+        reffilters.extend(temp_feature_refs)
+        logging.getLogger('cone').info('Refs from temporary variables:\n%s' % '\n'.join(temp_feature_refs))
+    
+    
+    
+    # ---------------
+    # Generate output
+    # ---------------
+    
+    rule_exec_results = []
+    
+    # Create an implementation container with all the relevant implementations
+    all_impls = impls.filter_implementations(tags=impltags, policy=tags_policy)
+    
+    # Implementations taking part in output generation
+    gen_impls = plugin.ImplSet()
+    context = plugin.GenerationContext()
+    context.configuration = config
+    log = logging.getLogger('cone')
+    for phase in plugin.ImplSet.INVOCATION_PHASES:
+        phase_impls = all_impls.filter_implementations(phase=phase)
+        log.info("Generating phase '%s', %d implementation(s)" % (phase, len(phase_impls)))
+        
+        context.phase = phase
+        # No use going any further if there are no implementations
+        # for the phase at all
+        if len(phase_impls) == 0:
+            continue
+        
+        # Load and execute rules for this phase
+        # -------------------------------------
+#        relation_container = phase_impls.get_relation_container()
+#        log.info("%d rule(s) for phase '%s'" % (relation_container.get_relation_count(), phase))
+#        if relation_container.get_relation_count() > 0:
+#            log.info("Executing rules...")
+#            results = relation_container.execute()
+#            log.info("Got %d execution result(s)" % len(results))
+#            rule_exec_results.extend(results)
+        
+        
+        # Create an implementation container for the phase with
+        # the new reffilters and generate output with it
+        # -----------------------------------------------------
+        impls = phase_impls.filter_implementations(refs=reffilters)
+        log.info("%d implementation(s) after filtering for phase '%s'" % (len(impls), phase))
+        if len(impls) > 0:
+            if impltags != None:
+                context.tags = impltags
+                context.tags_policy = tags_policy
+            impls.output = options.output
+            log.info("Generating output...")
+            impls.generate(context)
+            impls.post_generate(context)
+            
+            # Add new refs after generation
+#            if reffilters != None and len(reffilters) > 0:
+#                layer = config.get_configuration_by_index(-1)
+#                new_refs = _get_new_refs(reffilters, layer.list_leaf_datas())
+#                log.info('Added %d ref(s) after generation:\n%s' % (len(new_refs), '\n'.join(new_refs)))
+#                reffilters += new_refs
+            
+        # Add new references after each phase execution
+        # ---------------------------------------
+        if reffilters != None and len(reffilters) > 0:
+            layer = config.get_configuration_by_index(-1)
+            new_refs = _get_new_refs(reffilters, layer.list_leaf_datas())
+            log.info('Added %d ref(s) after phase %s execution:\n%s' % (len(new_refs), phase, '\n'.join(new_refs)))
+            reffilters += new_refs
+        
+        # Add the implementations to the set of implementations participating
+        # in output generation (used in the report)
+        for impl in impls:
+            for actual_impl in impl.get_all_implementations():
+                logging.getLogger('cone').info('Adding impl %s' % impl)
+                gen_impls.add(actual_impl)
+    
+    rule_exec_results = context.results
+    print "Generated %s to %s!" % (options.configuration, impls.output)
+    
+    
+    # ---------------
+    # Generate report
+    # ---------------
+    
+    # If reporting is enabled collect data for report
+    if options.report != None or options.report_data_output != None:
+        logging.getLogger('cone').info('Collecting data for report.')
+        all_refs = reffilters or utils.distinct_array(config.get_configuration_by_index(-1).list_leaf_datas())
+        logging.getLogger('cone').info('Collecting data found refs %s' % all_refs)
+        logging.getLogger('cone').info('Collecting data found gen_impls %s' % gen_impls)
+        rep_data = generation_report.collect_report_data(config, options, all_refs, gen_impls, rule_exec_results)
+        logging.getLogger('cone').info('Collecting data found rep_data  %s' % rep_data)
+        
+        duration = str("%.3f" % (time.time() - start_time) )
+        rep_data.set_duration( duration )
+        
+        # Save intermediary report data file if necessary
+        if options.report_data_output != None:
+            logging.getLogger('cone').info('Dumping report data to %s' % options.report_data_output)
+            print "Dumping report data to '%s'" % options.report_data_output
+            generation_report.save_report_data(rep_data, options.report_data_output)
+        
+        # Generate the report if necessary
+        if options.report != None:
+            generation_report.generate_report(rep_data, options.report, options.template)
+            print_summary(rep_data)
+    
+    if current: current.close()
+
+def _get_new_refs(old_refs, new_refs):
+    """
+    Return a distinct array of refs in ``new_refs`` that are not present in ``old_refs``.
+    """
+    result = []
+    for ref in new_refs:
+        if ref not in old_refs and ref not in result:
+            result.append(ref)
+    return result
+
+def print_summary(rep_data):
+    """ Prints generation summary to logger and console. """
+    print "\nGENERATION SUMMARY:"
+    print "--------------------"
+    print "Refs in files: %s" % rep_data.nbr_of_refs
+    print "Refs with no implementation: %s" % rep_data.nbr_of_refs_noimpl
+    print "Generation duration: %s" % rep_data.duration
+    print "\n\n"
+    
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_import_browserbookmarks.py.old	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,144 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+
+import os
+import logging
+import codecs
+
+from optparse import OptionParser, OptionGroup
+
+import cone_common
+from cone.public import api, plugin, utils, exceptions, container
+
+VERSION = '1.0'
+
+logger = logging.getLogger('cone')
+elems = {
+'Type': 0,
+'Name': 1,
+'ParentFolderName': 2,
+'URL': 3,
+'AccessPoint': 4,
+'UserName': 5,
+'Password': 6,
+'ReadOnly': 7,
+'FactoryItem': 8,
+'ContextId': 9,
+'Preferred': 10 
+    }
+    
+def main():
+    parser = OptionParser(version="%%prog %s" % VERSION)
+  
+    parser.add_option("-c", "--configuration",\
+                        dest="configuration",\
+                        help="defines the name of the configuration for the action",\
+                        metavar="CONFIG")
+  
+    parser.add_option("-v", "--verbose",\
+                      dest="verbose",\
+                      help="Print error,warning and information on system out. \
+                      Possible choises: Default is 3.\
+                                     NONE          0.\
+                                     CRITICAL      1\
+                                     ERROR         2\
+                                     WARNING       3\
+                                     INFO          4\
+                                     DEBUG         5\
+                                     ",\
+                      default=3,\
+                      metavar="LEVEL")
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+    
+    bgroup = OptionGroup(parser, 'Import browser bookmarks options',
+                    'The import_browserbookmarks functionality is meant to import browser bookmarks to a given configuration.')
+  
+    bgroup.add_option("-i", "--input",\
+                   dest="input",\
+                   type="string",
+                   help="input BrowserBookmarks file for the importing.",
+                   metavar="FILE",\
+                   default=None)
+  
+    layers = None
+    current = None
+
+    parser.add_option_group(bgroup)
+    (options, args) = parser.parse_args()
+
+    api.get_console_logger().setLevel(cone_common.get_log_level(options.verbose))
+
+    if not options.input:
+        parser.error("Input file must be given!")
+
+    logger.info('Open file %s.' % options.input)
+    
+
+    current = api.Project(api.Storage.open(options.project,"a"))
+    active_root = current.get_storage().get_active_configuration()
+    if not options.configuration:
+        if active_root == "":
+            parser.error("configuration must be given")
+        else:
+            logging.getLogger('cone').info('No configuration given! Using active root configuration %s' % active_root)
+            options.configuration = active_root
+    config  = current.get_configuration(options.configuration)
+    dview = config.get_default_view()
+    bookmarkfea = dview.get_feature('BookmarkItems.BookmarkItem')
+    
+    inputfile = codecs.open(options.input,encoding="utf16")
+    firstelem = True
+    for line in inputfile.readlines():
+        # skip comments 
+        data = line.split('#',1)
+        dataelem = data[0]
+        dataelem = dataelem.strip()
+        dataelem = dataelem.rstrip('\n')
+        
+        if dataelem != "":       
+            # Split the datarow in to data elems 
+            #print "DATAELEM: %s!" % dataelem
+            dataelems = dataelem.split(',')
+            print "Elem found %s" % str(dataelems[elems['Name']])
+            # Build the new data sequence
+            browserseq = []
+            for feaname in bookmarkfea.list_features():
+                try:
+                    browserseq.append(str(dataelems[elems[feaname]]))
+                except IndexError:
+                    pass
+                
+            print browserseq
+            if firstelem:
+                bookmarkfea.add_sequence(browserseq, policy=container.REPLACE)                  
+                data = bookmarkfea.get_data()[-1]
+                data._get_data().policy = 'replace'
+                firstelem = False
+            else:
+                bookmarkfea.add_sequence(browserseq, policy=container.APPEND)
+
+    config.save()        
+                
+    logger.info('Done!')
+    
+if __name__ == "__main__":
+    main()
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_info.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,672 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, zipfile, os
+import re, fnmatch
+import logging
+
+from optparse import OptionParser, OptionGroup
+
+import cone_common
+from cone.public import api, plugin, utils, exceptions
+from cone.confml import persistentconfml
+from cone.storage.filestorage import FileStorage
+import report_util
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+
+VERSION = '1.0'
+
+
+REPORT_SHORTCUTS = {
+    'api': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_api_report_template.html'),
+        'api_report.html',
+        "Create a report of the configuration's ConfML API."),
+    
+    'value': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_value_report_template.html'),
+        'value_report.html',
+        "Create a report of the configuration's data values. Multiple "\
+        "configurations can also be given using --configurations"),
+    
+    'value_csv': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_value_report_template.csv'),
+        'value_report.csv',
+        "Create a report of the configuration's data values (CSV format)."),
+    
+    'api_csv': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_api_report_template.csv'),
+        'api_report.csv',
+        "Create a report of the configuration's ConfML API (CSV format)."),
+    
+    'impl': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_impl_report_template.html'),
+        'impl_report.html',
+        'Create a report of all implementations in the configuration.'),
+    
+    'content': report_util.ReportShortcut(
+        os.path.join(ROOT_PATH, 'info_content_report_template.html'),
+        'content_report.html',
+        'Create a report of the content files in the configuration.'),
+}
+
+def main():
+    shortcut_container = report_util.ReportShortcutContainer(REPORT_SHORTCUTS,
+                                                             None)
+    
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-c", "--configuration",
+                      action="append",
+                      dest="configs",
+                      help="Defines a configuration to use in report generation or info printout. "\
+                           "May be defined more than once, but multiple configuration will only "\
+                           "do anything if the report type supports them. If multiple configurations "\
+                           "are not supported, the first one will be used",
+                      metavar="CONFIG",
+                      default=[])
+    
+    parser.add_option("--config-wildcard",\
+                      action="append",
+                      dest="config_wildcards",
+                      help="Wildcard pattern for including configurations, e.g. product_langpack_*_root.confml",
+                      metavar="WILDCARD",
+                      default=[])
+    
+    parser.add_option("--config-regex",\
+                      action="append",
+                      dest="config_regexes",
+                      help="Regular expression for including configurations, e.g. product_langpack_\\d{2}_root.confml",
+                      metavar="REGEX",
+                      default=[])
+    
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+
+    info_group = OptionGroup(parser, 'Info options',
+                    'The info functionality is meant for printing information about the       '\
+                    'contents of a cpf/zip file or Configuration Project (folder). Two        '\
+                    'separate use cases are currently supported:                              '\
+                    '1. Printing basic information about a project or configuration to        '\
+                    '   stdout.                                                               '\
+                    '2. Creating a report of the contents of a configuration or configurations.')
+    
+    info_group.add_option("--report-type",
+                   help="The type of the report to generate. This is a convenience "\
+                        "switch for setting the used template.                     "\
+                        "Possible values:                                        "\
+                        + shortcut_container.get_shortcut_help_text(),
+                   metavar="TYPE",\
+                   default=None)
+    
+    info_group.add_option("--report",
+                   help="The file where the configuration info report is written."\
+                        "By default this value is determined by the used "\
+                        "report type. Example: --report report.html.",
+                   metavar="FILE",\
+                   default=None)
+
+    info_group.add_option("--template",
+                   help="Template used in a report generation. By default "\
+                        "this value is determined by the used report type. "\
+                        "Example: --template report_template.html.",
+                   metavar="FILE",\
+                   default=None)
+    
+    info_group.add_option("--impl-filter",
+                   help="The pattern used for filtering implementations for the "\
+                        "report. See the switch --impl in action generate for "\
+                        "more info. ",
+                   metavar="PATTERN",
+                   default='.*')
+    
+    info_group.add_option("--view-file",
+                   help="External ConfML file containing the view used for filtering "\
+                        "the features listed in the setting value report. The first view "\
+                        "defined in the file will be used.",
+                   metavar="FILE",
+                   default=None)
+    
+    parser.add_option_group(info_group)
+    
+    (options, args) = parser.parse_args()
+    cone_common.handle_common_options(options)
+    
+    if not shortcut_container.is_valid_shortcut(options.report_type):
+        parser.error("Invalid report type: %s" % options.report_type)
+    if (options.report_type or options.template) and \
+        (not options.configs and not options.config_wildcards and not options.config_regexes):
+        parser.error("Report type or template specified but configuration(s) not given!")
+    if options.view_file and not os.path.isfile(options.view_file):
+        parser.error("No such file: %s" % options.view_file)
+    
+    # Load view from the specified file if necessary
+    view = None
+    if options.view_file:
+        try:
+            view = _load_view_from_file(options.view_file)
+            print "Loaded view '%s' from '%s'" % (view.get_name(), options.view_file)
+        except ViewLoadError, e:
+            print e
+            sys.exit(1)
+    
+    current = api.Project(api.Storage.open(options.project,"r"))
+    print "Opened project in %s" % options.project
+    
+    # Get a list of configurations if necessary
+    config_list = None
+    if options.configs or options.config_wildcards or options.config_regexes:
+        try:
+            config_list = cone_common.get_config_list_from_project(
+                project          = current,
+                configs          = options.configs,
+                config_wildcards = options.config_wildcards,
+                config_regexes   = options.config_regexes)
+        except cone_common.ConfigurationNotFoundError, e:
+            parser.error(str(e))
+        
+        # Specifying configurations using --configuration should always either result
+        # in an error or a configuration, so if there are no configurations, it
+        # means that the user specified only wildcards and/or patterns, and none
+        # matched
+        if len(config_list) == 0:
+            parser.error("No matching configurations for wildcard(s) and/or pattern(s).")
+    
+    
+    if config_list is not None:
+        # One or more configurations have been specified
+        
+        if options.report_type is not None or options.template is not None:
+            # Generating a report
+            
+            # Create a list of configurations
+            configs = []
+            for config_name in config_list:
+                configs.append(current.get_configuration(config_name))
+            
+            # Generate the report
+            if options.report_type: report_name = options.report_type + '_info'
+            else:                   report_name = 'info'
+            template, report = shortcut_container.determine_template_and_report(
+                options.report_type,
+                options.template,
+                options.report,
+                report_name)
+            data_providers = {'impl_data'   : ImplDataProvider(configs[0], options.impl_filter),
+                              'api_data'    : ApiDataProvider(configs[0]),
+                              'content_data': ContentDataProvider(configs[0]),
+                              'value_data'  : ValueDataProvider(configs, view)}
+            report_util.generate_report(template, report, {'data': ReportDataProxy(data_providers)})
+        else:
+            # Printing configuration info
+            config_name = config_list[0]
+            config = current.get_configuration(config_name)
+            print "Opened configuration %s" % config_name
+            print "Features %s" % len(config.get_default_view().list_all_features())
+            print "Impl files %s" % len(plugin.get_impl_set(config).list_implementation())
+        
+    else:
+        print "Configurations in the project."
+        configlist = current.list_configurations()
+        configlist.sort()
+        for config in configlist:
+            print config
+    if current: current.close()
+
+
+# ============================================================================
+# Report data proxy and data providers
+# ============================================================================
+
+class ReportDataProxy(object):
+    """
+    Proxy object for loading report data on demand.
+    
+    It is used so that e.g. when generating an API report, the
+    implementations are not unnecessarily loaded. The class utilizes
+    ReportDataProviderBase objects to handle the actual data generation,
+    and logs any exceptions that happen there.
+    """
+    def __init__(self, data_providers):
+        assert isinstance(data_providers, dict), "data_providers must be a dict!"
+        self._data_providers = data_providers
+    
+    def __getattr__(self, attrname):
+        if attrname in self._data_providers:
+            try:
+                return self._data_providers[attrname].get_data()
+            except Exception, e:
+                utils.log_exception(logging.getLogger('cone'),
+                                    "Exception getting %s: %s" % (attrname, e))
+        else:
+            return super(ReportDataProxy, self).__getattr__(attrname)
+
+class ReportDataProviderBase(object):
+    """
+    Report data provider base class for lazy-loading of report data.
+    """
+    def get_data(self):
+        """
+        Return the report data.
+        
+        The data is generated on the first call to this, and later the
+        cached data is returned.
+        """
+        CACHE_ATTRNAME = "__datacache"
+        if hasattr(self, CACHE_ATTRNAME):
+            return getattr(self, CACHE_ATTRNAME)
+        else:
+            data = self.generate_data()
+            setattr(self, CACHE_ATTRNAME, data)
+            return data
+    
+    def generate_data(self):
+        """
+        Generate the actual report data. Called when get_data() is called
+        the first time.
+        """
+        raise NotImplmentedError()
+
+# ----------------------------------------------------------------------------
+
+class ApiDataProvider(ReportDataProviderBase):
+    def __init__(self, config):
+        self._config = config
+    
+    def generate_data(self):
+        columns = {'fqr':'Full reference',
+                   'name':'Name',
+                   'type':'Type',
+                   'desc':'Description',
+                   }
+        data = self._get_feature_api_data(self._config, columns)
+        data.sort(key=lambda item: item['fqr'])
+        return {'columns'   : columns,
+                'data'      : data}
+    
+    @classmethod
+    def _get_feature_api_data(cls, config, column_dict):
+        # Traverse through all features in the api
+        # and construct the data rows
+        data = []
+        storageroot = os.path.abspath(config.get_storage().get_path())
+        for elem in config.get_default_view().get_features('**'):
+            elemfile = os.path.join(storageroot,elem._obj.find_parent(type=api.Configuration).get_full_path())
+            #print "elemfile %s " % elemfile
+            featurerow = {'file': elemfile}
+            
+            for col in column_dict:
+                try:
+                    featurerow[col] = getattr(elem,col) or ''
+                except AttributeError,e:
+                    #logging.getLogger('cone').warning('Could not find attribute %s from %s' % (col, elem.fqr))
+                    featurerow[col] = ''
+            data.append(featurerow)
+        return data
+
+
+class ImplDataProvider(ReportDataProviderBase):
+    def __init__(self, config, impl_filters):
+        self._config = config
+        self._impl_filters = impl_filters
+        
+    def generate_data(self):
+        impl_set = plugin.filtered_impl_set(self._config, [self._impl_filters or '.*'])
+        return impl_set.get_all_implementations()
+
+
+class ContentDataProvider(ReportDataProviderBase):
+    def __init__(self, config):
+        self._config = config
+        
+    def generate_data(self):
+        class Entry(object):
+            pass
+        data = []
+        layered_content = self._config.layered_content()
+        for ref in sorted(layered_content.list_keys()):
+            entry = Entry()
+            entry.file = ref
+            entry.actual_files = layered_content.get_values(ref)
+            data.append(entry)
+        return data
+
+
+class ValueDataProvider(ReportDataProviderBase):
+    
+    class FeatureGroup(object):
+        def __init__(self, name, features):
+            self.name = name
+            self.features = features
+    
+    class Feature(object):
+        def __init__(self, **kwargs):
+            self.ref  = kwargs['ref']
+            self.name = kwargs['name']
+            self.type = kwargs['type']
+            self.desc = kwargs['desc']
+            self.options = kwargs['options']
+    
+    class Config(object):
+        def __init__(self, path, values):
+            self.path = path
+            self.values = values
+    
+    class SequenceColumn(object):
+        def __init__(self, ref, name, type):
+            self.ref = ref
+            self.name = name
+            self.type = type
+        
+        def __eq__(self, other):
+            if type(self) == type(other):
+                for varname in ('ref', 'name', 'type'):
+                    if getattr(self, varname) != getattr(other, varname):
+                        return False
+                return True
+            else:
+                return False
+        
+        def __ne__(self, other):
+            return not (self == other)
+        
+        def __repr__(self):
+            return "SequenceColumn(ref=%r, name=%r, type=%r)" \
+                % (self.ref, self.name, self.type)
+    
+    class SequenceData(object):
+        def __init__(self, columns, rows):
+            self.columns = columns
+            self.rows = rows
+            self.is_sequence_data = True
+        
+        def __eq__(self, other):
+            if type(self) == type(other):
+                for varname in ('columns', 'rows'):
+                    if getattr(self, varname) != getattr(other, varname):
+                        return False
+                return True
+            else:
+                return False
+        
+        def __ne__(self, other):
+            return not (self == other)
+        
+        def __repr__(self):
+            return "SequenceData(columns=%r, rows=%r)" \
+                % (self.columns, self.rows)
+    
+    
+    def __init__(self, configs, view):
+        assert len(configs) > 0, "configs must contain at least one configuration!"
+        self._configs = configs
+        self._view = view
+    
+    def generate_data(self):
+        configs = self._configs
+        view = self._view
+        
+        # Get the feature list from the first configuration
+        feature_groups = self._get_feature_groups(self._configs[0], view)
+        
+        # Load setting values from all configurations
+        output_configs = [] # List of self.Config objects, not api.Configuration objects
+        for i, config in enumerate(self._configs):
+            print "Loading configuration %s (%d of %d)" % (config.get_path(), i + 1, len(self._configs))
+            dview = config.get_default_view()
+            
+            values = {}
+            for group in feature_groups:
+                for entry in group.features:
+                    try:
+                        feature = dview.get_feature(entry.ref)
+                        values[entry.ref] = self._resolve_value(feature)
+                    except exceptions.NotFound:
+                        pass
+                
+            output_configs.append(self.Config(config.get_path(), values))
+        
+        # Add a 'modified' attribute to all features
+        for group in feature_groups:
+            for feature in group.features:
+                modified = False
+                first_value_set = False
+                first_value = None
+                for output_config in output_configs:
+                    if feature.ref not in output_config.values:
+                        continue
+                    
+                    if not first_value_set:
+                        first_value = output_config.values[feature.ref]
+                        first_value_set = True
+                    else:
+                        if output_config.values[feature.ref] != first_value:
+                            modified = True
+                            break
+                
+                feature.modified = modified
+        
+        return {'feature_groups' : feature_groups,
+                'configs'        : output_configs}
+    
+    def _resolve_value(self, feature):
+        """
+        Resolve the value of the given feature (must be a data proxy).
+        
+        @param feature: The feature whose value is to be resolved.
+        @return: The resolved value (value directly from the feature, name of a selection option,
+            or a SequenceData object.
+        """
+        assert isinstance(feature, api._FeatureDataProxy)
+        
+        if isinstance(feature._obj, api.FeatureSequence):
+            return self._get_sequence_data(feature)
+        
+        return self._resolve_option_value(feature, feature.get_value())
+    
+    def _resolve_option_value(self, feature, value):
+        """
+        Resolve an option value for the given feature.
+        
+        @param feature: The feature, can be a data proxy or the feature object itself.
+        @param value: The value to resolve.
+        @return: The resolved value; the name of the selected option if possible,
+            otherwise the value that was passed in.
+        """
+        if isinstance(feature, api._FeatureDataProxy):
+            feature = feature._obj
+        
+        for option in self._get_options(feature):
+            if option.get_value() == value:
+                return option.get_name()
+        
+        return value
+    
+    def _get_sequence_data(self, seq_feature):
+        """
+        Return a SequenceData object based on the given sequence feature.
+        """
+        assert isinstance(seq_feature, api._FeatureDataProxy)
+        assert isinstance(seq_feature._obj, api.FeatureSequence)
+        
+        sub_feature_objs = []
+        columns = []
+        for obj in seq_feature._obj._objects():
+            if isinstance(obj, api.Feature):
+                col = self.SequenceColumn(obj.ref, obj.name, obj.type)
+                columns.append(col)
+                sub_feature_objs.append(obj)
+        
+        rows = []
+        for value_row in seq_feature.get_value():
+            row = {}
+            for index, value_item in enumerate(value_row):
+                ref = columns[index].ref
+                sub_feature = sub_feature_objs[index]
+                value = self._resolve_option_value(sub_feature, value_item)
+                row[ref] = value
+            rows.append(row)
+        
+        return self.SequenceData(columns, rows)
+        
+    def _get_feature_groups(self, config, view):
+        """
+        Return a list of FeatureGroup objects generated based on the given configuration and view.
+        @param configuration: The configuration to use.
+        @param view: The view to use. Can be None, in which case all features in the
+            configuration will be used.
+        """
+        feature_groups = []
+        
+        if view is None:
+            feature_list = self._get_feature_list(config.get_default_view().get_features('**'))
+            feature_groups = [self.FeatureGroup('All settings', feature_list)]
+        else:
+            # Populate the view so that it contains the settings and
+            # get_features() can be used
+            config._add(view)
+            view.populate()
+            
+            # Recursively collect a flattened list of all groups
+            def visit_group(group, name_prefix):
+                name = None
+                
+                # Ignore the name for the view, record only group-level names
+                # (the view cannot directly contain settings according to the
+                # spec, they need to be inside a group)
+                if not isinstance(group, api.View):
+                    if name_prefix: name = name_prefix + ' -- ' + group.get_name()
+                    else:           name = group.get_name()
+                
+                # Add features if necessary
+                features = self._get_feature_list(group.get_features('*'))
+                if len(features) > 0:
+                    feature_groups.append(self.FeatureGroup(name, features))
+                
+                # Recurse to child groups
+                for child in group._objects():
+                    if isinstance(child, api.Group):
+                        visit_group(child, name)
+            
+            visit_group(view, None)
+         
+        return feature_groups
+    
+    def _get_feature_list(self, feature_objects):
+        """
+        Return a list of feature data entries based on the given features.
+        @param feature_objects: List of api._FeatureDataProxy objects, e.g.
+            the output of api.Group.get_features().
+        @return: List of ValueDataProvider.Feature objects.
+        """
+        refs = set()
+        feature_list = []
+        for elem in feature_objects:
+            # Ignore elements with no type (they are not settings)
+            if not hasattr(elem, 'type') or elem.type in (None, ''):
+                continue
+            
+            # For sequences don't include sub-settings, only the
+            # sequence settings themselves
+            feature = self._get_parent_sequence_or_self(elem._obj)
+            ref = feature.fqr
+            
+            # Don't add if it's already in the list
+            if ref in refs: continue
+            else:           refs.add(ref)
+            
+            feature_data = self.Feature(
+                ref  = ref,
+                name = feature.name,
+                type = feature.type,
+                desc = feature.desc,
+                options = self._get_options(feature))
+            feature_list.append(feature_data)
+        return feature_list
+    
+    def _get_options(self, feature):
+        """
+        Return a list of api.Option objects for the given feature.
+        """
+        if isinstance(feature, api._FeatureDataProxy):
+            feature = feature._obj
+        
+        options = []
+        for obj in feature._objects():
+            if isinstance(obj, api.Option):
+                options.append(obj)
+        return options
+        
+    def _get_parent_sequence_or_self(self, feature):
+        """
+        Return the parent sequence of the given feature, or the feature
+        itself if it is not a sequence sub-setting.
+        """
+        current = feature._parent
+        while current is not None:
+            if isinstance(current, api.FeatureSequence):
+                return current
+            current = current._parent
+        return feature
+
+
+# ============================================================================
+# Helper functions
+# ============================================================================
+
+class ViewLoadError(RuntimeError):
+    """Exception raised if _load_view_from_file() fails"""
+    pass
+
+def _load_view_from_file(filename):
+    """
+    Load the first view from the given ConfML file.
+    @raise ViewLoadError: An error occurred when loading the file.
+    """
+    file_abspath = os.path.abspath(filename)
+    file_dir = os.path.dirname(file_abspath)
+    file_name = os.path.basename(file_abspath)
+    
+    # Open the view file inside a "project" so that XIncludes are
+    # handled properly
+    try:
+        view_project = api.Project(FileStorage(file_dir, 'r'))
+        view_config = view_project.get_configuration(file_name)
+        views = view_config._traverse(type=api.View)
+    except Exception, e:
+        import traceback
+        logging.getLogger('cone').debug(traceback.format_exc())
+        raise ViewLoadError("Error parsing view ConfML file: %s" % e)
+    
+    if len(views) == 0:
+        raise ViewLoadError("No views in specified view ConfML file '%s'" % filename)
+    elif len(views) == 1:
+        return views[0]
+    else:
+        print "Found %d view(s) in file '%s', using the last one" % (len(views), filename)
+        return views[-1]
+
+# ============================================================================
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_merge.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,412 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys
+import logging
+from optparse import OptionParser, OptionGroup
+import cone_common
+
+from cone.public import api, utils, exceptions
+
+VERSION = '1.0'
+
+logger    = logging.getLogger('cone')
+
+class MergeFailedException(Exception):
+    """
+    Exception raised if the merge failed for some reason.
+    """
+    pass
+
+class MergePolicy(object):
+    """
+    Merge policy constants.
+    """
+    #: Replace/add files from the source layer into the
+    #: target layer, preserving files in the target layer
+    #: that do not exist in the source layer
+    REPLACE_ADD = 'replace-add'
+    
+    #: Overwrite the entire target layer, so that it contains
+    #: only the contents of the source layer
+    OVERWRITE_LAYER = 'overwrite-layer'
+    
+    ALL = (REPLACE_ADD, OVERWRITE_LAYER)
+    
+    @classmethod
+    def is_valid(cls, policy):
+        return policy in cls.ALL
+
+def get_new_layer_name(oldname,rootconfig):
+    newpath = utils.resourceref.get_path(oldname)
+    newpath+= "_" + utils.resourceref.remove_ext(utils.resourceref.get_filename(rootconfig))
+    newpath+= "/" + utils.resourceref.get_filename(oldname)
+    return newpath
+
+def merge_configuration_layer(sourceconfig, targetconfig, merge_policy):
+    """
+    Merge the contents of the source layer into the target layer.
+    @param sourceconfig: Source layer root configuration object.
+    @param targetconfig: Target layer root configuration object.
+    @param merge_policy: The used layer merge policy.
+    """
+    # If policy tells to entirely overwrite the layer, remove all
+    # resources from the layer first
+    if merge_policy == MergePolicy.OVERWRITE_LAYER:
+        # Remove configurations from the layer root
+        confs = targetconfig.list_configurations()
+        for conf in confs:
+            targetconfig.remove_configuration(conf)
+
+        # Remove all related resources
+        layerobj = targetconfig.get_layer()
+        # Round one: remove all files
+        resources = layerobj.list_all_related(empty_folders=False)
+        for res in resources: layerobj.delete_resource(res)
+        # Round two: remove any remaining empty directories
+        resources = layerobj.list_all_related(empty_folders=True)
+        for res in resources: layerobj.delete_folder(res)
+    
+    # Find all ConfML files
+    confml_resources = sourceconfig.list_configurations()
+    
+    # Find all other related files and folders (content/, doc/ etc.)
+    layerobj = sourceconfig.get_layer()
+    targetobj = targetconfig.get_layer()
+    other_resources = layerobj.list_all_related(empty_folders=True)
+    
+    # Copy the resources to the target configuration
+    for res_path in confml_resources + other_resources:
+        try:
+            rres = layerobj.open_resource(res_path,"rb")
+            wres = targetobj.open_resource(res_path,"wb")
+            print "Copying %s" % rres.path
+            logger.info('Copying layer resource %s to %s' % (rres.path, wres.path))
+            wres.write(rres.read())
+            wres.close()
+            rres.close()
+        except exceptions.NotResource:
+            # If it isn't a resource (file), it's a folder
+            targetobj.create_folder(res_path)
+    
+    # Remove all configurations from the target layer root
+    already_included = targetconfig.list_configurations()
+    for confml_path in already_included:
+        targetconfig.remove_configuration(confml_path)
+    
+    # Include them back
+    for confml_path in already_included:
+        targetconfig.include_configuration(confml_path)
+    
+    # Include all added configurations
+    for confml_path in confml_resources:
+        if confml_path not in already_included:
+            print "Including %s in layer root %s" % (confml_path, targetconfig.path)
+            targetconfig.include_configuration(confml_path)
+
+def find_layers_to_merge(layer_indices, rename, sourceconfig, targetconfig):
+    """
+    Return a list of layers to merge.
+    
+    @param layer_indices: List of layer indices to merge, can also be
+        None to indicate that all layers are to be merged.
+    @param rename: True if the layers should be renamed in the target
+        config, False if not.
+    @return: A list of tuples (layer_root, target_layer_root), where
+        layer_root is the path to the layer root in the source
+        configuration and target_layer_root the one in the target
+        configuration.
+    """
+    # Get a list of all configurations to merge
+    if layer_indices is None:
+        mergeconfigs = sourceconfig.list_configurations()
+    else:
+        mergeconfigs = sort_mergeconfigs(layer_indices, sourceconfig.list_configurations())
+    
+    result = []
+    if rename:
+        for source_path in mergeconfigs:
+            target_path = get_new_layer_name(source_path, targetconfig.path)
+            result.append((source_path, target_path))
+    else:
+        for source_path in mergeconfigs:
+            result.append((source_path, source_path))
+    
+    return result
+
+def sort_mergeconfigs(layers, sourceconfigs):
+    """
+    Return a correctly sorted list of source configuration layers.
+    @param layers: List of the indices of the layers to merg. Can be None, in
+        which case all layers are returned.
+    @param sourceconfigs: List of all configuration layer root paths in the
+        source project.
+    @return: List of configuration layer root paths.
+    """
+    sorted_configs = [None for _ in xrange(len(sourceconfigs))]
+    for layer in layers:
+        sorted_configs[layer]=sourceconfigs[layer]
+    sorted_configs = filter(lambda x: x != None, sorted_configs)
+    return sorted_configs
+
+def merge_config_root_to_config_root(source_project, target_project,
+                                     source_config, target_config,
+                                     layer_indices, rename,
+                                     merge_policy):
+    """
+    Merge the source configuration root to the target configuration root.
+    @param layer_indices: List of layer indices to specify the layers
+        to merge, can be None.
+    @param rename: If True, the merged layers are renamed based on the
+        name of the target configuration root.
+    @param merge_policy: The used merge policy.
+    """
+    
+    def get_active_root_if_necessary(project, configuration, name):
+        if configuration:
+            return configuration
+        else:
+            active_root = project.get_storage().get_active_configuration()
+            if active_root == "":
+                raise MergeFailedException("No %s configuration given and the project does not have an active root" % name)
+            else:
+                return active_root
+    
+    target_root = get_active_root_if_necessary(target_project, target_config, 'target')
+    source_root = get_active_root_if_necessary(source_project, source_config, 'source')
+    
+    print "Target config:  %s" % target_root
+    print "Source config:  %s" % source_root
+    
+    try:
+        source_config = source_project.get_configuration(source_root)
+    except exceptions.NotFound:
+        raise MergeFailedException("Configuration root '%s' not found in source project" % source_root)
+    
+    
+    # Create or get the target configuration root
+    try:
+        target_config = target_project.get_configuration(target_root)
+    except exceptions.NotFound:
+        logger.info('Creating new root configuration %s' % (target_config))
+        target_config  = target_project.create_configuration(target_config)
+        for sourcelayer_path in source_config.list_configurations():
+            sourcelayer = source_config.get_configuration(sourcelayer_path)
+            sourcelayer_path = sourcelayer.path
+            if target_config.get_storage().is_resource(sourcelayer.path):
+                logger.info('Including layer %s to root %s' % (sourcelayer_path, target_config.path))
+                target_config.include_configuration(sourcelayer_path)
+            else:
+                logger.info('Creating new layer %s to root %s' % (sourcelayer_path, target_config.path))
+                target_config.create_configuration(sourcelayer_path)
+    
+    # Collect a correctly sorted list of all layer paths to merge
+    layers_to_merge = find_layers_to_merge(
+        layer_indices   = layer_indices,
+        rename          = rename,
+        sourceconfig    = source_config,
+        targetconfig    = target_config)
+    
+    print "Merging %d layer(s)..." % len(layers_to_merge)
+    
+    # Merge the layers
+    for source_path, target_path in layers_to_merge:
+        print "Merging %s -> %s" % (source_path, target_path)
+        
+        source_layer = source_project.get_configuration(source_path)
+        
+        if source_path != target_path:
+            try:
+                target_config.remove_configuration(source_path)
+            except exceptions.NotFound:
+                pass
+            target_config.create_configuration(target_path)
+        
+        # Get or create the target configuration layer
+        try:
+            target_layer = target_config.get_configuration(target_path)
+        except exceptions.NotFound:
+            logger.info('Creating new layer configuration %s' % (target_path))
+            target_layer = target_config.create_configuration(target_path)
+        
+        merge_configuration_layer(source_layer, target_layer, merge_policy)
+
+
+
+def main(argv=sys.argv):
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-c", "--configuration",\
+                        dest="configuration",\
+                        help="defines the name of the target configuration for the action",\
+                        metavar="CONFIG")
+
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+    
+    group = OptionGroup(parser, 'Merge options',
+                        'The merge functionality is meant to merge configurations/layers '
+                        'from a remote project (defined with -r) to the current project (defined with -p). '
+                        'Default value for the current project is the currently working directory. '
+                        'A project can be either a folder or a cpf/zip file. There are two ways to '
+                        'use merge: merge configuration roots (multiple layers), or specific layers. '
+                        'See the ConE documentation for details and examples.')
+    
+    group.add_option("-r", "--remote",\
+                   dest="remote",\
+                   help="defines the location of remote storage",\
+                   metavar="STORAGE")
+    
+    group.add_option("-s", "--sourceconfiguration",\
+                        dest="sourceconfiguration",\
+                        help="defines the name of the remote configuration inside the remote storage for the merge action. "\
+                             "Default is the active root of the remote project.",\
+                        metavar="CONFIG")
+    
+    group.add_option("--sourcelayer",
+                     help="Defines a specific layer to use as the layer to merge "\
+                          "from the remote project. Must be the layer root (ConfML file)."\
+                          "For example: --sourcelayer assets/somelayer/root.confml",
+                     metavar="LAYER_ROOT",
+                     default=None)
+    
+    group.add_option("--targetlayer",
+                     help="Defines a specific layer (root) to use as the layer to merge "\
+                          "into the target project. Must be the layer root (ConfML file)."\
+                          "For example: --targetlayer assets/somelayer/root.confml",
+                     metavar="LAYER_ROOT",
+                     default=None)
+
+    group.add_option("--rename",\
+                        action="store_true", 
+                        dest="rename",\
+                        help="defines that the merged layers need to be renamed",
+                        default=False)
+
+    group.add_option("--all",\
+                        action="store_true", 
+                        dest="all",\
+                        help="Defines that the entire configuration (all layers) needs to be merged. "\
+                             "This has no effect when merging layers directly using --sourcelayer and --targetlayer.",
+                        default=False)
+
+    group.add_option("-l", "--layer",\
+                   dest="layers",\
+                   type="int",
+                   action="append",
+                   help="Define the layers of the source configuration that are included to merge action. "\
+                        "The layer operation can be used several times in a single command. "\
+                        "Note that this can only be used when merging configuration roots, not "\
+                        "specific layers using --sourcelayer and --targetlayer. "\
+                        "Example -l -1 --layer=-2, which would append a layers -1 and -2 to the layers => layers = -1,-2",
+                   metavar="LAYERS",\
+                   default=None)
+    
+    group.add_option("--merge-policy",
+                     help="Specifies the merge policy to use when merging layers. "\
+                          "Possible values:                                                         "\
+                          "replace-add - Add/replace files from source layer, but leave other files in the target as they are. "\
+                          "                                                         "\
+                          "overwrite-layer - Overwrite the entire layer (remove all previous content).",
+                     default=MergePolicy.REPLACE_ADD)
+    
+    parser.add_option_group(group)
+    (options, _) = parser.parse_args(argv)
+    
+    cone_common.handle_common_options(options)
+    
+    # Check the passed options
+    if not MergePolicy.is_valid(options.merge_policy):
+        parser.error("Invalid merge policy: %s\nMust be one of %s" % (options.merge_policy, '\n'.join(MergePolicy.ALL)))
+    if not options.remote: parser.error("Remote project must be given")
+    if options.layers and (options.sourcelayer or options.targetlayer):
+        parser.error("Specifying layer indices using --layer is not supported when using --sourcelayer or --targetlayer!")
+    if options.sourcelayer and not options.targetlayer:
+        parser.error("Merging a layer into a configuration is not supported at the moment!")
+    if options.sourcelayer and not options.sourcelayer.lower().endswith('.confml'):
+        parser.error("Source layer root should be a .confml file")
+    if options.targetlayer and not options.targetlayer.lower().endswith('.confml'):
+        parser.error("Target layer root should be a .confml file")
+    if not options.sourcelayer and options.targetlayer:
+        parser.error("Cannot merge a configuration into a layer!")
+    
+    # If layers for configuration root merging are not specifically given,
+    # the default is the last layer
+    if options.layers is None:
+        options.layers = [-1]
+    
+    target_project = api.Project(api.Storage.open(options.project,"a", username=options.username, password=options.password))
+    source_project = api.Project(api.Storage.open(options.remote,"r", username=options.username, password=options.password))
+    
+    print "Target project: %s" % options.project
+    print "Source project: %s" % options.remote
+    
+    target_config = None
+    try:
+        if options.sourcelayer and options.targetlayer:
+            print "Target layer:   %s" % options.targetlayer
+            print "Source layer:   %s" % options.sourcelayer
+            
+            try:
+                source_config = source_project.get_configuration(options.sourcelayer)
+            except exceptions.NotFound:
+                raise MergeFailedException("Layer root '%s' not found in source project" % options.sourcelayer)
+            
+            try:
+                target_config = target_project.get_configuration(options.targetlayer)
+            except exceptions.NotFound:
+                logger.info('Creating new layer %s' % (options.targetlayer))
+                target_config  = target_project.create_configuration(options.targetlayer)
+            
+            print "Merging layers..."
+            merge_configuration_layer(source_config, target_config, options.merge_policy)
+        else:
+            # Merging a configuration root into a configuration root
+            
+            if options.all: layer_indices = None
+            else:           layer_indices = utils.distinct_array(options.layers)
+            
+            merge_config_root_to_config_root(
+                source_project = source_project,
+                target_project = target_project,
+                source_config  = options.sourceconfiguration,
+                target_config  = options.configuration,
+                layer_indices  = layer_indices,
+                rename         = options.rename,
+                merge_policy   = options.merge_policy)
+    except MergeFailedException, e:
+        print "Could not merge: %s" % e
+        sys.exit(2)
+    else:
+        # Merge successful, so save the target configuration and project
+        # to persist the changes
+        if target_config: target_config.save()
+        target_project.save()
+    
+    target_project.close()
+    source_project.close()
+    
+
+if __name__ == "__main__":
+    main()
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_report.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,206 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import logging
+import pickle
+from optparse import OptionParser, OptionGroup
+import cone_common
+import generation_report
+from cone.public import api, plugin, utils, exceptions
+
+
+VERSION     = '1.0'
+
+logger    = logging.getLogger('cone')
+
+def main():
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    group = OptionGroup(parser, 'Report options',
+                        'The report function generates a report using previously generated '\
+                        'intermediary report data as input.')
+    
+    group.add_option("-i", "--input-data",\
+                        action="append",\
+                        help="Defines an input file for report generation. "\
+                             "If specified more than once, the data of all specified "\
+                             "report data files is merged.",
+                        metavar="FILE",
+                        default=[])
+    
+    group.add_option("-d", "--input-data-dir",\
+                        help="Defines a directory containing the data files to use for "\
+                             "generating the report. This is an alternative to specifying "\
+                             "a number of --input-data files. The order of the data files "\
+                             "is determined by the generation time stamps found in the data "\
+                             "files.",
+                        metavar="DIR",
+                        default=None)
+    
+    group.add_option("-r", "--report",\
+                   dest="report",\
+                   action="store",
+                   type="string",
+                   help="Specifies the report file to create."\
+                        "Example -r report.html.",
+                   metavar="FILE",\
+                   default="report.html")
+    
+    group.add_option("-t", "--template",\
+                   dest="template",\
+                   action="store",
+                   type="string",
+                   help="Template used in report generation."\
+                        "Example -t report_template.html.",
+                   metavar="FILE",\
+                   default=None)
+    
+    parser.add_option_group(group)
+    (options, args) = parser.parse_args()
+    
+    cone_common.handle_common_options(options)
+    
+    if len(options.input_data) == 0 and not options.input_data_dir:
+        parser.error("Input data must be specified with either --input-data or --input-data-dir")
+    if len(options.input_data) > 0 and options.input_data_dir:
+        parser.error("Both --input-data and --input-data-dir specified, use one or the other.")
+    if options.input_data_dir and not os.path.isdir(options.input_data_dir):
+        parser.error('Given --input-data-dir does not exist or is not a directory.')
+    
+    if options.input_data:
+        files = options.input_data
+    else:
+        files = get_input_data_files(options.input_data_dir)
+    
+    if len(files) == 0:
+        parser.error("At least one input data file must be specified.")
+    
+    
+    class DataEntry(object):
+        def __init__(self, label, data):
+            self.label = label
+            self.data = data
+    
+    # Load all data files
+    data_entries = []
+    for data_file in files:
+        print "Loading data file '%s'" % data_file
+        label = get_generation_run_label(data_file)
+        data = generation_report.load_report_data(data_file)
+        data_entries.append(DataEntry(label, data))
+    
+    # Sort by time stamp
+    data_entries.sort(key=lambda entry: entry.data.generation_timestamp)
+    
+    # Use the first data object as the main report data
+    main_entry = data_entries[0]
+    
+    # Merge the rest of the data objects into the main data
+    if len(data_entries) > 1:
+        # Update the generation_runs attribute of all implementations
+        # in the main data
+        for line in main_entry.data.lines:
+            for impl in line.impls:
+                impl.generation_runs = [main_entry.label]
+         
+        # Load other report data files and merge them to the main data object
+        for i in xrange(len(data_entries) - 1):
+            entry = data_entries[i + 1]
+            print "Merging data for '%s'" % entry.label
+            merge_report_data(main_entry.data, entry.data, entry.label)
+ 
+    # Generate the report
+    main_entry.data.report_filename = options.report
+    generation_report.generate_report(main_entry.data, options.report, options.template)
+    
+    print "Generated report to '%s'" % options.report
+
+def get_input_data_files(directory):
+    files = []
+    for name in os.listdir(directory):
+        path = os.path.join(directory, name)
+        if os.path.isfile(path):
+            files.append(path)
+    return files
+    
+
+def get_generation_run_label(datafile_path):
+    filename = os.path.split(datafile_path)[1]
+    filename_noext = os.path.splitext(filename)[0]
+    return filename_noext
+
+def get_feature(rep_data, ref):
+    for feat in rep_data.lines:
+        if feat.ref == ref:
+            return feat
+    raise RuntimeError("Feature '%s' not found in refs with impl" % ref)
+
+def get_impl(rep_data, ref, impl_name):
+    feat = get_feature(rep_data, ref)
+    for impl in feat.impls:
+        if impl.name == impl_name:
+            return impl
+    raise RuntimeError("Impl '%s' not found for feature '%s'" % (impl_name, ref))
+
+def merge_report_data(data, data_to_merge, generation_run_label):
+    impls_by_ref = {}
+    for feat in data.lines:
+        impls_dict = {}
+        impls_by_ref[feat.ref] = impls_dict
+        for impl in feat.impls:
+            impls_dict[impl.name] = impl
+    
+    for feat in data_to_merge.lines:
+        if feat.ref in impls_by_ref:
+            # Feature has implementations in both report data objects
+            # -------------------------------------------------------
+            impls_dict = impls_by_ref[feat.ref]
+            
+            for impl in feat.impls:
+                if impl.name in impls_dict:
+                    # Same implementation in both: add the generation run to merge to the impl
+                    impl = get_impl(data, feat.ref, impl.name)
+                    impl.generation_runs.append(generation_run_label)
+                else:
+                    # Implementation only in the data to merge: add to the main data
+                    impl = get_impl(data_to_merge, feat.ref, impl.name)
+                    impl.generation_runs = [generation_run_label]
+                    feat = get_feature(data, feat.ref)
+                    feat.impls.append(impl)
+                    feat.nbr_impls += 1
+        else:
+            # Feature has implementations only in the data to merge
+            # -----------------------------------------------------
+            
+            # Add the feature and impls to the main data
+            feat = get_feature(data_to_merge, feat.ref)
+            for impl in feat.impls:
+                impl.generation_runs = [generation_run_label]
+            data.lines.append(feat)
+            data.nbr_of_refs += 1
+            
+            # Remove from features with no impl in the main data
+            for i, noimpl_feat in enumerate(data.ref_noimpl):
+                if feat.ref == noimpl_feat.ref:
+                    del data.ref_noimpl[i]
+                    data.nbr_of_refs_noimpl -= 1
+                    break
+
+if __name__ == "__main__":
+    main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/conesub_update.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,264 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os
+import re
+import fnmatch
+import logging
+from optparse import OptionParser, OptionGroup
+
+import cone_common
+from cone.public import api, plugin, utils, exceptions
+
+
+VERSION     = '1.0'
+DEFAULT_EXT = '.cpf'
+CPF_NAMESPACE  = "http://www.nokia.com/xml/cpf-id/1"
+CPF_META_TAG = "configuration-property"
+
+logger    = logging.getLogger('cone')
+
+def main():
+    parser = OptionParser(version="%%prog %s" % VERSION)
+    
+    parser.add_options(cone_common.COMMON_OPTIONS)
+    
+    parser.add_option("-c", "--configuration",
+                        dest="configs",
+                        action="append",
+                        help="Defines the name of the configuration for the action, can be "\
+                             "specified multiple times to include multiple configurations.",
+                        metavar="CONFIG",
+                        default=[])
+    
+    parser.add_option("--config-wildcard",
+                      action="append",
+                      dest="config_wildcards",
+                      help="Wildcard pattern for including configurations, e.g. "\
+                           "product_langpack_*_root.confml",
+                      metavar="WILDCARD",
+                      default=[])
+    
+    parser.add_option("--config-regex",
+                      action="append",
+                      dest="config_regexes",
+                      help="Regular expression for including configurations, e.g. "\
+                           "product_langpack_\\d{2}_root.confml",
+                      metavar="REGEX",
+                      default=[])
+  
+    parser.add_option("-p", "--project",\
+                       dest="project",\
+                       help="defines the location of current project. Default is the current working directory.",\
+                       default=".",\
+                       metavar="STORAGE")
+    
+    group = OptionGroup(parser, 'Update options',
+                        'The update functionality is meant for ConfML manipulation '
+                        'in current project (defined with -p). '
+                        'Default value for the current project is the currently working directory. '
+                        'A project can be either a folder or a cpf/zip file.')
+    
+    
+    group.add_option("-m","--add-meta",\
+                   dest="meta",\
+                   action="append",
+                   type="string",
+                   help="Add given metadata to defined configuration."\
+                        "Example --add-meta \"owner=John Cone\" -m product=E75",
+                   default=None)    
+
+    group.add_option("--add-cpf-meta",\
+                   dest="cpfmeta",\
+                   action="append",
+                   type="string",
+                   help="Add given CPF identification metadata to defined configuration."\
+                        "Example --add-cpf-meta \"coreplat_name=Platform1\"",
+                   default=None)
+    
+    group.add_option("-d","--add-desc",\
+                   dest="desc",\
+                   type="string",\
+                   help="Add given description to defined configuration."\
+                        "Example --add-desc \"Customer one CPF\" -d Description1",
+                   default=None)
+    
+    group.add_option("--remove-meta",\
+                   dest="remove_meta",\
+                   action="append",
+                   type="string",
+                   help="Removes given metadata from defined configuration."\
+                        "Example --remove-meta owner --remove-meta coreplat_name",
+                   metavar="META",\
+                   default=None)
+
+    group.add_option("--remove-desc",\
+                   dest="remove_desc",\
+                   action="store_true",\
+                   help="Removes description from defined configuration."\
+                        "Example --remove-desc",
+                   default=False)    
+
+    group.add_option("--add-data",\
+                   dest="data",\
+                   action="append",
+                   type="string",
+                   help="Add given ConfML data to defined configuration."\
+                        "Example --add-data \"KCRUidAvkon.KAknDefaultAppOrientation=1\"",
+                   default=None) 
+
+    parser.add_option_group(group)
+    (options, args) = parser.parse_args()
+    
+    cone_common.handle_common_options(options)
+    
+    # Open the project and find out the active configuration
+    project = api.Project(api.Storage.open(options.project, "a"))
+    try:
+        active_root = project.get_storage().get_active_configuration()
+    except AttributeError:
+        active_root = None
+    
+    # Collect the list of configurations specified from the command line
+    config_list = []
+    if options.configs or options.config_wildcards or options.config_regexes:
+        try:
+            config_list = cone_common.get_config_list_from_project(
+                project          = project,
+                configs          = options.configs,
+                config_wildcards = options.config_wildcards,
+                config_regexes   = options.config_regexes)
+        except cone_common.ConfigurationNotFoundError, e:
+            parser.error(str(e))
+    
+    # Use the active configuration if no configurations are specifically given
+    if len(config_list) == 0:
+        if active_root is None:
+            parser.error("No configurations given and the project does not have an active root")
+        else:
+            logger.info('No configurations given! Using active root configuration %s' % active_root)
+            config_list = [active_root]
+    
+    
+    
+    # Parse added meta and data definitions
+    added_meta = _parse_name_value_pairs(options.meta, 'metadata')
+    added_cpf_meta = _parse_name_value_pairs(options.cpfmeta, 'CPF metadata')
+    added_data = _parse_name_value_pairs(options.data, 'data')
+    
+    for config_name in config_list:
+        print "Updating %s" % config_name
+        config = project.get_configuration(config_name)
+        
+        # Handle metadata and data additions
+        if added_meta:      _add_meta(config, added_meta)
+        if added_cpf_meta:  _add_cpf_meta(config, added_cpf_meta)
+        if added_data:      _add_data(config, added_data)
+          
+        # Handle description  
+        if options.desc:        
+            logger.info("Setting description to %s" % options.desc)
+            config.desc = options.desc
+        if options.remove_desc:
+            if config.desc:
+                logger.info("Removing description")
+                del config.desc
+        
+        # Handle metadata removals
+        if options.remove_meta:
+            for remove_meta in options.remove_meta:
+                if config.meta:
+                    index = config.meta.find_by_tag(remove_meta)
+                    if index != -1:
+                        del config.meta[index]
+                        logger.info("Removed %s" % remove_meta)
+                    else:
+                        index = config.meta.find_by_attribute("name", remove_meta)
+                        if index != -1:
+                            del config.meta[index]
+                            logger.info("Removed %s" % remove_meta)
+                else:
+                    logger.info("Could not remove metadata entry %s: not found." % remove_meta)
+    
+    project.save()
+    project.close()
+
+def _parse_name_value_pairs(entries, entry_type_name):
+    """
+    Parse a list of 'name=value' pairs into a dictionary.
+    @param entries: The list of entries to parse.
+    @param entry_type_name: Entry type name shown in the error message if an entry
+        could not be parsed into a name-value pair.
+    """
+    if not entries:
+        return {}
+    
+    result = {}
+    pattern = re.compile("(.+)=(.+)")
+    for entry in entries:
+        mo = pattern.search(entry)
+        if mo:
+            name = mo.group(1)
+            value = mo.group(2)
+            result[name] = value
+        else:
+            logger.error("Illegal %s definition: %s" % (entry_name, entry))
+    return result
+
+def _add_meta(config, added_meta):
+    if not config.meta:
+        config.meta = []
+    
+    for tag, value in added_meta.iteritems():
+        index = config.meta.find_by_tag(tag)
+        if index != -1:
+            logger.info("Replacing %s's value %s with %s" % \
+                        (tag, config.meta[index].value, value))
+            config.meta.replace(index, tag, value)
+        else:
+            logger.info("Adding value %s for %s." % (value, tag))                
+            config.meta.add(tag, value)
+
+def _add_cpf_meta(config, added_cpf_meta):
+    if not config.meta:
+        config.meta = []
+    for attrName, attrValue in added_cpf_meta.iteritems():
+        index = config.meta.find_by_attribute("name", attrName)
+        if index != -1:
+            logger.info("Replacing %s's value %s with %s" % \
+                        (attrName, config.meta[index].attrs["value"], attrValue))
+            config.meta.replace(index, CPF_META_TAG, None, CPF_NAMESPACE, {"name": attrName, "value": attrValue})
+        else:
+            logger.info("Adding value %s for %s." % \
+                        (attrName, attrValue))                
+            config.meta.add(CPF_META_TAG, None, CPF_NAMESPACE, {"name": attrName, "value": attrValue})
+
+def _add_data(config, added_data):
+    for ref, value in added_data.iteritems():
+        if value.startswith("["):
+            value = eval(value)
+            for value_item in value:
+                config.get_default_view().get_feature(ref).add_sequence(value_item, 0)
+                logger.info("Set %s=%s" % (ref, repr(value)))
+        else:
+            config.get_default_view().get_feature(ref).set_value(value)
+            logger.info("Set %s=%s" % (ref, value))
+
+if __name__ == "__main__":
+    main()
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/crml_dc_report_template.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,70 @@
+Modified:
+File,Repository UID,Repository name,Key UID,Key name,Changed value,Old value,New value
+{% for row in data.impl_data.flat.modified|sort -%}
+{#- Only report CRML changes (but ignore changes to key names, they don't matter for DC) -#}
+{%- if row.impl_type == 'crml' and row.value_id != 'name' -%}
+
+{# Ignore changes to read-only keys. However, if a key's read-only attribute is changed, that is reported. -#}
+{%- if 'target_key' not in row.data or row.data.target_key.read_only == false or row.data.source_key.read_only != row.data.target_key.read_only -%}
+
+{%- if 'target_key' in row.data -%}
+{% set key_name = row.data.target_key.name or row.data.source_key.name -%}
+{% else -%}
+{% set key_name = '' -%}
+{% endif -%}
+{%- set repo_name = row.data.target_repo.uid_name or row.data.source_repo.uid_name -%}
+{%- if repo_name == none -%}{%- set repo_name = '' -%}{%- endif -%}
+
+{{ row.file }},{{ row.id }},{{ repo_name }},{{ row.sub_id }},{{ key_name }},{{ row.value_id }},{{ row.source_value }},{{ row.target_value }}
+{% endif -%}
+
+{% endif -%}
+{% endfor %}
+
+Added:
+File,Repository UID,Repository name,Key UID,Key name
+{% for row in data.impl_data.flat.only_in_target|sort -%}
+{%- if row.impl_type == 'crml' and ('key' not in row.data or row.data.key.read_only == false) -%}
+{%- if row.data != none and 'key' in row.data -%}
+{%- set key_name = row.data.key.name -%}
+{%- else -%}
+{%- set key_name = '' -%}
+{%- endif -%}
+{%- set repo_name = row.data.repo.uid_name or '' -%}
+{{ row.file }},{{ row.id }},{{ repo_name }},{{ row.sub_id }},{{ key_name }}
+{% endif -%}
+{% endfor %}
+
+Removed:
+File,Repository UID,Repository name,Key UID,Key name
+{% for row in data.impl_data.flat.only_in_source|sort -%}
+{%- if row.impl_type == 'crml' and ('key' not in row.data or row.data.key.read_only == false) -%}
+{%- if row.data != none and 'key' in row.data -%}
+{%- set key_name = row.data.key.name -%}
+{%- else -%}
+{%- set key_name = '' -%}
+{%- endif -%}
+{%- set repo_name = row.data.repo.uid_name or '' -%}
+{{ row.file }},{{ row.id }},{{ repo_name }},{{ row.sub_id }},{{ key_name }}
+{% endif -%}
+{% endfor %}
+
+Duplicate repositories in source:
+File,Repository UID
+{% for row in data.impl_data.flat.duplicate|sort -%}
+{%- if row.impl_type == 'crml' -%}
+{% for file in row.files_in_source -%}
+{{ file }}{{row.impl_id}}
+{% endfor -%}
+{% endif -%}
+{% endfor %}
+
+Duplicate repositories in target:
+File,Repository UID
+{% for row in data.impl_data.flat.duplicate|sort -%}
+{%- if row.impl_type == 'crml' -%}
+{% for file in row.files_in_target -%}
+{{ file }}{{row.impl_id}}
+{% endfor -%}
+{% endif -%}
+{% endfor %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/crml_dc_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,152 @@
+{% extends "cone_base.html" %}
+{% block title %}Compare data{% endblock %}
+{% block content %}
+
+    <h1>CRML Data Compatibility Report</h1><br>
+    
+    <table class="report">
+      <tr>
+        <td>Source:</td>
+        <td>{{ data.sourcedata.name }}</td>
+      </tr>
+      <tr>
+        <td>Target:</td>
+        <td>{{ data.targetdata.name }}</td>
+      </tr>
+    </table>
+    
+    <br/>
+    
+    <h2>Modified keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+        <th>Changed value</th>
+        <th>Old value</th>
+        <th>New value</th>
+    </tr>
+    
+    {% for row in data.impl_data.flat.modified|sort -%}
+        {#- Only report CRML changes (but ignore changes to key names, they don't matter for DC) -#}
+        {%- if row.impl_type == 'crml' and row.value_id != 'name' -%}
+            {# Ignore changes to read-only keys. However, if a key's read-only attribute is changed, that is reported. -#}
+            {%- if 'target_key' not in row.data or row.data.target_key.read_only == false or row.data.source_key.read_only != row.data.target_key.read_only -%}
+                
+                {%- if 'target_key' in row.data -%}
+                    {% set key_name = row.data.target_key.name or row.data.source_key.name -%}
+                {% else -%}
+                    {% set key_name = '' -%}
+                {% endif -%}
+                {%- set repo_name = row.data.target_repo.uid_name or row.data.source_repo.uid_name -%}
+                {%- if repo_name == none -%}{%- set repo_name = '' -%}{%- endif -%}
+                
+                <tr>
+                    <td>{{ row.file }}</td>
+                    <td>{{ row.id }}</td>
+                    <td>{{ repo_name }}</td>
+                    <td>{{ row.sub_id }}</td>
+                    <td>{{ key_name }}</td>
+                    <td>{{ row.value_id }}</td>
+                    <td>{{ row.source_value }}</td>
+                    <td>{{ row.target_value }}</td>
+                </tr>
+            {% endif -%}
+
+        {% endif -%}
+    {% endfor %}
+    </table>
+    
+    
+    <h2>Added keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+    </tr>
+    
+    {% for row in data.impl_data.flat.only_in_target|sort -%}
+        {%- if row.impl_type == 'crml' and ('key' not in row.data or row.data.key.read_only == false) -%}
+            {%- if row.data != none and 'key' in row.data -%}
+                {%- set key_name = row.data.key.name -%}
+            {%- else -%}
+                {%- set key_name = '' -%}
+            {%- endif -%}
+            {%- set repo_name = row.data.repo.uid_name or '' -%}
+            
+            <tr>
+                <td>{{ row.file }}</td>
+                <td>{{ row.id or '' }}</td>
+                <td>{{ repo_name }}</td>
+                <td>{{ row.sub_id or '' }}</td>
+                <td>{{ key_name }}</td>
+            </tr>
+        {% endif -%}
+    {% endfor %}
+    </table>
+    
+    
+    <h2>Removed keys/files:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>File</th>
+        <th>Repository UID</th>
+        <th>Repository name</th>
+        <th>Key UID</th>
+        <th>Key name</th>
+    </tr>
+    
+    {% for row in data.impl_data.flat.only_in_source|sort -%}
+        {%- if row.impl_type == 'crml' and ('key' not in row.data or row.data.key.read_only == false) -%}
+            {%- if row.data != none and 'key' in row.data -%}
+                {%- set key_name = row.data.key.name -%}
+            {%- else -%}
+                {%- set key_name = '' -%}
+            {%- endif -%}
+            {%- set repo_name = row.data.repo.uid_name or '' -%}
+            
+            <tr>
+                <td>{{ row.file }}</td>
+                <td>{{ row.id or '' }}</td>
+                <td>{{ repo_name }}</td>
+                <td>{{ row.sub_id or '' }}</td>
+                <td>{{ key_name }}</td>
+            </tr>
+        {% endif -%}
+    {% endfor %}
+    </table>
+    
+    
+    <h2>Duplicate repositories:</h2>
+    
+    <table class="report">
+    <tr>
+        <th>Repository UID</th>
+        <th>Files in source</th>
+        <th>Files in target</th>
+    </tr>
+    
+    {% for row in data.impl_data.flat.duplicate|sort -%}
+        {%- if row.impl_type == 'crml' -%}
+            <tr>
+                <td>{{ row.id }}</td>
+                <td>
+                {% for file in row.files_in_source %}{{ file }}<br/>{% endfor %}
+                </td>
+                <td>
+                {% for file in row.files_in_target %}{{ file }}<br/>{% endfor %}
+                </td>
+            </tr>
+        {% endif -%}
+    {% endfor %}
+    </table>
+{% endblock %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/gen_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,440 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+    <title>ConE generation report</title>
+    <style type="text/css">
+        body {
+            font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+            font-size: 0.8em;
+            color: #0055B7;
+        }
+
+        .red{
+            color: Red;
+        }
+        
+        h1 {
+            padding: 30px 0 0 0;
+            margin: 0;
+            text-align: left;
+        }
+
+        #date {
+            text-align: center;
+        }
+
+        hr {
+            height: 1px;
+            background-color: cccccc;
+            color: #cccccc;
+        }
+
+        h2 h3 {
+            padding: 10px 0 10px 0;
+            margin: 0;
+        }
+
+        table.report {
+            width: 100%;
+            border: 1px solid #e0dfe3;
+            border-collapse: collapse;
+            color: #333333;
+        }
+
+        table.report th {
+            text-align: left;
+            padding: 5px;
+            background-color: #f9fafd;
+            color: #595a5f;
+            border-bottom: 1px #999999 solid;
+        }
+
+        table.report th.featureName {
+            background-color: #f2f2f3;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 1.1em;
+            border-top: 3px #9d9da1;
+            border-top-style: double;
+            border-bottom: 3px #9d9da1;
+            border-bottom-style: double;
+        }
+
+        table.report th.header {
+            background-color: #f9fafd;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 0.8em;
+            border-top: 1px #9d9da1;
+            border-bottom: 1px #9d9da1;
+        }
+
+        table.report td {
+            word-wrap: break-word;
+            border: 1px #EBEBEB;
+            padding: 5px;
+            border-style: solid; 
+            vertical-align: top;
+            font: Tahoma, Verdana, Arial;
+            _font-size: 0.8em;
+        }
+
+        table.summary {
+            border: 1px solid #e0dfe3;
+            border-collapse: collapse;
+            color: #333333;
+        }
+
+        table.summary th {
+            text-align: left;
+            padding: 5px;
+            background-color: #f9fafd;
+            color: #595a5f;
+            border-bottom: 1px #999999 solid;
+        }
+
+        table.summary th.featureName {
+            background-color: #f2f2f3;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 1.1em;
+            border-top: 3px #9d9da1;
+            border-top-style: double;
+            border-bottom: 3px #9d9da1;
+            border-bottom-style: double;
+        }
+
+        table.summary td {
+            word-wrap: break-word;
+            border: 1px #EBEBEB;
+            padding: 5px;
+            border-style: solid; 
+            vertical-align: top;
+            font: Tahoma, Verdana, Arial;
+            _font-size: 0.8em;
+        }
+
+        .currentValue {
+            background-color: #e8f2fe;
+        }
+    </style>
+</head>
+<body>
+
+    <h1>Generation summary:</h1>
+    <table class="summary">
+     <tr>
+        <th class="featureName" colspan="2">Statistics</th>
+     </tr>
+     <tr>
+        <td>Refs in files</td>
+        <td>{{ rep_data.nbr_of_refs }}</td>
+    </tr>
+    <tr>
+        <td>Refs with no implementation</td>
+        <td>{{ rep_data.nbr_of_refs_noimpl }}</td>
+    </tr>
+    <tr>
+        <th class="featureName" colspan="2">Details</th>
+     </tr>
+    <tr>
+        <td>Report generated</td>
+        <td>{{ rep_data.generation_time }}</td>
+    </tr>
+    <tr>
+        <td>Generation duration</td>
+        <td>{{ rep_data.duration }}</td>
+    </tr>
+    <tr>
+        <td>Generation log</td>
+        <td><a href="file:{{ rep_data.cwd|pathname_to_url }}/cone.log">cone.log</a></td>
+    </tr>
+    <tr>
+        <th class="featureName" colspan="2">Generation options</th>
+    </tr>
+    <tr>
+        <td align="left">Layers</td>
+        <td align="left">{{ rep_data.options.layers }}</td>
+    </tr>
+    <tr>
+        <td align="left">Added</td>
+        <td align="left">{{ rep_data.options.added }}</td>
+    </tr>
+    <tr>
+        <td align="left">Dryrun</td>
+        <td align="left">{{ rep_data.options.dryrun }}</td>
+    </tr>
+    <tr>
+        <td align="left">Verbose</td>
+        <td align="left">{{ rep_data.options.verbose }}</td>
+    </tr>
+    <tr>
+        <td align="left">Overrides</td>
+        <td align="left">{{ rep_data.options.overrides }}</td>
+    </tr>
+    <tr>
+        <td align="left">Project</td>
+        <td align="left">{{ rep_data.options.project }}</td>
+    </tr>
+        <tr>
+        <td align="left">Report</td>
+        <td align="left">{{ rep_data.options.report }}</td>
+    </tr>
+    <tr>
+        <td align="left">Impls</td>
+        <td align="left">{{ rep_data.options.impls }}</td>
+    </tr>
+    <tr>
+        <td align="left">Output</td>
+        <td align="left">{{ rep_data.options.output }}</td>
+    </tr>
+    <tr>
+        <td align="left">Configuration</td>
+        <td align="left">{{ rep_data.options.configuration }}</td>
+    </tr>
+    <tr>
+        <td align="left">Working directory</td>
+        <td align="left">{{ rep_data.cwd }}</td>
+    </tr>
+    </table>
+    
+    <h1>Rule execution results:</h1><br>
+    
+    <table class="report">
+        <tr>
+            <th class="featureName">File</th>
+            <th class="featureName">Rule No.</th>
+            <th class="featureName">Input refs</th>
+            <th class="featureName">Affected refs</th>
+        </tr>
+        
+        {% for result in rep_data.rule_exec_results %}
+        {#- Report only rule executions that affected something #}
+        {%- if result.affected_refs|length > 0 %}
+        <tr>
+            <a name="rule:{{result.source}}:{{result.index}}"/>
+            <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ result.source|pathname_to_url }}">{{ result.source }}</a></td>
+            <td>{{result.index}}</td>
+            <td>
+            {%- for ref in result.input_refs -%}
+                {{ref}}<br/>
+            {% endfor %}
+            </td>
+            <td>
+            {%- for ref in result.affected_refs -%}
+                {{ref}}<br/>
+            {% endfor %}
+            </td>
+        </tr>
+        {% endif -%}
+        {% endfor %}
+        
+    </table>
+    
+    
+    <h1>Output files:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">API</th>
+        <th class="featureName">Data</th>
+        <th class="featureName">Impl. file</th>
+        <th class="featureName">Impl. type</th>
+        <th class="featureName">Generated for</th>
+        <th class="featureName">Output files</th>
+    </tr>
+    {% for feat in rep_data.lines %}
+    
+        <tr>
+            <td align="left" rowspan={{ feat.nbr_impls }}>
+                {% if feat.is_temp_feature -%}
+                <b><i>{{ feat.ref }}</i></b><br>
+                {%- else -%}
+                <b>{{ feat.ref }}</b><br>
+                {%- endif %}
+                <b>Name: </b>{{ feat.feat_name }}<br>
+                <b>Type: </b>{{ feat.feat_type }}<br>
+                <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a>
+            </td>
+            <td align="left" rowspan={{ feat.nbr_impls }}>
+            <table class="report">
+            
+            {% for data in feat.datas %}
+                {% if loop.first %}
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
+                        <td>{{ data.value|e|xml_charref_replace }}</td>
+                    </tr>
+                {% else %}
+                    <tr>
+                        <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
+                        <td>{{ data.value|e|xml_charref_replace  }}</td>
+                    </tr>
+                {% endif %}
+            {% endfor %}
+            </table>
+
+            <table class="report">
+                {% for data in feat.seq_data %}
+                    {% if loop.first %}
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>{{ data[0]|e|xml_charref_replace }}</b></td>
+                            <td>
+                                {% for value in data[1] %}
+                                    {{ value|e|xml_charref_replace }}<br>
+                                {% endfor %}
+                            </td>
+                        </tr>
+                    {% else %}
+                        <tr>
+                            <td><b>{{ data[0]|e|xml_charref_replace }}</b></td>
+                            <td>
+                                {% for value in data[1] %}
+                                    {{ value|e|xml_charref_replace }}<br>
+                                {% endfor %}
+                            </td>
+                        </tr>
+                    {% endif %}
+                {% endfor %}
+            </table>
+            
+            {% for impl in feat.impls %}
+                {% if loop.first %}
+                    <td align="left">
+                        <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a>
+                    </td>
+                    <td align="left">
+                        {{ impl.type }}
+                    </td>
+                    <td align="left">
+                        {{ ', '.join(impl.generation_runs) }}
+                    </td>
+                    <td align="left">
+                        {% for output in impl.outputfiles -%}
+                            {% if output.exists %}
+                                <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br>
+                            {% else %}
+                                <span class="red">{{ output.filename }}</span><br>
+                            {% endif %}
+                        {%- endfor %}
+                    </td>
+                {% else %}
+                    <tr>
+                    <td align="left">
+                        <a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ impl.name|pathname_to_url }}">{{ impl.name }}</a>
+                    </td>
+                    <td align="left">
+                        {{ impl.type }}
+                    </td>
+                    <td align="left">
+                        {{ ', '.join(impl.generation_runs) }}
+                    </td>
+                    <td align="left">
+                        {% for output in impl.outputfiles %}
+                            {% if output.exists %}
+                                <a href="file:{{ output.abs_filename|pathname_to_url }}">{{ output.filename }}</a><br>
+                            {% else %}
+                                <span class="red">{{ output.filename }}</span><br>
+                            {% endif %}
+                        {% endfor %}
+                    </td>
+                    </tr>
+                {% endif %}
+                
+            {% endfor %}
+        </tr>
+    {% endfor %}    
+    </table>
+
+    <h1>Refs with no implementation:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">API</th>
+        <th class="featureName">Data</th>
+    </tr>
+    {% for feat in rep_data.ref_noimpl %}
+        <tr>
+            <td align="left" >
+                {% if feat.is_temp_feature -%}
+                <b><i>{{ feat.ref }}</i></b><br>
+                {%- else -%}
+                <b>{{ feat.ref }}</b><br>
+                {%- endif %}
+                <b>Name: </b>{{ feat.feat_name|e|xml_charref_replace }}<br>
+                <b>Type: </b>{{ feat.feat_type|e|xml_charref_replace }}<br>
+                <b>ConfML: </b><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ feat.config_path|pathname_to_url }}">{{ feat.config_path }}</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            {% for data in feat.datas %}
+                {% if loop.first %}
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
+                        <td>{{ data.value|e|xml_charref_replace }}</td>
+                    </tr>
+                {% else %}
+                    <tr>
+                        <td><a href="file:{{ rep_data.project_dir|pathname_to_url }}/{{ data.layer|pathname_to_url }}">{{ data.layer }}</a></td>
+                        <td>{{ data.value|e|xml_charref_replace }}</td>
+                    </tr>
+                {% endif %}
+            {% endfor %}
+            </table>
+            
+            <table class="report">
+                {% for data in feat.seq_data %}
+                    {% if loop.first %}
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>{{ data[0] }}</b></td>
+                            <td>
+                                {% for value in data[1] %}
+                                    {{ value|e|xml_charref_replace }}<br>
+                                {% endfor %}
+                            </td>
+                        </tr>
+                    {% else %}
+                        <tr>
+                            <td><b>{{ data[0] }}</b></td>
+                            <td>
+                                {% for value in data[1] %}
+                                    {{ value|e|xml_charref_replace }}<br>
+                                {% endfor %}
+                            </td>
+                        </tr>
+                    {% endif %}
+                {% endfor %}
+            </table>
+        </tr>
+    {% endfor %}    
+    </table>
+    <h1>Not generated output files:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">Output file</th>
+    </tr>
+    {% for file in rep_data.missing_output_files %}
+        <tr>
+            <td align="left" >
+                {{ file.filename }}
+            </td>
+    {% endfor %}
+    </table>
+    
+</body>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/generation_report.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,315 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, logging, pickle
+import time
+from time import gmtime, strftime
+from jinja2 import Environment, PackageLoader, FileSystemLoader, Template
+from cone.public import api, exceptions, utils, plugin
+from cone.confml import model
+import report_util
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+def save_report_data(rep_data, file_path):
+    """
+    Save report data into an intermediary report data file.
+    """
+    dir = os.path.dirname(file_path)
+    if dir != '' and not os.path.exists(dir):
+        os.makedirs(dir)
+    
+    pickle_data = pickle.dumps(rep_data)
+    f = open(file_path, 'wb')
+    try:        f.write(pickle_data)
+    finally:    f.close()
+
+def load_report_data(file_path):
+    """
+    Load report data from an intermediary report data file.
+    """
+    f = open(file_path, "rb")
+    try:        data = f.read()
+    finally:    f.close()
+    
+    return pickle.loads(data)
+
+def _get_parent_sequence_or_self(feature):
+    current = feature._parent
+    while current is not None:
+        if isinstance(current, api.FeatureSequence):
+            return current
+        current = current._parent
+    return feature
+
+def collect_report_data(config, options, all_refs, impl_set, rule_exec_results):
+    """
+    Collect data for report generation.
+    """
+    impls = impl_set.get_all_implementations()
+    impls.sort(key=lambda impl: (impl.ref, impl.index))
+    rep_data = ReportData()
+    
+    # Sort the rule results for unit testing purposes
+    rep_data.rule_exec_results = sorted(rule_exec_results, key=lambda e: (e.source, e.index))
+    
+    # Collect a dictionary that maps refs shown in the report to a list of
+    # actual sub-refs used in the generation.
+    # This is done because for sequence settings only an entry for the main
+    # sequence setting is shown, but the actual refs used in generation point
+    # to the individual sub-settings (and possibly even under them).
+    # An example entry in the dictionary could be
+    #   'MyFeature.MySequence' : ['MyFeature.MySequence.Name',
+    #                             'MyFeature.MySequence.File.localPath',
+    #                             'MyFeature.MySequence.File.targetPath']
+    dview = config.get_default_view()
+    refs_dict = {}
+    for ref in all_refs:
+        try:
+            feature = dview.get_feature(ref)
+        except exceptions.NotFound:
+            logging.getLogger('cone.generation_report').warning("Feature for data ref not found: %s" % ref)
+            continue
+        
+        feature = _get_parent_sequence_or_self(feature._obj)
+        ref_to_report = feature.fqr
+        
+        if ref_to_report not in refs_dict:
+            refs_dict[ref_to_report] = []
+        refs_dict[ref_to_report].append(ref)
+    
+#    msg = []
+#    for ref, sub_refs in refs_dict.iteritems():
+#        msg.append("Ref: %s\nSub-refs:\n%s" % (ref, '\n'.join(sub_refs)))
+#    logging.getLogger('cone').debug('\n--------------------------------------\n'.join(msg))
+    
+    # Go through the refs and create report data entries
+    for ref in sorted(refs_dict.iterkeys()):
+        sub_refs = refs_dict[ref]
+        
+        #print "Ref: %s" % ref
+        try:
+            feat = dview.get_feature(ref)
+            
+            # Skip imaker-internal settings
+            if isinstance(feat._obj, model.ConfmlSetting):
+                try:
+                    prop = feat.get_property('cone-report-ignore')
+                    if prop.value.lower() in ('1', 'true'):
+                        continue
+                except exceptions.NotFound:
+                    pass
+            
+            #print "Still %s" % ref
+            
+            found_output = False
+            line = RefLine(ref, feat.get_type())
+            
+            if plugin.is_temp_feature(feat):
+                line.is_temp_feature = True
+
+            if feat.get_type() == 'sequence':
+                for f in feat.list_all_features():
+                    line.add_sequence(feat.get_feature(f).get_name(), feat.get_feature(f).get_value())
+            else:
+                if isinstance(feat.get_datas(), list): 
+                    for d in feat.get_datas():
+                        line.add_data(d.find_parent(type=api.Configuration).get_full_path(), d.get_value())
+                else:
+                    line.add_data(feat.get_data().find_parent(type=api.Configuration).get_full_path(), feat.get_value())
+            
+            
+            # Impl and output files
+            has_impl = False
+            for impl in impls:
+                # Check for implementations using the actual sub-refs
+                if impl.has_ref(sub_refs):
+                    has_impl = True
+                    line.add_impl(impl.ref, impl.IMPL_TYPE_ID, impl.list_output_files())
+            if has_impl:    rep_data.add_line(line)
+            else:           rep_data.add_ref_noimpl(line)
+                
+            
+            # For localPath and targetPath, the name should be the one from its parent file/folder setting
+            if isinstance(feat._obj, (model.ConfmlLocalPath, model.ConfmlTargetPath)):
+                name = feat._obj._parent.name
+            else:
+                name = feat.name
+            
+            line.set_feat_name(name)
+            line.set_config_path( feat._obj.find_parent(type=api.Configuration).get_full_path())
+            
+        except Exception, e:
+            utils.log_exception(logging.getLogger('cone'), 'Failed to collect data for report. Exception: %s' % e)
+        
+    # create one list of not generated files
+    for myline in rep_data.lines:
+        for myimpl in myline.impls:
+            for output_file in myimpl.outputfiles:
+                if not output_file.exists and output_file not in rep_data.missing_output_files:
+                    rep_data.missing_output_files.append(output_file)
+    
+    rep_data.set_options(options)
+    rep_data.set_output_dir(options.output)
+    rep_data.update_nbr_of_refs()
+    rep_data.update_nbr_of_refs_noimpl()
+    
+    return rep_data
+
+def generate_report(rep_data, report_file_path, template_file_path=None):
+    """
+    Generate a generation report based on the given report data.
+    @param rep_data: The report data.
+    @param report_file_path: Path to the report file to generate.
+    @param template_file_path: Path to the template file to use.
+        If None, the default template is used.
+    """
+    # Determine the template file and directory to use
+    if template_file_path is None:
+        template_file_path = os.path.join(ROOT_PATH, 'gen_report_template.html')
+    
+    report_util.generate_report(template_file_path, report_file_path, {'rep_data' : rep_data})
+
+class ReportData(object):
+    """
+    Data object that stores all information used in report generation.
+    """
+    
+    def __init__(self):
+        self.generation_timestamp = time.time()
+        self.generation_time = strftime("%d.%m.%Y %H:%M:%S")
+        self.options = None
+        self.lines = []
+        self.nbr_of_refs = 0
+        self.nbr_of_refs_noimpl = 0
+        self.cwd = os.getcwd()
+        self.ref_noimpl = []
+        self.duration = 0
+        self.output_dir = os.getcwd()
+        self.project_dir = ''
+        self.rule_exec_results = []
+        self.missing_output_files = []    
+    
+    def set_output_dir(self, dir):
+        self.output_dir = os.path.abspath(os.path.normpath(dir))
+    
+    def add_line(self, line):
+        self.lines.append(line)
+    
+    def set_duration(self, duration):
+        self.duration = duration
+    
+    def set_options(self, options):
+        self.options = options
+        self.project_dir = os.path.abspath(options.project)
+        
+    def set_report_filename(self, filename):
+        self.report_filename = filename
+        
+    def add_ref_noimpl(self, ref):
+        self.ref_noimpl.append(ref)
+        
+    def update_nbr_of_refs(self):
+        self.nbr_of_refs = len(self.lines)
+    
+    def update_nbr_of_refs_noimpl(self):
+        self.nbr_of_refs_noimpl = len(self.ref_noimpl)
+    
+    def __repr__(self):
+        return "ReportData(%s)" % [self.generation_timestamp, 
+                                   self.generation_time,
+                                   self.options,
+                                   self.lines,
+                                   self.nbr_of_refs,
+                                   self.nbr_of_refs_noimpl,
+                                   self.cwd,
+                                   self.ref_noimpl,
+                                   self.duration,
+                                   self.output_dir,
+                                   self.project_dir,
+                                   self.rule_exec_results,
+                                   self.missing_output_files]    
+    
+class RefLine(object):
+    """
+    Data object that stores information for one ref in report generation.
+    """
+    
+    def __init__(self, ref, type):
+        self.ref = ref
+        self.feat_type = type 
+        self.feat_name = None
+        self.feat_value = None
+        self.config_path = None
+        self.impls = []
+        self.output = None
+        self.nbr_impls = 0
+        self.nbr_outputfiles = 0
+        self.datas = []
+        self.nbr_of_datas = 0
+        self.nbr_of_rows = 0
+        self.seq_data = []
+        self.is_temp_feature = False
+        
+    def add_impl(self, impl_file, impl_type, outputfiles):
+        self.impls.append(ImplLine(impl_file, impl_type, outputfiles))
+        self.nbr_impls = len(self.impls)
+        self.nbr_outputfiles = len(outputfiles) + self.nbr_outputfiles
+
+    def add_data(self, layer, value):
+        self.datas.append(DataLine(layer,value))
+        self.nbr_of_datas = len(self.datas)
+        
+    def add_sequence(self, subsetting, values):
+        self.seq_data.append([subsetting, values])
+        
+    def set_feat_name(self, name):
+        self.feat_name = name
+        
+    def set_feat_value(self, value):
+        self.feat_value = value
+        
+    def set_config_path(self, filename):
+        self.config_path = os.path.normpath(filename)
+        
+class ImplLine():
+    def __init__(self, impl_file, impl_type, outputfiles, generation_runs=[]):
+        self.name = os.path.normpath(impl_file)
+        self.type = impl_type
+        files = []
+        
+        for outputfile in outputfiles:
+            files.append(Outputfile(outputfile))
+        
+        self.outputfiles = files
+        self.generation_runs = generation_runs
+        
+class Outputfile():
+    def __init__(self, filename):
+        self.filename = os.path.normpath(filename)
+        self.abs_filename = os.path.abspath(filename)
+        self.exists = os.path.isfile(self.abs_filename)
+    
+    def __eq__(self, other):
+        if type(self) is type(other):
+            return self.filename == other.filename
+        else:
+            return False
+        
+class DataLine():
+    def __init__(self, layer, value):
+        self.layer = os.path.normpath(layer)
+        self.value = value
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/imaker_variantdir.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,41 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+# iMaker variantdir integration specific changes to the default cfg
+# 
+
+# Sections for different plugins
+[CRML]
+output_subdir=content
+
+[GCFML]
+output_subdir=content
+
+[CONTENT]
+output_subdir=
+
+[IMAGEML]
+output_subdir=content
+
+[MAKEML]
+
+[RULEML]
+
+[ROFS2]
+all-layers = true
+
+[ROFS3 : ROFS2]
+layers = -1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_api_report_template.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+{% for item in data.api_data.columns %}{{ item }},{% endfor %}
+{% for row in data.api_data.data %}{% for colname in data.api_data.columns %}"{{ row[colname] }}",{% endfor %}
+{% endfor %}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_api_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+{% extends "cone_base.html" %}
+{% block title %}API info{% endblock %}
+{% block content %}
+    <h1>Configuration API info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">File</th>
+        {% for item in data.api_data.columns %}
+        <th class="featureName">{{ data.api_data.columns[item] }}</th>
+        {% endfor %}
+    </tr>
+    {% for row in data.api_data.data %}
+    {% if row['type'] != '' %}
+    <tr>
+        <td><a href="file://{{row['file']}}">{{row['file']}}</a></td>
+        {% for colname in data.api_data.columns %}
+        <td>{{ row[colname]|replace('\n', '<br/>') }}</td>
+        {% endfor %}
+    </tr>
+    {% endif %}
+    {% endfor %}
+    
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_content_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,23 @@
+{% extends "cone_base.html" %}
+{% block title %}Content info{% endblock %}
+{% block content %}
+    <h1>Configuration content files</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Content file</th>
+		<th class="featureName">Actual files (used one last)</th>
+    </tr>
+    {% for entry in data.content_data %}
+    <tr>
+        <td>{{ entry.file }}</td>
+		<td>
+		{%- for file in entry.actual_files -%}
+			{{file}}<br/>
+		{%- endfor -%}
+		</td>
+    </tr>
+    {% endfor %}
+    
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_impl_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,40 @@
+{% extends "cone_base.html" %}
+{% block title %}Implementation info{% endblock %}
+{% block content %}
+    <h1>Implementations</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">File</th>
+		<th class="featureName">Index</th>
+		<th class="featureName">Type</th>
+		<th class="featureName">Phase</th>
+		<th class="featureName">Tags</th>
+		<th class="featureName">Refs</th>
+    </tr>
+    {% for impl in data.impl_data %}
+    <tr>
+        <td>{{ impl.ref }}</td>
+		<td>{{ impl.index }}</td>
+		<td>{{ impl.IMPL_TYPE_ID }}</td>
+		<td>{{ impl.invocation_phase() }}</td>
+		<td>
+		{%- for name, value in impl.get_tags().iteritems() -%}
+			{{name}} = {{value}}<br/>
+		{%- endfor -%}
+		</td>
+		<td>
+		{%- set refs = impl.get_refs() -%}
+		{%- if refs == None -%}
+			None
+		{%- else -%}
+			{%- for ref in refs -%}
+				{{ref}}<br/>
+			{%- endfor -%}
+		{%- endif -%}
+		</td>
+    </tr>
+    {% endfor %}
+    
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_value_report_template.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+{#- Note: The empty comments are used for removing line feeds -#}
+Name,Type,Possible values,{% for config in data.value_data.configs %}{{ config.path | csv_escape }},{% endfor %}
+{# -#}
+{% for feature_group in data.value_data.feature_groups %}
+{{ feature_group.name }}
+{% for feature in feature_group.features -%}
+{{ feature.name | csv_escape }},{{ feature.type | csv_escape }},{#- -#}
+"{%- for option in feature.options -%}
+    {{- option.get_name() | csv_escape_partial }}
+{% endfor -%}",
+
+{%- for config in data.value_data.configs -%}
+    {%- if feature.ref in config.values -%}
+        {%- set value = config.values[feature.ref] -%}
+    {%- else -%}
+        {%- set value = "" -%}
+    {%- endif -%}
+    {%- if value.is_sequence_data -%}
+        <sequence data>,
+    {%- else -%}
+        {{ value | csv_escape }},
+    {%- endif -%}
+{%- endfor %}
+{% endfor -%}
+{%- endfor %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/info_value_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,59 @@
+{% extends "cone_base.html" %}
+{% block title %}Data value info{% endblock %}
+{% block content %}
+    <h1>Configuration data value info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        <th class="featureName">Possible values</th>
+        {% for config in data.value_data.configs %}
+        <th class="featureName">{{ config.path }}</th>
+        {% endfor %}
+    </tr>
+    {% for feature_group in data.value_data.feature_groups %}
+    <tr><th colspan="{{ data.value_data.configs | length + 3 }}">{{ feature_group.name }}</th></tr>
+    {% for feature in feature_group.features %}
+    {% if feature.modified %}<tr bgcolor="#CCCCFF">{% else %}<tr>{% endif %}
+        <td>{{ feature.name }}</td>
+        <td>{{ feature.type }}</td>
+        <td>
+        {%- for option in feature.options -%}
+            {{ option.get_name() }}<br/>
+        {% endfor -%}
+        </td>
+        
+        {% for config in data.value_data.configs -%}
+        {%- if feature.ref in config.values -%}
+            {%- set value = config.values[feature.ref] %}
+        {% else -%}
+            {%- set value = "" %}
+        {% endif -%}
+        <td>
+            {%- if value.is_sequence_data -%}
+                {% if value.rows|length > 0 %}
+                    <table>
+                    {%- for row in value.rows -%}
+                        <tr><td colspan="2"><b>Item {{ loop.index }}</b></td></tr>
+                        {%- for column in value.columns -%}
+                            <tr>
+                            <td><b>{{ column.name }}</b></td>
+                            <td>{{ row[column.ref] }}</td>
+                            </tr>
+                        {%- endfor -%}
+                    {%- endfor -%}
+                </table>
+                {% endif %}
+            {%- else -%}
+                {{- value -}}
+            {%- endif -%}
+        </td>
+        {% endfor %}
+        
+    </tr>
+    {% endfor -%}
+    {% endfor %}
+    
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/logging.ini	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,42 @@
+[DEFAULT]
+
+[loggers]
+keys=root,cone
+
+[handlers]
+keys=fileHandler,consoleHandler
+
+[formatters]
+keys=fileFormatter,consoleFormatter 
+
+[logger_root]
+# Explicitly define level, since otherwise the default level would be used
+level=NOTSET
+handlers=fileHandler,consoleHandler
+
+[logger_cone]
+level=NOTSET
+qualname=cone
+handlers=
+
+[handler_consoleHandler]
+class=StreamHandler
+formatter=consoleFormatter
+args=(sys.stdout,)
+# level is not defined here , since it is expected to come from the defaults,
+# which in turn comes from the command line
+
+[handler_fileHandler]
+class=FileHandler
+level=DEBUG
+formatter=fileFormatter
+args=('%(logfile)s','w')
+
+[formatter_consoleFormatter]
+format=%(levelname)-8s: %(name)s 
+ %(message)s
+datefmt=%m-%d %H:%M
+
+[formatter_fileFormatter]
+format=%(asctime)s %(levelname)-8s: %(name)s 
+ %(message)s
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/report_util.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,190 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os
+import urllib
+import logging
+from jinja2 import Environment, FileSystemLoader, Template
+from cone.public import utils
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+log = logging.getLogger('cone.report_util')
+
+class ReportShortcut(object):
+    def __init__(self, template_file, report_file, description):
+        self.template_file = template_file
+        self.report_file = report_file
+        self.description = description
+
+class ReportShortcutContainer(object):
+    """
+    Container for report shortcuts.
+    
+    A report shortcut describes a pre-defined report option that
+    has a default template, report file and description. The shortcut
+    container holds a set of shortcuts and can be used to generate
+    
+    """
+    def __init__(self, shortcuts, default_shortcut):
+        """
+        @param shortcuts: The shortcuts, a dictionary mapping shortcut
+            names to ReportShortcut objects.
+        @param default_shortcut: The default shortcut name to use
+        """
+        if not isinstance(shortcuts, dict):
+            raise ValueError("'shortcuts' must a dictionary (%s given)!" % type(shortcuts))
+        if default_shortcut is not None and default_shortcut not in shortcuts:
+            raise ValueError("'default_shortcut' must be either None or exist ing 'shortcuts'!")
+        self.shortcuts = shortcuts
+        self.default_shortcut = default_shortcut
+    
+    def get_shortcut_help_text(self):
+        """
+        Create the text to append to the option description for the
+        option used to specify the used shortcut.
+        """
+        shortcuts_text = []
+        refs = sorted(self.shortcuts.keys())
+        if refs:
+            for ref in refs:
+                sc = self.shortcuts[ref]
+                text = "%s - %s" % (ref, sc.description)
+                COLUMN_WIDTH = (80 - 25)
+                space_count = COLUMN_WIDTH - (len(text) % COLUMN_WIDTH)
+                shortcuts_text.append(text + space_count * ' ')
+        else:
+            shortcuts_text.append("None")
+        shortcuts_text = '\n'.join(shortcuts_text)
+        return shortcuts_text
+    
+    def is_valid_shortcut(self, shortcut):
+        """
+        Return whether the given shortcut is valid within the context
+        of this container.
+        """
+        return shortcut is None or shortcut in self.shortcuts
+    
+    def determine_template_and_report(self, shortcut, template_file, report_file, report_file_name_without_ext):
+        """
+        Determine the actual template and report files based on the shortcuts
+        and given options.
+        @param shortcut: The used shortcut or None.
+        @param template_file: Explicitly given template file or None.
+        @param report_file: Explicitly given report file or None.
+        @param report_file_name_without_ext: Prefix used to determine the
+            report file name if the template was explicitly given, but the
+            report file was not. E.g. if this is 'test' and the explicitly
+            given template file is 'my_template.html', the report file would
+            be 'test.html'.
+        @return: Tuple (template_file, report_file) specifying the actual
+            template and report files.
+        """
+        actual_shortcut      = None
+        actual_template_file = None
+        actual_report_file   = None
+        
+        # Handle report shortcut (set to default or check the given one)
+        if not shortcut:
+            actual_shortcut = self.default_shortcut
+        else:
+            actual_shortcut = shortcut
+        
+        # Determine template file
+        if template_file:
+            actual_template_file = template_file
+        else:
+            actual_template_file = self.shortcuts[actual_shortcut].template_file
+        
+        # Determine report output file
+        if report_file:
+            actual_report_file = report_file
+        else:
+            if template_file:
+                # Determine report file name based on the template file name
+                # if the template was explicitly given
+                actual_report_file = report_file_name_without_ext + os.path.splitext(template_file)[1]
+            else:
+                actual_report_file = self.shortcuts[actual_shortcut].report_file
+        
+        return actual_template_file, actual_report_file
+
+def generate_report(template_file, report_file, report_data):
+    """
+    Generate a report based on the given template file, report file
+    and data dictionary.
+    @param template_file: Path to the template file to use.
+    @param report_file: Path to the output report file.
+    @param report_data: The report data dictionary used when rendering
+        the report from the template.
+    @return: True if successful, False if not.
+    """
+    log.debug('generate_report(template_file=%r, report_file=%r, <data>)' % (template_file, report_file))
+    if not isinstance(report_data, dict):
+        raise ValueError("report_data must be a dictionary!")
+    
+    try:
+        template_file = os.path.abspath(template_file)
+        
+        loader = FileSystemLoader([os.path.dirname(template_file), ROOT_PATH])
+        env = Environment(loader=loader)
+        _set_default_filters(env)
+        
+        template = env.get_template(os.path.basename(template_file))
+        file_string = template.render(report_data)
+        
+        # Create directories for the report
+        report_dir = os.path.dirname(report_file)
+        if report_dir != '' and not os.path.exists(report_dir):
+            os.makedirs(report_dir)
+        
+        # Write the rendered report to file
+        f = open(report_file, 'wb')
+        try:        f.write(file_string.encode('utf-8'))
+        finally:    f.close()
+        
+        print "Generated report to '%s'" % report_file
+        return True
+    except Exception, e:
+        utils.log_exception(log, "Failed to generate report: %s %s" % (type(e), e))
+        return False
+
+def _set_default_filters(env):
+    """
+    Set default filters to the given Jinja environment
+    """
+    env.filters['xml_charref_replace'] = lambda value: unicode(value).encode('ascii', 'xmlcharrefreplace')
+    env.filters['pathname_to_url'] = lambda value: urllib.pathname2url(value)
+    env.filters['csv_escape'] = _csv_escape
+    env.filters['csv_escape_partial'] = lambda value: unicode(value).replace('"', '""')
+
+def _csv_escape(value):
+    """
+    Escape a string value so that it can be used as a field in a CSV file.
+    """
+    value = unicode(value)
+    
+    needs_quoting = False
+    for special_char in '",\n':
+        if special_char in value:
+            needs_quoting = True
+    
+    if needs_quoting:
+        if '"' in value:
+            value = value.replace('"', '""')
+        value = '"' + value + '"'
+    
+    return value
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,64 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from pkg_resources import require
+require("setuptools")
+from setuptools import setup, find_packages
+
+datafiles = ['gen_report_template.html',
+             'cone_defaults.cfg',
+             'conesub_generate.cfg',
+             'imaker_variantdir.cfg',
+             'logging.ini',
+             'cone_base.html',
+             'compare_api_report_template.html',
+             'compare_data_report_template.html',
+             'info_api_report_template.csv',
+             'info_api_report_template.html',
+             'info_impl_report_template.html',
+             'info_content_report_template.html',
+             'info_value_report_template.html',
+             'info_value_report_template.csv',
+             'crml_dc_report_template.csv',
+             'crml_dc_report_template.html']
+
+setup(
+    name = "cone-scripts",
+    version = '1.0',
+    scripts = ['cone_tool.py',
+               'cone_common.py',
+               'cone_subaction.py',
+               'conesub_info.py',
+               'conesub_export.py',
+               'conesub_generate.py',
+               'conesub_merge.py',
+               'conesub_compare.py',
+               #'conesub_import_browserbookmarks.py',
+               'conesub_update.py',
+               'conesub_report.py',
+               'generation_report.py',
+               'report_util.py'] + 
+               datafiles,
+
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine scripts",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone. scripts",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+    zip_safe = False
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../..'))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'plugins'))
+assert os.path.split(SOURCE_ROOT)[1] == 'source'
+assert os.path.split(PLUGIN_SOURCE_ROOT)[1] == 'plugins'
+
+def _setup():
+    """
+    Set up everything so that running "python cone_tool.py" finds the ConE
+    and plug-in modules.
+    """
+    sys.path.append(SOURCE_ROOT)
+    sys.path.append(os.path.join(SOURCE_ROOT, 'testautomation'))
+    
+    # Import the plugin_utils module from plugins/
+    sys.path.append(PLUGIN_SOURCE_ROOT)
+    import plugin_utils
+    del sys.path[-1]
+    
+    # Collect all needed plug-in source directories (all in 'common')
+    plugin_sources = plugin_utils.find_plugin_sources(os.path.join(PLUGIN_SOURCE_ROOT, 'common'))
+    plugin_source_paths = [path for path, _ in plugin_sources]
+    
+    paths = []
+    paths.append(SOURCE_ROOT)
+    paths.extend(plugin_source_paths)
+    os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + ';' + ';'.join(paths)
+    
+    # Generate egg-info for the plug-ins if necessary
+    import build_egg_info
+    for path in plugin_source_paths:
+        build_egg_info.generate_egg_info(path)
+
+_setup()
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    suite = unittest.TestSuite()
+    for test_module in __all__:
+        # Load the test module dynamically and add it to the test suite
+        module = __import__(test_module)
+        suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+    return suite
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/export_standalone/export_standalone.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,132 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, shutil, imp
+from optparse import OptionParser
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+SOURCE_ROOT = os.path.normpath(os.path.join(ROOT_PATH, '../../..'))
+PLUGIN_SOURCE_ROOT = os.path.normpath(os.path.join(SOURCE_ROOT, 'plugins'))
+assert os.path.split(SOURCE_ROOT)[1] == 'source'
+assert os.path.split(PLUGIN_SOURCE_ROOT)[1] == 'plugins'
+
+sys.path.append(os.path.normpath(os.path.join(SOURCE_ROOT, 'testautomation')))
+import testautomation
+from testautomation.copy_dir import copy_dir
+
+def build_egg(dir, target_dir):
+    orig_workdir = os.getcwd()
+    os.chdir(dir)
+    try:
+        os.system('python setup.py bdist_egg --dist-dir "%s"' % target_dir)
+    finally:
+        os.chdir(orig_workdir)
+
+def read_export_function_from_file(file_path):
+    if not os.path.exists(file_path):
+        return None
+    
+    m = imp.load_source(
+        file_path.replace('\\', '__')
+                 .replace('/', '__')
+                 .replace(':', '_')
+                 .replace('.', '_')
+                 .replace(' ', '_'),
+        file_path)
+    
+    try:
+        return m.export_standalone
+    except AttributeError:
+        return None
+
+def main(argv):
+    # Parse args
+    parser = OptionParser()
+    parser.add_option("--target-dir",
+                      help="The directory where the test are to be exported.",
+                      metavar="COMMAND")
+    parser.add_option("--plugin-subpackage",\
+                      help="The plug-in package for exporting plug-in integration tests.",\
+                      default=None,\
+                      metavar="SUBPACKAGE")
+    (options, args) = parser.parse_args()
+    if options.target_dir is None:
+        parser.error("Target directory must be given")
+    if options.plugin_subpackage is None:
+        parser.error("Plug-in sub-package name must be given")
+    
+    TARGET_PATH = options.target_dir
+    PLUGIN_PACKAGES = ['common']
+    if options.plugin_subpackage.lower() not in ('', 'common'):
+       PLUGIN_PACKAGES.append(options.plugin_subpackage)
+    
+    print "(Re)creating dir '%s'..." % TARGET_PATH
+    if os.path.exists(TARGET_PATH):
+        shutil.rmtree(TARGET_PATH)
+    os.makedirs(TARGET_PATH)
+    
+    
+    print "Copying script test files..."
+    copy_dir(source_dir             = os.path.join(ROOT_PATH, '..'),
+             target_dir             = os.path.join(TARGET_PATH, 'tests'),
+             dir_ignore_functions   = [lambda d: d in ('.svn', 'temp', 'export_standalone')],
+             file_ignore_functions  = [lambda f: f == 'cone.log' or f.endswith('.pyc')])
+    
+    print "Copying plug-in integration test files..."
+    for name in PLUGIN_PACKAGES:
+        print "  Processing plug-in package '%s'..." % name
+        
+        package_path = os.path.join(PLUGIN_SOURCE_ROOT, name)
+        if not os.path.isdir(package_path):
+            print "    '%s' does not exist or is not a directory!" % package_path
+            return 1
+        
+        tests_path = os.path.join(package_path, 'integration-test')
+        if not os.path.isdir(tests_path):
+            print "    No 'integration-test' directory, skipping"
+            continue
+        
+        print "    Copying test files..."
+        target_path = os.path.join(TARGET_PATH, 'plugin-tests', name + '_tests')
+        copy_dir(source_dir             = tests_path,
+                 target_dir             = target_path,
+                 dir_ignore_functions   = [lambda d: d in ('.svn', 'temp')],
+                 file_ignore_functions  = [lambda f: f in ('cone.log', 'export_standalone.py') or f.endswith('.pyc')])
+        
+        print "    Overwriting __init__.py..."
+        f = open(os.path.join(target_path, '__init__.py'), 'wb')
+        f.close()
+        
+        print "    Exporting extra data..."
+        func = read_export_function_from_file(os.path.join(tests_path, 'export_standalone.py'))
+        if func:
+            print "      Executing export function..."
+            func(target_path)
+    
+    print "Copying overlay files..."
+    copy_dir(source_dir = os.path.join(ROOT_PATH, "overlay"),
+             target_dir = TARGET_PATH,
+             dir_ignore_functions   = [lambda d: d  == '.svn'])
+    
+    
+    print "Building eggs..."
+    eggs_dir = os.path.join(TARGET_PATH, 'eggs')
+    build_egg(os.path.join(SOURCE_ROOT), eggs_dir)
+    build_egg(os.path.join(SOURCE_ROOT, 'testautomation'), eggs_dir)
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main(sys.argv))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/export_standalone/overlay/readme.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+ConE automated basic acceptance tests
+-------------------------------------
+
+Execution steps:
+1. Extract the ConE release to test under cone/
+2. Execute runtests.cmd
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/export_standalone/overlay/runtests.cmd	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+
+python %~dp0%\runtests.py
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/export_standalone/overlay/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,91 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, re, unittest
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+CONE_PATH = os.path.join(ROOT_PATH, 'cone')
+EGGS_PATH = os.path.join(ROOT_PATH, 'eggs')
+
+def add_eggs_to_path(egg_path):
+    if not os.path.isdir(egg_path):
+        return
+    
+    for name in os.listdir(egg_path):
+        if name.endswith('.egg'):
+            path = os.path.normpath(os.path.join(egg_path, name))
+            if path not in sys.path:
+                print "Adding '%s' to path" % name
+                sys.path.append(path)
+
+
+def collect_test_suite(base_dir, module_subdir, cone_cmd):
+    # Check that the directory exists
+    module_dir = os.path.join(base_dir, module_subdir)
+    if not os.path.exists(module_dir):
+        raise RuntimeError("'%s' does not exist!" % module_dir)
+    
+    # Collect the names of all test modules (of the form "unittest_*.py")
+    test_modules_names = []
+    for name in os.listdir(module_dir):
+        if re.match(r'^unittest_.*\.py$', name) != None:
+            test_modules_names.append(name[:-3])
+    
+    # Import the modules
+    sys.path.insert(0, base_dir)
+    try:
+        suite = unittest.TestSuite()
+        for modname in test_modules_names:
+            # Load the test module dynamically and add it to the test suite
+            top_module = __import__(module_subdir + '.' + modname)
+            
+            # top_module contains now actually e.g. mymodule.unittest_sometest,
+            # so get the actual unit test module
+            module = getattr(top_module, modname)
+            
+            module.CONE_CMD = cone_cmd
+            suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+        return suite
+    finally:
+        del sys.path[0]
+
+def main():
+    CONE_CMD = os.path.join(CONE_PATH, 'cone.cmd')
+    if not os.path.exists(CONE_CMD):
+        print "cone.cmd not detected under '%s', exiting..." % CONE_PATH
+        return 0
+    
+    add_eggs_to_path(EGGS_PATH)
+    
+    suite = unittest.TestSuite()
+    
+    # Collect script test suite
+    suite.addTest(collect_test_suite(ROOT_PATH, 'tests', CONE_CMD))
+    
+    # Collect test suites from the plugin-tests/ directory
+    PLUGIN_TEST_DIR = os.path.join(ROOT_PATH, 'plugin-tests')
+    if os.path.exists(PLUGIN_TEST_DIR):
+        for name in os.listdir(PLUGIN_TEST_DIR):
+            plugin_suite = collect_test_suite(PLUGIN_TEST_DIR, name, CONE_CMD)
+            suite.addTest(plugin_suite)
+    
+    # Run the tests
+    unittest.TextTestRunner(verbosity=2).run(suite)
+    return 0
+
+if __name__ == "__main__":
+    sys.exit(main())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/export_standalone/overlay/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
Binary file configurationengine/source/scripts/tests/export_test_project.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/.project	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>test_project</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>com.nokia.tools.variant.confml.core.ConfMLLayerBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.nokia.s60ct.build.CenRepBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>com.nokia.tools.variant.confml.core.ConfMLLayerNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+		<nature>com.nokia.s60ct.build.CenRepNature</nature>
+	</natures>
+</projectDescription>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/basic_setting_types_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="BasicSettingTypesTest" name="Basic setting types test">
+    <confml:desc>Feature with basic setting types (ConfML v2.0)</confml:desc>
+    <confml:setting ref="RealSetting" name="Real setting" type="real">
+      <confml:desc>A real setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="IntSetting" name="Int setting" type="int">
+      <confml:desc>An int setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="StringSetting" name="String setting" type="string">
+      <confml:desc>A string setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <confml:desc>A boolean setting</confml:desc>
+    </confml:setting>
+    <confml:setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <confml:desc>A selection setting</confml:desc>
+      <confml:option name="Option0" value="0"/>
+      <confml:option name="Option1" value="1"/>
+      <confml:option name="Option2" value="2"/>
+      <confml:option name="Option3" value="3"/>
+      <confml:option name="Option4" value="4"/>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>3.14</confml:RealSetting>
+      <confml:IntSetting>10</confml:IntSetting>
+      <confml:StringSetting>default string</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>1</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:data>
+  
+  <confml:rfs>
+    <confml:BasicSettingTypesTest>
+      <confml:RealSetting>true</confml:RealSetting>
+      <confml:IntSetting>false</confml:IntSetting>
+      <confml:StringSetting>false</confml:StringSetting>
+      <confml:BooleanSetting>true</confml:BooleanSetting>
+      <confml:SelectionSetting>true</confml:SelectionSetting>
+    </confml:BasicSettingTypesTest>
+  </confml:rfs>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/scripts/tests/generation_test_project/base/confml/feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/file_folder_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Time types test">
+  <confml:feature ref="FileFolderTest" name="File &amp; folder types test">
+    <confml:desc>Feature with file and folder setting types</confml:desc>
+    <confml:setting ref="FolderSetting" name="Folder setting" type="folder">
+      <confml:desc>A folder setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+    <confml:setting ref="FileSetting" name="File setting" type="file">
+      <confml:desc>A file setting</confml:desc>
+      <confml:localPath/>
+      <confml:targetPath readOnly="true"/>
+    </confml:setting>
+  </confml:feature>
+  <confml:data>
+    <confml:FileFolderTest>
+      <confml:FolderSetting>
+        <confml:localPath>default_folder</confml:localPath>
+        <confml:targetPath>default_target_folder/</confml:targetPath>
+      </confml:FolderSetting>
+      <confml:FileSetting>
+        <confml:localPath>default_file.txt</confml:localPath>
+        <confml:targetPath>default_target_folder/default_file_renamed.txt</confml:targetPath>
+      </confml:FileSetting>
+    </confml:FileFolderTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/multiselection.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Multi-selection test">
+  <feature ref="MultiSelectionTest" name="Multi-selection test feature">
+    <desc>Multi-selection test feature (ConfML v2.0)</desc>
+    <setting ref="MultiSelectionSetting" name="Multi-selection setting" type="multiSelection">
+      <desc>A multi-selection setting</desc>
+      <option name="Option 0" value="opt 0"/>
+      <option name="Option 1" value="opt 1"/>
+      <option name="Option 2" value="opt 2"/>
+      <option name="Option 3" value="opt 3"/>
+      <option name="Option 4" value="opt 4"/>
+      <option name="opt 5" value="opt 5"/>
+    </setting>
+  </feature>
+  
+  <data>
+    <MultiSelectionTest>
+      <MultiSelectionSetting>"opt 1" "opt 3"</MultiSelectionSetting>
+    </MultiSelectionTest>
+  </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/name_id_mapping_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Test features for testing name-ID mappings" version="1">
+    <feature ref="NameIdMappingTestSourceSequences" name="Source sequences for name-ID mappings">
+        <setting ref="StringSequence" name="String sequence" type="sequence" mapKey="Value" mapValue="Value">
+            <setting ref="Value" name="Value sub-setting" type="string"/>
+        </setting>
+        
+        <setting ref="StringToIntSequence" name="String-to-int sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="int"/>
+        </setting>
+        
+        <setting ref="StringToRealSequence" name="String-to-real sequence" type="sequence" mapKey="Name" mapValue="Value">
+            <setting ref="Name" name="Name sub-setting" type="string"/>
+            <setting ref="Value" name="Value sub-setting" type="real"/>
+        </setting>
+    </feature>
+
+
+    <feature ref="NameIdMappingTestTargetSettings" name="Target settings for name-ID mappings">
+        <setting ref="Selection" name="Selection setting" type="selection">
+            <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+            <option name="None" value="&quot;&quot;"/>
+        </setting>
+        
+        <setting ref="Int" name="Int setting" type="int">
+            <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Real" name="Real setting" type="real">
+            <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+            <option name="Zero" value="0"/>
+        </setting>
+        
+        <setting ref="Sequence" name="Sequence" type="sequence">
+            <setting ref="Selection" name="Selection sub-setting" type="selection">
+                <option map="NameIdMappingTestSourceSequences/StringSequence"/>
+                <option name="None" value="&quot;&quot;"/>
+            </setting>
+            
+            <setting ref="Int" name="Int sub-setting" type="int">
+                <option map="NameIdMappingTestSourceSequences/StringToIntSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+            
+            <setting ref="Real" name="Real sub-setting" type="real">
+                <option map="NameIdMappingTestSourceSequences/StringToRealSequence"/>
+                <option name="Zero" value="0"/>
+            </setting>
+        </setting>
+    </feature>
+
+    <data>
+        <NameIdMappingTestSourceSequences>
+            <StringSequence template="true">
+                <Value></Value>
+            </StringSequence>
+            <StringSequence><Value>Entry 1</Value></StringSequence>
+            <StringSequence><Value>Entry 2</Value></StringSequence>
+            <StringSequence><Value>Entry 3</Value></StringSequence>
+            
+            <StringToIntSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToIntSequence>
+            <StringToIntSequence><Name>Entry 1</Name><Value>100</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 2</Name><Value>120</Value></StringToIntSequence>
+            <StringToIntSequence><Name>Entry 3</Name><Value>130</Value></StringToIntSequence>
+            
+            
+            <StringToRealSequence template="true">
+                <Name></Name>
+                <Value></Value>
+            </StringToRealSequence>
+            <StringToRealSequence><Name>Entry 1</Name><Value>1.1</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 2</Name><Value>1.2</Value></StringToRealSequence>
+            <StringToRealSequence><Name>Entry 3</Name><Value>1.3</Value></StringToRealSequence>
+        </NameIdMappingTestSourceSequences>
+        
+        
+        <NameIdMappingTestTargetSettings>
+            <Selection></Selection>
+            <Int>0</Int>
+            <Real>0</Real>
+            
+            <Sequence template="true">
+                <Selection></Selection>
+                <Int>0</Int>
+                <Real>0</Real>
+            </Sequence>
+        </NameIdMappingTestTargetSettings>
+    </data>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/confml/sequence_setting_test.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="Basic setting types test">
+  <confml:feature ref="SequenceSettingTest" name="Sequence setting test">
+    <confml:desc>Feature with a sequence setting (ConfML v2.0)</confml:desc>
+    <confml:setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <confml:desc>A sequence setting</confml:desc>
+      <confml:setting ref="FolderSubSetting" name="Folder sub-setting" type="folder">
+        <confml:desc>A folder sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <confml:desc>A real sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="FileSubSetting" name="File sub-setting" type="file">
+        <confml:desc>A file sub-setting</confml:desc>
+        <confml:localPath/>
+        <confml:targetPath readOnly="true"/>
+      </confml:setting>
+      <confml:setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <confml:desc>An int sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <confml:desc>A string sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <confml:desc>A boolean sub-setting</confml:desc>
+      </confml:setting>
+      <confml:setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <confml:desc>A selection sub-setting</confml:desc>
+        <confml:option name="Op0" value="0"/>
+        <confml:option name="Op1" value="1"/>
+        <confml:option name="Op2" value="2"/>
+        <confml:option name="Op3" value="3"/>
+        <confml:option name="Op4" value="4"/>
+      </confml:setting>
+    </confml:setting>
+  </confml:feature>
+  
+  <confml:data>
+    <confml:SequenceSettingTest>
+      <confml:SequenceSetting template="true">
+        <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.0</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>1</confml:IntSubSetting>
+        <confml:StringSubSetting>template</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>0</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def1_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.25</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def1_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>128</confml:IntSubSetting>
+        <confml:StringSubSetting>def1</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      <confml:SequenceSetting>
+        <confml:FolderSubSetting><confml:localPath>seq/def2_folder</confml:localPath></confml:FolderSubSetting>
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:FileSubSetting><confml:localPath>seq/def2_file.txt</confml:localPath></confml:FileSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>def2</confml:StringSubSetting>
+        <confml:BooleanSubSetting>false</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+    </confml:SequenceSettingTest>
+  </confml:data>
+</confml:configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/implml/multiselection.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <output file="multiselection.txt" encoding="UTF-8">
+        <template>Selected options: {% for value in feat_tree.MultiSelectionTest.MultiSelectionSetting._value or [] -%}"{{ value }}", {% endfor %}</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/implml/name_id_mapping_test.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude">
+    <output file="name_id_mapping_test.txt" encoding="UTF-8">
+        <template>
+Selection: {{ feat_tree.NameIdMappingTestTargetSettings.Selection._value }}
+Int: {{ feat_tree.NameIdMappingTestTargetSettings.Int._value }}
+Real: {{ feat_tree.NameIdMappingTestTargetSettings.Real._value }}
+Sequence.Selection: {% for value in feat_tree.NameIdMappingTestTargetSettings.Sequence.Selection._value -%}"{{ value }}", {% endfor %}
+Sequence.Int: {% for value in feat_tree.NameIdMappingTestTargetSettings.Sequence.Int._value -%}"{{ value }}", {% endfor %}
+Sequence.Real: {% for value in feat_tree.NameIdMappingTestTargetSettings.Sequence.Real._value -%}"{{ value }}", {% endfor %}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/base/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Base layer">
+  <xi:include href="confml/basic_setting_types_test.confml"/>
+  <xi:include href="confml/feature1.confml"/>
+  <xi:include href="confml/feature2.confml"/>
+  <xi:include href="confml/file_folder_test.confml"/>
+  <xi:include href="confml/multiselection.confml"/>
+  <xi:include href="confml/name_id_mapping_test.confml"/>
+  <xi:include href="confml/sequence_setting_test.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/confml/custom.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2"
+ name="Custom configuration settings">
+  <confml:feature ref="CustomConfSettings" name="Custom configuration settings">
+    <confml:desc>Settings for configuring the base layer's settings via rules and other implementation files on this layer</confml:desc>
+  </confml:feature>
+  <confml:data>
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/confml/view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2">
+  <confml:view name="Test view">
+    <confml:desc>Testing view located on layer 1.</confml:desc>
+    <confml:group name="ConfML v1.0 settings">
+      <confml:setting ref="Feature1/RealSetting"/>
+      <confml:setting ref="Feature1/IntSetting"/>
+      <confml:setting ref="Feature1/StringSetting"/>
+      <confml:setting ref="Feature1/BooleanSetting"/>
+      <confml:setting ref="Feature1/SelectionSetting"/>
+      <confml:setting ref="Feature1/SequenceSetting"/>
+      <confml:setting ref="Feature2/SequenceSetting"/>
+      <confml:setting ref="StringToIntSequenceFeature/SequenceSetting"/>
+      <confml:setting ref="NameIdMappingTest/StringToInt"/>
+    </confml:group>
+    <confml:group name="ConfML v2.0 settings">
+      <confml:setting ref="BasicSettingTypesTest/RealSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/IntSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/StringSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/BooleanSetting"/>
+      <confml:setting ref="BasicSettingTypesTest/SelectionSetting"/>
+      <confml:setting ref="FileFolderTest/FolderSetting"/>
+      <confml:setting ref="FileFolderTest/FileSetting"/>
+      <confml:setting ref="SequenceSettingTest/SequenceSetting"/>
+    </confml:group>
+    <confml:group name="Custom ConfML settings">
+      <confml:setting ref="CustomConfSettings/*"/>
+    </confml:group>
+    <confml:group name="Name-ID mapping test settings">
+      <confml:group name="Source sequences">
+        <confml:setting ref="NameIdMappingTestSourceSequences/*"/>
+      </confml:group>
+      <confml:group name="Target settings">
+        <confml:setting ref="NameIdMappingTestTargetSettings/*"/>
+      </confml:group>
+    </confml:group>
+  </confml:view>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/content/apps/app1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/content/apps/app2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/content/invocation_phase_test_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/content/invocation_phase_test_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/conditional_container.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <!-- Define the temporary variables and set their values -->
+    <tempVariable ref="Condition.String"   type="string"   value="testing"/>
+    <tempVariable ref="Condition.Int"      type="int"      value="500"/>
+    <tempVariable ref="Condition.Real"     type="real"     value="1.5"/>
+    <tempVariable ref="Condition.Boolean"  type="boolean"  value="true"/>
+    <tempVariable ref="Condition.Unused"   type="boolean"  value="false"/>
+    
+    <container condition="${Condition.String}" value="testing">
+        <!-- Print out the values to a text file -->
+        <templateml xmlns="http://www.s60.com/xml/templateml/1">
+        <output file="template_string_condition_true.txt" dir="content" encoding="UTF-8">
+        <template>
+TempFeature.String:  {{ feat_tree.TempFeature.String._value }}
+        </template>
+        </output>
+        </templateml>
+    </container>
+    
+    <container condition="${Condition.String}" value="nomatch">
+        <!-- Print out the values to a text file -->
+        <templateml xmlns="http://www.s60.com/xml/templateml/1">
+        <output file="template_string_condition_false.txt" dir="content" encoding="UTF-8">
+        <template>
+TempFeature.String:  {{ feat_tree.TempFeature.String._value }}
+        </template>
+        </output>
+        </templateml>
+    </container>
+
+    <container condition="${Condition.Boolean}">
+        <!-- Print out the values to a text file -->
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output flatten="true" dir="sis">
+                <input file="apps/app1.txt"/>
+            </output>
+        </content >
+    </container>
+
+    <container condition="${Condition.Boolean}" value="false">
+        <!-- Print out the values to a text file -->
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="sis">
+                <input>
+                  <include dir="apps" pattern="app2.txt"/>
+                </input>
+            </output>
+        </content >
+    </container>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/invocation_phase_test.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<implml:container xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <implml:container>
+        <implml:phase name="normal"/>
+        <!-- Test using the common ImplML namespace <phase> element -->
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="content/invocation_phase_test_common_ns.txt">
+                <input dir="invocation_phase_test_1.txt"/>
+            </output>
+        </content>
+    </implml:container>
+    
+    <implml:container>
+        <implml:phase name="post"/>
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="content/invocation_phase_test_common_ns.txt">
+                <input dir="invocation_phase_test_2.txt"/>
+            </output>
+        </content>
+    </implml:container>
+    
+    
+    <implml:container>
+        <!-- Test using the phase attribute in the ContentML namespace -->
+        <content xmlns="http://www.s60.com/xml/content/2" phase="normal">
+            <output dir="content/invocation_phase_test_contentml_ns.txt">
+                <input dir="invocation_phase_test_1.txt"/>
+            </output>
+        </content>
+        
+        <content xmlns="http://www.s60.com/xml/content/2" phase="post">
+            <output dir="content/invocation_phase_test_contentml_ns.txt">
+                <input dir="invocation_phase_test_2.txt"/>
+            </output>
+        </content>
+    </implml:container>
+        
+</implml:container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/missing_file_in_report_test.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+
+    <container>
+        <tempVariable ref="TempFeatureMissingFile.Test1" type="string" value="testing 1"/>
+        <tempVariable ref="TempFeatureMissingFile.Test2" type="string" value="testing 2"/>
+    
+        <container>
+            <phase name="normal"/>
+            <!-- TemplateML for creating two output files -->
+            <templateml xmlns="http://www.s60.com/xml/templateml/1">
+                <output file="missing_output_file_test1.txt" dir="content" encoding="UTF-8">
+                    <template>{{ feat_tree.TempFeatureMissingFile.Test1._value }}</template>
+                </output>
+                <output file="missing_output_file_test2.txt" dir="content" encoding="UTF-8">
+                    <template>{{ feat_tree.TempFeatureMissingFile.Test2._value }}</template>
+                </output>
+            </templateml>
+        </container>
+            
+        <!--
+        Rules for removing the output files in the post phase
+        so that the output files will not be there when the report is generated
+        -->
+        <container>
+            <phase name="post"/>
+            <ruleml xmlns="http://www.s60.com/xml/ruleml/2">
+                <rule>True configures TempFeatureMissingFile.Test1 = {% delete_file('output/content/missing_output_file_test1.txt') %}</rule>
+                <rule>True configures TempFeatureMissingFile.Test2 = {% delete_file('output/content/missing_output_file_test2.txt') %}</rule>
+                
+                <eval_globals>
+def delete_file(file):
+    import os
+    print "removing %s" % file
+    os.remove(file)
+                </eval_globals>
+            </ruleml>
+        </container>
+    </container>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/output_override_test.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <!-- Content copy with an overridden output sub-directory -->
+    <container>
+        <outputSubDir value="test_subdir"/>
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="output_subdir_test.txt">
+                <input dir="invocation_phase_test_1.txt"/>
+            </output>
+        </content>
+    </container>
+    
+    <!-- Content copy with an overridden output root directory -->
+    <container>
+        <outputRootDir value="overridden_output"/>
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="output_rootdir_test.txt">
+                <input dir="invocation_phase_test_1.txt"/>
+            </output>
+        </content>
+    </container>
+    
+    <!-- Content copy with an both overridden -->
+    <container>
+        <outputRootDir value="overridden_output"/>
+        <outputSubDir value="test_subdir"/>
+        <content xmlns="http://www.s60.com/xml/content/2">
+            <output dir="output_rootdir_test.txt">
+                <input dir="invocation_phase_test_1.txt"/>
+            </output>
+        </content>
+    </container>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/seq_tempvar.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1"
+           xmlns:ruleml="http://www.s60.com/xml/ruleml/2"
+           xmlns:content="http://www.s60.com/xml/content/1">
+    <!-- Temporary sequence feature for storing the list of files to copy -->
+    <tempVariableSequence ref="TempFeature2.FilesToCopy">
+        <tempVariable ref="FilePath" type="string"/>
+    </tempVariableSequence>
+    <settingRefsOverride refsIrrelevant="true"/>
+
+    <container>
+        <phase name="pre"/>
+        <!-- Rule for setting the contents of the file copy list -->
+        <ruleml:ruleml>
+            <ruleml:eval_globals file="seq_tempvar.py"/>
+            <ruleml:rule>True configures TempFeature2.FilesToCopy = {% get_file_seq() %}</ruleml:rule>
+        </ruleml:ruleml>
+    </container>
+
+    <container>
+        <phase name="normal"/>
+        <content:content>
+            <!-- The ContentML implementation for copying the files -->
+            <content:input>
+                <content:include files="${TempFeature2.FilesToCopy.FilePath}"/>
+            </content:input> 
+            <content:output dir="content\temp_seq_test\" flatten="true" />
+        </content:content>
+    </container>
+    
+    
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/seq_tempvar.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+def get_file_seq():
+    # Just return some files present on the custom/ layer
+    return [['invocation_phase_test_1.txt'],
+            ['invocation_phase_test_2.txt'],
+            ['overlay/overlay_folder/overlay.txt']]
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/implml/simple_tempvars.implml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <!-- Define the temporary variables and set their values -->
+    <tempVariable ref="TempFeature.String"   type="string"   value="testing"/>
+    <tempVariable ref="TempFeature.Int"      type="int"      value="500"/>
+    <tempVariable ref="TempFeature.Real"     type="real"     value="1.5"/>
+    <tempVariable ref="TempFeature.Boolean"  type="boolean"  value="true"/>
+    <tempVariable ref="TempFeature.Unused"   type="boolean"  value="false"/>
+    
+    <!-- Modify the temporary features -->
+    <ruleml xmlns="http://www.s60.com/xml/ruleml/1">
+        <rule>True configures TempFeature.String = TempFeature.String + " and more testing"</rule>
+        <rule>True configures TempFeature.Int = TempFeature.Int + 1</rule>
+        <rule>True configures TempFeature.Real = TempFeature.Real + 0.25</rule>
+    </ruleml>
+    
+    <!-- Print out the values to a text file -->
+    <templateml xmlns="http://www.s60.com/xml/templateml/1">
+    <output file="simple_tempvars_test.txt" dir="content" encoding="UTF-8">
+<template>
+TempFeature.String:  {{ feat_tree.TempFeature.String._value }}
+TempFeature.Int:     {{ feat_tree.TempFeature.Int._value }}
+TempFeature.Real:    {{ feat_tree.TempFeature.Real._value }}
+TempFeature.Boolean: {{ feat_tree.TempFeature.Boolean._value }}
+</template>
+    </output>
+    </templateml>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/custom/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Custom configuration layer">
+  <xi:include href="confml/custom.confml"/>
+  <xi:include href="confml/view.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/data/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+  <confml:data>
+    <confml:BasicSettingTypesTest>
+      <confml:IntSetting>555</confml:IntSetting>
+      <confml:StringSetting>カタカナ &lt;&amp;></confml:StringSetting>
+    </confml:BasicSettingTypesTest>
+    
+      <confml:SequenceSettingTest>
+        <confml:SequenceSetting extensionPolicy="replace">
+          <confml:FolderSubSetting><confml:localPath>seq/default_folder</confml:localPath></confml:FolderSubSetting>
+          <confml:RealSubSetting>10.10</confml:RealSubSetting>
+          <confml:FileSubSetting><confml:localPath>seq/default_file.txt</confml:localPath></confml:FileSubSetting>
+          <confml:IntSubSetting>120</confml:IntSubSetting>
+          <confml:StringSubSetting>&lt;&amp;カタカナ&gt;</confml:StringSubSetting>
+          <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+          <confml:SelectionSubSetting>2</confml:SelectionSubSetting>
+        </confml:SequenceSetting>
+      </confml:SequenceSettingTest>
+      
+      <confml:Feature1>
+      <confml:SequenceSetting extensionPolicy="append">
+        <confml:RealSubSetting>1.5</confml:RealSubSetting>
+        <confml:IntSubSetting>256</confml:IntSubSetting>
+        <confml:StringSubSetting>test</confml:StringSubSetting>
+        <confml:BooleanSubSetting>true</confml:BooleanSubSetting>
+        <confml:SelectionSubSetting>1</confml:SelectionSubSetting>
+      </confml:SequenceSetting>
+      </confml:Feature1>
+    
+    <confml:NameIdMappingTestSourceSequences>
+      <confml:StringSequence extensionPolicy="append">
+        <confml:Value>Entry 4 (new)</confml:Value>
+      </confml:StringSequence>
+      <confml:StringSequence>
+        <confml:Value>Entry 5 (new)</confml:Value>
+      </confml:StringSequence>
+        
+      <confml:StringToIntSequence extensionPolicy="append">
+        <confml:Name>Entry 4 (new)</confml:Name>
+        <confml:Value>140</confml:Value>
+      </confml:StringToIntSequence>
+      <confml:StringToIntSequence>
+        <confml:Name>Entry 5 (new)</confml:Name>
+        <confml:Value>150</confml:Value>
+      </confml:StringToIntSequence>
+         
+      <confml:StringToRealSequence extensionPolicy="append">
+        <confml:Name>Entry 4 (new)</confml:Name>
+        <confml:Value>1.4</confml:Value>
+      </confml:StringToRealSequence>
+      <confml:StringToRealSequence>
+        <confml:Name>Entry 5 (new)</confml:Name>
+        <confml:Value>1.5</confml:Value>
+      </confml:StringToRealSequence>
+    </confml:NameIdMappingTestSourceSequences>
+    
+    <confml:NameIdMappingTestTargetSettings>
+      <confml:Selection map="NameIdMappingTestSourceSequences/StringSequence[@key='Entry 4 (new)']"/>
+      <confml:Int map="NameIdMappingTestSourceSequences/StringToIntSequence[@key='Entry 4 (new)']"/>
+      <confml:Real map="NameIdMappingTestSourceSequences/StringToRealSequence[@key='Entry 4 (new)']"/>
+      
+      <confml:Sequence>
+        <confml:Selection map="NameIdMappingTestSourceSequences/StringSequence[@key='Entry 2']"/>
+        <confml:Int map="NameIdMappingTestSourceSequences/StringToIntSequence[@key='Entry 2']"/>
+        <confml:Real map="NameIdMappingTestSourceSequences/StringToRealSequence[@key='Entry 2']"/>
+      </confml:Sequence>
+      <confml:Sequence>
+        <confml:Selection map="NameIdMappingTestSourceSequences/StringSequence[@key='Entry 4 (new)']"/>
+        <confml:Int map="NameIdMappingTestSourceSequences/StringToIntSequence[@key='Entry 4 (new)']"/>
+        <confml:Real map="NameIdMappingTestSourceSequences/StringToRealSequence[@key='Entry 4 (new)']"/>
+      </confml:Sequence>
+      <confml:Sequence>
+        <confml:Selection map="NameIdMappingTestSourceSequences/StringSequence[@key='Entry 5 (new)']"/>
+        <confml:Int map="NameIdMappingTestSourceSequences/StringToIntSequence[@key='Entry 5 (new)']"/>
+        <confml:Real map="NameIdMappingTestSourceSequences/StringToRealSequence[@key='Entry 5 (new)']"/>
+      </confml:Sequence>
+    </confml:NameIdMappingTestTargetSettings>
+      
+    <confml:MultiSelectionTest>
+      <confml:MultiSelectionSetting>"opt 2" "opt 4" "opt 5"</confml:MultiSelectionSetting>
+    </confml:MultiSelectionTest>
+  </confml:data>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/data/content/file1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/data/content/file2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/data/content/file3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test3
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/data/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Data layer">
+  <xi:include href="confml/data.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/generation_test_project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="base/root.confml"/>
+  <xi:include href="custom/root.confml"/>
+  <xi:include href="data/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import __init__
+from testautomation import testcli
+
+if __name__ == '__main__':
+    testcli.run(__init__.collect_suite())
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/scripttest_common.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os
+
+ROOT_PATH = os.path.abspath(os.path.dirname(__file__))
+
+if sys.platform == "win32":
+    CONE_SCRIPT = "cone.cmd"
+else:
+    CONE_SCRIPT = "cone.sh"
+
+def get_cmd(action):
+    """Return the command used to run the ConE sub-action"""
+    if 'CONE_PATH' in os.environ:
+        CONE_CMD = os.path.join(os.environ['CONE_PATH'], CONE_SCRIPT)
+        if not os.path.exists(CONE_CMD):
+            raise RuntimeError("'%s' does not exist!" % CONE_CMD)
+        return '"%s" %s' % (CONE_CMD, action)
+    else:
+        return 'python "%s" %s' % (os.path.normpath(os.path.join(ROOT_PATH,'../cone_tool.py')), action)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/content/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/none.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<content xmlns="http://www.s60.com/xml/content/2">
+    <output dir="none.txt">
+        <input dir="test.txt"/>
+    </output>
+</content>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t1"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t1.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t2.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t1"/>
+    <tag name="target" value="t2"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t1_t2.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t2_t3.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t1"/>
+    <tag name="target" value="t2"/>
+    <tag name="target" value="t3"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2" >
+        <output dir="t1_t2_t3.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t1_t3.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t1"/>
+    <tag name="target" value="t3"/>
+        
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t1_t3.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t2.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t2"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t2.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t2_t3.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t2"/>
+    <tag name="target" value="t3"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t2_t3.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/implml/t3.content	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<container xmlns="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="t3"/>
+    
+    <content xmlns="http://www.s60.com/xml/content/2">
+        <output dir="t3.txt">
+            <input dir="test.txt"/>
+        </output>
+    </content>
+</container>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/layer/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/tag_filtering_test_project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="layer/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/template.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+{% for feat in rep_data.ref_noimpl %}{{ feat.ref }}
+{% endfor %}
\ No newline at end of file
Binary file configurationengine/source/scripts/tests/test_project.cpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/test_template/template2.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+{% for feat in rep_data.ref_noimpl %}{{ feat.ref }}
+{% endfor %}
\ No newline at end of file
Binary file configurationengine/source/scripts/tests/test_variant.cpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/api_template.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+{% set columns = {'fqr':'Full reference',
+                  'name':'Name',
+                  'type':'Type',
+                  'desc':'Description',
+                  } -%}
+
+Changed features:
+{% for item in columns|sort -%}{{ columns[item] }}|{%- endfor -%}
+{%- for item in columns|sort -%}{{ columns[item] }}|{%- endfor %}
+
+{% for fqr in data.sourcedata.features|sort -%}
+    {%- if fqr in data.targetdata.features and not data.sourcedata.features[fqr]._compare(data.targetdata.features[fqr], columns.keys()) -%}
+        {%- for colname in columns -%}
+            {{- data.sourcedata.features[fqr][colname] }}| 
+        {%- endfor -%}
+        {%- for colname in columns -%}
+            {{- data.targetdata.features[fqr][colname] }}| 
+        {%- endfor %}
+{% endif -%}
+{%- endfor %}
+
+Only in sourcedata:
+{% for fqr in data.sourcedata.features|sort -%}
+    {%- if fqr not in data.targetdata.features -%}
+        {%- for colname in columns -%}
+            {{ data.sourcedata.features[fqr][colname] }}| 
+        {%- endfor %}
+{% endif -%}
+{%- endfor %}
+
+Only in targetdata:
+{% for fqr in data.targetdata.features|sort -%}
+    {%- if fqr not in data.sourcedata.features -%}
+        {%- for colname in columns -%}
+            {{ data.targetdata.features[fqr][colname] }}| 
+        {%- endfor %}
+{% endif -%}
+{%- endfor %}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/data_template.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+Changed values:
+{% for fqr in data.sourcedata.features|sort -%}
+{%- if fqr in data.targetdata.features and data.sourcedata.features[fqr]['value'] != data.targetdata.features[fqr]['value'] -%}
+{{ data.sourcedata.features[fqr]['fqr'] }} | {{ data.sourcedata.features[fqr]['value'] }} | {{ data.targetdata.features[fqr]['value'] }}
+{% endif -%}
+{%- endfor -%}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p1r1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+Changed features:
+Description|Full reference|Name|Type|Description|Full reference|Name|Type|
+
+
+
+Only in sourcedata:
+
+
+Only in targetdata:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p1r4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,17 @@
+Changed features:
+Description|Full reference|Name|Type|Description|Full reference|Name|Type|
+
+
+
+Only in sourcedata:
+
+
+Only in targetdata:
+Layer4Feature|None|Layer 4 Feature|Feature with some setting types|
+Layer4Feature.BooleanSetting|boolean|Boolean setting|A boolean setting|
+Layer4Feature.IntSetting|int|Int setting|An int setting|
+Layer4Feature.RealSetting|real|Real setting|A real setting|
+Layer4Feature.SelectionSetting|selection|Selection setting|A selection setting|
+Layer4Feature.SequenceSetting|sequence|Sequence setting|A sequence setting|
+Layer4Feature.SequenceSetting.StringSubSetting|string|String sub-setting|A string sub-setting|
+Layer4Feature.StringSetting|string|String setting|A string setting|
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/api_p1r1_vs_p2r1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+Changed features:
+Description|Full reference|Name|Type|Description|Full reference|Name|Type|
+
+BasicSettingTypesTest.IntSetting|int|Int setting|An int setting|BasicSettingTypesTest.IntSetting|int|Int setting|An int setting (description changed)|
+BasicSettingTypesTest.RealSetting|real|Real setting|A real setting|BasicSettingTypesTest.RealSetting|real|Real setting (name changed)|A real setting|
+
+
+Only in sourcedata:
+BasicSettingTypesTest.BooleanSetting|boolean|Boolean setting|A boolean setting|
+
+
+Only in targetdata:
+BasicSettingTypesTest.BooleanSettingRefChanged|boolean|Boolean setting|A boolean setting|
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p1r1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Changed values:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p1r4.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+Changed values:
+BasicSettingTypesTest.BooleanSetting | True | False
+BasicSettingTypesTest.IntSetting | 10 | 444
+BasicSettingTypesTest.RealSetting | 3.14 | 3.14567
+BasicSettingTypesTest.SelectionSetting | 1 | 4
+BasicSettingTypesTest.StringSetting | default string | layer 4 string
+Feature2.SequenceSetting | [['1', 'default 1'], ['2', 'default 2']] | [['444', 'layer4 (1)'], ['444', 'layer4 (2)']]
+Feature2.SequenceSetting.IntSubSetting | ['1', '2'] | ['444', '444']
+Feature2.SequenceSetting.StringSubSetting | ['default 1', 'default 2'] | ['layer4 (1)', 'layer4 (2)']
+FileFolderTest.FileSetting.localPath | default_file.txt | layer2_file.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/compare/expected/data_p1r1_vs_p2r1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+Changed values:
+BasicSettingTypesTest.StringSetting | default string | value changed
Binary file configurationengine/source/scripts/tests/testdata/compare/project1.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/compare/project2.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/invocation_phase_test_common_ns.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/invocation_phase_test_contentml_ns.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/simple_tempvars_test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+
+TempFeature.String:  testing and more testing
+TempFeature.Int:     501
+TempFeature.Real:    1.75
+TempFeature.Boolean: True
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/temp_seq_test/invocation_phase_test_1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/temp_seq_test/invocation_phase_test_2.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 2
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/content/template_string_condition_true.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,3 @@
+
+TempFeature.String:  testing
+        
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/multiselection.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+Selected options: "opt 2", "opt 4", "opt 5", 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/name_id_mapping_test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+
+Selection: Entry 4 (new)
+Int: 140
+Real: 1.4
+Sequence.Selection: "Entry 2", "Entry 4 (new)", "Entry 5 (new)", 
+Sequence.Int: "120", "140", "150", 
+Sequence.Real: "1.2", "1.4", "1.5", 
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/sis/app1.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected/test_subdir/output_subdir_test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+test 1
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/generate/expected_report.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1698 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+    <title>ConE generation report</title>
+    <style type="text/css">
+        body {
+            font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+            font-size: 0.8em;
+            color: #0055B7;
+        }
+
+        .red{
+            color: Red;
+        }
+        
+        h1 {
+            padding: 30px 0 0 0;
+            margin: 0;
+            text-align: left;
+        }
+
+        #date {
+            text-align: center;
+        }
+
+        hr {
+            height: 1px;
+            background-color: cccccc;
+            color: #cccccc;
+        }
+
+        h2 h3 {
+            padding: 10px 0 10px 0;
+            margin: 0;
+        }
+
+        table.report {
+            width: 100%;
+            border: 1px solid #e0dfe3;
+            border-collapse: collapse;
+            color: #333333;
+        }
+
+        table.report th {
+            text-align: left;
+            padding: 5px;
+            background-color: #f9fafd;
+            color: #595a5f;
+            border-bottom: 1px #999999 solid;
+        }
+
+        table.report th.featureName {
+            background-color: #f2f2f3;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 1.1em;
+            border-top: 3px #9d9da1;
+            border-top-style: double;
+            border-bottom: 3px #9d9da1;
+            border-bottom-style: double;
+        }
+
+        table.report th.header {
+            background-color: #f9fafd;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 0.8em;
+            border-top: 1px #9d9da1;
+            border-bottom: 1px #9d9da1;
+        }
+
+        table.report td {
+            word-wrap: break-word;
+            border: 1px #EBEBEB;
+            padding: 5px;
+            border-style: solid; 
+            vertical-align: top;
+            font: Tahoma, Verdana, Arial;
+            _font-size: 0.8em;
+        }
+
+        table.summary {
+            border: 1px solid #e0dfe3;
+            border-collapse: collapse;
+            color: #333333;
+        }
+
+        table.summary th {
+            text-align: left;
+            padding: 5px;
+            background-color: #f9fafd;
+            color: #595a5f;
+            border-bottom: 1px #999999 solid;
+        }
+
+        table.summary th.featureName {
+            background-color: #f2f2f3;
+            font: #595a5f Tahoma, Verdana, Arial bold;
+            font-size: 1.1em;
+            border-top: 3px #9d9da1;
+            border-top-style: double;
+            border-bottom: 3px #9d9da1;
+            border-bottom-style: double;
+        }
+
+        table.summary td {
+            word-wrap: break-word;
+            border: 1px #EBEBEB;
+            padding: 5px;
+            border-style: solid; 
+            vertical-align: top;
+            font: Tahoma, Verdana, Arial;
+            _font-size: 0.8em;
+        }
+
+        .currentValue {
+            background-color: #e8f2fe;
+        }
+    </style>
+</head>
+<body>
+
+    <h1>Generation summary:</h1>
+    <table class="summary">
+     <tr>
+        <th class="featureName" colspan="2">Statistics</th>
+     </tr>
+     <tr>
+        <td>Refs in files</td>
+        <td>12</td>
+    </tr>
+    <tr>
+        <td>Refs with no implementation</td>
+        <td>13</td>
+    </tr>
+    <tr>
+        <th class="featureName" colspan="2">Details</th>
+     </tr>
+    <tr>
+        <td>Report generated</td>
+        <td>30.09.2009 15:42:50</td>
+    </tr>
+    <tr>
+        <td>Generation duration</td>
+        <td>0.547</td>
+    </tr>
+    <tr>
+        <td>Generation log</td>
+        <td><a href="file:///this_is_ignored/cone.log">cone.log</a></td>
+    </tr>
+    <tr>
+        <th class="featureName" colspan="2">Generation options</th>
+    </tr>
+    <tr>
+        <td align="left">Layers</td>
+        <td align="left">[-1]</td>
+    </tr>
+    <tr>
+        <td align="left">Added</td>
+        <td align="left">None</td>
+    </tr>
+    <tr>
+        <td align="left">Dryrun</td>
+        <td align="left">False</td>
+    </tr>
+    <tr>
+        <td align="left">Verbose</td>
+        <td align="left">3</td>
+    </tr>
+    <tr>
+        <td align="left">Overrides</td>
+        <td align="left">None</td>
+    </tr>
+    <tr>
+        <td align="left">Project</td>
+        <td align="left">this_is_ignored\generation_test_project</td>
+    </tr>
+        <tr>
+        <td align="left">Report</td>
+        <td align="left">report.html</td>
+    </tr>
+    <tr>
+        <td align="left">Impls</td>
+        <td align="left">None</td>
+    </tr>
+    <tr>
+        <td align="left">Output</td>
+        <td align="left">output</td>
+    </tr>
+    <tr>
+        <td align="left">Configuration</td>
+        <td align="left">root.confml</td>
+    </tr>
+    <tr>
+        <td align="left">Working directory</td>
+        <td align="left">this_is_ignored\source\scripts\tests\temp\gen_ll3</td>
+    </tr>
+    </table>
+    
+    <h1>Rule execution results:</h1><br>
+    
+    <table class="report">
+        <tr>
+            <th class="featureName">File</th>
+            <th class="featureName">Rule No.</th>
+            <th class="featureName">Input refs</th>
+            <th class="featureName">Affected refs</th>
+        </tr>
+        
+        
+        <tr>
+            <a name="rule:custom/implml/missing_file_in_report_test.implml:1"/>
+            <td><a href="file:///this_is_ignored/custom/implml/missing_file_in_report_test.implml">custom/implml/missing_file_in_report_test.implml</a></td>
+            <td>1</td>
+            <td>
+            </td>
+            <td>TempFeatureMissingFile.Test1<br/>
+            
+            </td>
+        </tr>
+        
+        <tr>
+            <a name="rule:custom/implml/missing_file_in_report_test.implml:2"/>
+            <td><a href="file:///this_is_ignored/custom/implml/missing_file_in_report_test.implml">custom/implml/missing_file_in_report_test.implml</a></td>
+            <td>2</td>
+            <td>
+            </td>
+            <td>TempFeatureMissingFile.Test2<br/>
+            
+            </td>
+        </tr>
+        
+        <tr>
+            <a name="rule:custom/implml/seq_tempvar.implml:1"/>
+            <td><a href="file:///this_is_ignored/custom/implml/seq_tempvar.implml">custom/implml/seq_tempvar.implml</a></td>
+            <td>1</td>
+            <td>
+            </td>
+            <td>TempFeature2.FilesToCopy<br/>
+            
+            </td>
+        </tr>
+        
+        <tr>
+            <a name="rule:custom/implml/simple_tempvars.implml:1"/>
+            <td><a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom/implml/simple_tempvars.implml</a></td>
+            <td>1</td>
+            <td>
+            </td>
+            <td>TempFeature.String<br/>
+            
+            </td>
+        </tr>
+        
+        <tr>
+            <a name="rule:custom/implml/simple_tempvars.implml:2"/>
+            <td><a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom/implml/simple_tempvars.implml</a></td>
+            <td>2</td>
+            <td>
+            </td>
+            <td>TempFeature.Int<br/>
+            
+            </td>
+        </tr>
+        
+        <tr>
+            <a name="rule:custom/implml/simple_tempvars.implml:3"/>
+            <td><a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom/implml/simple_tempvars.implml</a></td>
+            <td>3</td>
+            <td>
+            </td>
+            <td>TempFeature.Real<br/>
+            
+            </td>
+        </tr>
+        
+        
+    </table>
+    
+    
+    <h1>Output files:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">API</th>
+        <th class="featureName">Data</th>
+        <th class="featureName">Impl. file</th>
+        <th class="featureName">Impl. type</th>
+        <th class="featureName">Generated for</th>
+        <th class="featureName">Output files</th>
+    </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b>MultiSelectionTest.MultiSelectionSetting</b><br>
+                <b>Name: </b>Multi-selection setting<br>
+                <b>Type: </b>multiSelection<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/multiselection.confml">base\confml\multiselection.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/multiselection.confml">base\confml\multiselection.confml</a></td>
+                        <td>&#34;opt 1&#34; &#34;opt 3&#34;</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>&#34;opt 2&#34; &#34;opt 4&#34; &#34;opt 5&#34;</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/base/implml/multiselection.templateml">base\implml\multiselection.templateml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/multiselection.txt">output\multiselection.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b>NameIdMappingTestTargetSettings.Int</b><br>
+                <b>Name: </b>Int setting<br>
+                <b>Type: </b>int<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a></td>
+                        <td>0</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>140</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/base/implml/name_id_mapping_test.templateml">base\implml\name_id_mapping_test.templateml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/name_id_mapping_test.txt">output\name_id_mapping_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b>NameIdMappingTestTargetSettings.Real</b><br>
+                <b>Name: </b>Real setting<br>
+                <b>Type: </b>real<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a></td>
+                        <td>0</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>1.4</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/base/implml/name_id_mapping_test.templateml">base\implml\name_id_mapping_test.templateml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/name_id_mapping_test.txt">output\name_id_mapping_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b>NameIdMappingTestTargetSettings.Selection</b><br>
+                <b>Name: </b>Selection setting<br>
+                <b>Type: </b>selection<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a></td>
+                        <td>None</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>Entry 4 (new)</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/base/implml/name_id_mapping_test.templateml">base\implml\name_id_mapping_test.templateml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/name_id_mapping_test.txt">output\name_id_mapping_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b>NameIdMappingTestTargetSettings.Sequence</b><br>
+                <b>Name: </b>Sequence<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+            </table>
+
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>
+                                
+                                    Entry 2<br>
+                                
+                                    Entry 4 (new)<br>
+                                
+                                    Entry 5 (new)<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>
+                                
+                                    120<br>
+                                
+                                    140<br>
+                                
+                                    150<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>
+                                
+                                    1.2<br>
+                                
+                                    1.4<br>
+                                
+                                    1.5<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/base/implml/name_id_mapping_test.templateml">base\implml\name_id_mapping_test.templateml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/name_id_mapping_test.txt">output\name_id_mapping_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeature.Boolean</i></b><br>
+                <b>Name: </b>Boolean<br>
+                <b>Type: </b>boolean<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a></td>
+                        <td>true</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom\implml\simple_tempvars.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/content/simple_tempvars_test.txt">output\content\simple_tempvars_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeature.Int</i></b><br>
+                <b>Name: </b>Int<br>
+                <b>Type: </b>int<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a></td>
+                        <td>501</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom\implml\simple_tempvars.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/content/simple_tempvars_test.txt">output\content\simple_tempvars_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeature.Real</i></b><br>
+                <b>Name: </b>Real<br>
+                <b>Type: </b>real<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a></td>
+                        <td>1.75</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom\implml\simple_tempvars.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored/content/simple_tempvars_test.txt">output\content\simple_tempvars_test.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=3>
+                <b><i>TempFeature.String</i></b><br>
+                <b>Name: </b>String<br>
+                <b>Type: </b>string<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=3>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a></td>
+                        <td>testing and more testing</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/\conditional_container.implml">custom\implml\conditional_container.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="ignored">output\content\template_string_condition_true.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+                
+                    <tr>
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/conditional_container.implml">custom\implml\conditional_container.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                            
+                                <span class="red">output\content\template_string_condition_false.txt</span><br>
+                            
+                        
+                    </td>
+                    </tr>
+                
+                
+            
+                
+                    <tr>
+                    <td align="left">
+                        <a href="file:///this_is_ignored/custom/implml/simple_tempvars.implml">custom\implml\simple_tempvars.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                            
+                                <a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/temp/gen_ll3/output/content/simple_tempvars_test.txt">output\content\simple_tempvars_test.txt</a><br>
+                            
+                        
+                    </td>
+                    </tr>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeature2.FilesToCopy</i></b><br>
+                <b>Name: </b>FilesToCopy<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+            </table>
+
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>FilePath</b></td>
+                            <td>
+                                
+                                    invocation_phase_test_1.txt<br>
+                                
+                                    invocation_phase_test_2.txt<br>
+                                
+                                    overlay/overlay_folder/overlay.txt<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///C|/Users/NoBackup/wc/cone-trunk/source/scripts/tests/generation_test_project/custom/implml/seq_tempvar.implml">custom\implml\seq_tempvar.implml</a>
+                    </td>
+                    <td align="left">
+                        content
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <a href="file:///this_is_ignored">output\content\temp_seq_test\invocation_phase_test_2.txt</a><br>
+                            
+                                <a href="file:///this_is_ignored">output\content\temp_seq_test\invocation_phase_test_1.txt</a><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeatureMissingFile.Test1</i></b><br>
+                <b>Name: </b>Test1<br>
+                <b>Type: </b>string<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored">autodata.confml</a></td>
+                        <td>None</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored">custom\implml\missing_file_in_report_test.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <span class="red">output\content\missing_output_file_test1.txt</span><br>
+                            
+                                <span class="red">output\content\missing_output_file_test2.txt</span><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+    
+    
+        <tr>
+            <td align="left" rowspan=1>
+                <b><i>TempFeatureMissingFile.Test2</i></b><br>
+                <b>Name: </b>Test2<br>
+                <b>Type: </b>string<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored">autodata.confml</a>
+            </td>
+            <td align="left" rowspan=1>
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored">autodata.confml</a></td>
+                        <td>None</td>
+                    </tr>
+                
+            
+            </table>
+
+            <table class="report">
+                
+            </table>
+            
+            
+                
+                    <td align="left">
+                        <a href="file:///this_is_ignored">custom\implml\missing_file_in_report_test.implml</a>
+                    </td>
+                    <td align="left">
+                        templateml
+                    </td>
+                    <td align="left">
+                        
+                    </td>
+                    <td align="left">
+                        
+                                <span class="red">output\content\missing_output_file_test1.txt</span><br>
+                            
+                                <span class="red">output\content\missing_output_file_test2.txt</span><br>
+                            
+                    </td>
+                
+                
+            
+        </tr>
+        
+    </table>
+
+    <h1>Refs with no implementation:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">API</th>
+        <th class="featureName">Data</th>
+    </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>BasicSettingTypesTest.IntSetting</b><br>
+                <b>Name: </b>Int setting<br>
+                <b>Type: </b>int<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/basic_setting_types_test.confml">base\confml\basic_setting_types_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/basic_setting_types_test.confml">base\confml\basic_setting_types_test.confml</a></td>
+                        <td>10</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>555</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>BasicSettingTypesTest.StringSetting</b><br>
+                <b>Name: </b>String setting<br>
+                <b>Type: </b>string<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/basic_setting_types_test.confml">base\confml\basic_setting_types_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/base/confml/basic_setting_types_test.confml">base\confml\basic_setting_types_test.confml</a></td>
+                        <td>default string</td>
+                    </tr>
+                
+            
+                
+                    <tr>
+                        <td><a href="file:///this_is_ignored/data/confml/data.confml">data\confml\data.confml</a></td>
+                        <td>&#12459;&#12479;&#12459;&#12490; &lt;&amp;&gt;</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>Condition.Boolean</i></b><br>
+                <b>Name: </b>Boolean<br>
+                <b>Type: </b>boolean<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a></td>
+                        <td>true</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>Condition.Int</i></b><br>
+                <b>Name: </b>Int<br>
+                <b>Type: </b>int<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a></td>
+                        <td>500</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>Condition.Real</i></b><br>
+                <b>Name: </b>Real<br>
+                <b>Type: </b>real<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a></td>
+                        <td>1.5</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>Condition.String</i></b><br>
+                <b>Name: </b>String<br>
+                <b>Type: </b>string<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a></td>
+                        <td>testing</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>Condition.Unused</i></b><br>
+                <b>Name: </b>Unused<br>
+                <b>Type: </b>boolean<br>
+                <b>ConfML: </b><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///C|/Users/NoBackup/wc/cone-trunk-temp/source/scripts/tests/generation_test_project/autodata.confml">autodata.confml</a></td>
+                        <td>false</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>Feature1.SequenceSetting</b><br>
+                <b>Name: </b>Sequence setting<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/feature1.confml">base\confml\feature1.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+            </table>
+            
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>
+                                
+                                    1.25<br>
+                                
+                                    1.5<br>
+                                
+                                    1.5<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>
+                                
+                                    128<br>
+                                
+                                    256<br>
+                                
+                                    256<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>
+                                
+                                    def1<br>
+                                
+                                    def2<br>
+                                
+                                    test<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>
+                                
+                                    false<br>
+                                
+                                    false<br>
+                                
+                                    true<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>
+                                
+                                    1<br>
+                                
+                                    1<br>
+                                
+                                    1<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>NameIdMappingTestSourceSequences.StringSequence</b><br>
+                <b>Name: </b>String sequence<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+            </table>
+            
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Value sub-setting</b></td>
+                            <td>
+                                
+                                    Entry 1<br>
+                                
+                                    Entry 2<br>
+                                
+                                    Entry 3<br>
+                                
+                                    Entry 4 (new)<br>
+                                
+                                    Entry 5 (new)<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>NameIdMappingTestSourceSequences.StringToIntSequence</b><br>
+                <b>Name: </b>String-to-int sequence<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+            </table>
+            
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Name sub-setting</b></td>
+                            <td>
+                                
+                                    Entry 1<br>
+                                
+                                    Entry 2<br>
+                                
+                                    Entry 3<br>
+                                
+                                    Entry 4 (new)<br>
+                                
+                                    Entry 5 (new)<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Value sub-setting</b></td>
+                            <td>
+                                
+                                    100<br>
+                                
+                                    120<br>
+                                
+                                    130<br>
+                                
+                                    140<br>
+                                
+                                    150<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>NameIdMappingTestSourceSequences.StringToRealSequence</b><br>
+                <b>Name: </b>String-to-real sequence<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/name_id_mapping_test.confml">base\confml\name_id_mapping_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+            </table>
+            
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Name sub-setting</b></td>
+                            <td>
+                                
+                                    Entry 1<br>
+                                
+                                    Entry 2<br>
+                                
+                                    Entry 3<br>
+                                
+                                    Entry 4 (new)<br>
+                                
+                                    Entry 5 (new)<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Value sub-setting</b></td>
+                            <td>
+                                
+                                    1.1<br>
+                                
+                                    1.2<br>
+                                
+                                    1.3<br>
+                                
+                                    1.4<br>
+                                
+                                    1.5<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b>SequenceSettingTest.SequenceSetting</b><br>
+                <b>Name: </b>Sequence setting<br>
+                <b>Type: </b>sequence<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/base/confml/sequence_setting_test.confml">base\confml\sequence_setting_test.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+            </table>
+            
+            <table class="report">
+                
+                    
+                        <tr>
+                            <th class="th.header">Setting</th>
+                            <th class="th.header">Value</th>
+                        </tr>
+                        <tr>
+                            <td><b>Folder sub-setting</b></td>
+                            <td>
+                                
+                                    [&#39;seq/default_folder&#39;, None]<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>localPath</b></td>
+                            <td>
+                                
+                                    seq/default_folder<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>targetPath</b></td>
+                            <td>
+                                
+                                    None<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>
+                                
+                                    10.10<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>File sub-setting</b></td>
+                            <td>
+                                
+                                    [&#39;seq/default_file.txt&#39;, None]<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>localPath</b></td>
+                            <td>
+                                
+                                    seq/default_file.txt<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>targetPath</b></td>
+                            <td>
+                                
+                                    None<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>
+                                
+                                    120<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>
+                                
+                                    &lt;&amp;&#12459;&#12479;&#12459;&#12490;&gt;<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>
+                                
+                                    true<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+                    
+                        <tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>
+                                
+                                    2<br>
+                                
+                            </td>
+                        </tr>
+                    
+                
+            </table>
+        </tr>
+    
+        <tr>
+            <td align="left" >
+                <b><i>TempFeature.Unused</i></b><br>
+                <b>Name: </b>Unused<br>
+                <b>Type: </b>boolean<br>
+                <b>ConfML: </b><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a>
+            </td>
+            <td align="left">
+            <table class="report">
+            
+            
+                
+                    <tr>
+                        <th class="th.header">Layer</th>
+                        <th class="th.header">Value</th>
+                    </tr>
+                    <tr>
+                        <td><a href="file:///this_is_ignored/autodata.confml">autodata.confml</a></td>
+                        <td>false</td>
+                    </tr>
+                
+            
+            </table>
+            
+            <table class="report">
+                
+            </table>
+        </tr>
+        
+    </table>
+    <h1>Not generated output files:</h1><br>
+    
+    <table class="report">
+    <tr>
+        <th class="featureName">Output file</th>
+    </tr>
+    
+        <tr>
+            <td align="left" >
+                output\content\template_string_condition_false.txt
+            </td>
+    
+        <tr>
+            <td align="left" >
+                output\content\missing_output_file_test1.txt
+            </td>
+    
+        <tr>
+            <td align="left" >
+                output\content\missing_output_file_test2.txt
+            </td>
+    
+    </table>
+    
+</body>
+</html>
\ No newline at end of file
Binary file configurationengine/source/scripts/tests/testdata/generate/test_project_invalid_data_refs.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/custom_value_report_template.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,32 @@
+{% extends "cone_base.html" %}
+{% block title %}Data value info{% endblock %}
+{% block content %}
+    <h1>Configuration data value info (custom template)</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Ref</th>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        {% for config in data.value_data.configs %}
+        <th class="featureName">{{ config.path }}</th>
+        {% endfor %}
+    </tr>
+    {% for feature_group in data.value_data.feature_groups %}
+    <tr><th colspan="{{ data.value_data.configs | length + 3 }}">{{ feature_group.name }}</th></tr>
+    {% for feature in feature_group.features %}
+    {% if feature.modified %}<tr bgcolor="#CCCCFF">{% else %}<tr>{% endif %}
+        <td>{{ feature.ref }}</td>
+        <td>{{ feature.name }}</td>
+        <td>{{ feature.type }}</td>
+        
+        {% for config in data.value_data.configs %}
+        <td>{{ config.values[feature.ref] }}</td>
+        {% endfor %}
+        
+    </tr>
+    {% endfor -%}
+    {% endfor %}
+    
+    </table>
+{% endblock %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/api_report.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,859 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>API info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration API info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">File</th>
+        
+        <th class="featureName">Full reference</th>
+        
+        <th class="featureName">Type</th>
+        
+        <th class="featureName">Name</th>
+        
+        <th class="featureName">Description</th>
+        
+    </tr>
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml">this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml</a></td>
+        
+        <td>BasicSettingTypesTest.BooleanSetting</td>
+        
+        <td>boolean</td>
+        
+        <td>Boolean setting</td>
+        
+        <td>A boolean setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml">this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml</a></td>
+        
+        <td>BasicSettingTypesTest.IntSetting</td>
+        
+        <td>int</td>
+        
+        <td>Int setting</td>
+        
+        <td>An int setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml">this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml</a></td>
+        
+        <td>BasicSettingTypesTest.RealSetting</td>
+        
+        <td>real</td>
+        
+        <td>Real setting</td>
+        
+        <td>A real setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml">this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml</a></td>
+        
+        <td>BasicSettingTypesTest.SelectionSetting</td>
+        
+        <td>selection</td>
+        
+        <td>Selection setting</td>
+        
+        <td>A selection setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml">this-line-is-ignored/Layer1/confml/basic_setting_types_test.confml</a></td>
+        
+        <td>BasicSettingTypesTest.StringSetting</td>
+        
+        <td>string</td>
+        
+        <td>String setting</td>
+        
+        <td>A string setting</td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit0</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 0</td>
+        
+        <td>A boolean setting for bit 0</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit1</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 1</td>
+        
+        <td>A boolean setting for bit 1</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit2</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 2</td>
+        
+        <td>A boolean setting for bit 2</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit3</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 3</td>
+        
+        <td>A boolean setting for bit 3</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit4</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 4</td>
+        
+        <td>A boolean setting for bit 4</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/bitmask_test.confml">this-line-is-ignored/Layer1/confml/bitmask_test.confml</a></td>
+        
+        <td>BitmaskTest.Bit5</td>
+        
+        <td>boolean</td>
+        
+        <td>Bit 5</td>
+        
+        <td>A boolean setting for bit 5</td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.BooleanSetting</td>
+        
+        <td>boolean</td>
+        
+        <td>Boolean setting</td>
+        
+        <td>A boolean setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.IntSetting</td>
+        
+        <td>int</td>
+        
+        <td>Int setting</td>
+        
+        <td>An int setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.RealSetting</td>
+        
+        <td>real</td>
+        
+        <td>Real setting</td>
+        
+        <td>A real setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SelectionSetting</td>
+        
+        <td>selection</td>
+        
+        <td>Selection setting</td>
+        
+        <td>A selection setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting</td>
+        
+        <td>sequence</td>
+        
+        <td>Sequence setting</td>
+        
+        <td>A sequence setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting.BooleanSubSetting</td>
+        
+        <td>boolean</td>
+        
+        <td>Boolean sub-setting</td>
+        
+        <td>A boolean sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting.IntSubSetting</td>
+        
+        <td>int</td>
+        
+        <td>Int sub-setting</td>
+        
+        <td>An int sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting.RealSubSetting</td>
+        
+        <td>real</td>
+        
+        <td>Real sub-setting</td>
+        
+        <td>A real sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting.SelectionSubSetting</td>
+        
+        <td>selection</td>
+        
+        <td>Selection sub-setting</td>
+        
+        <td>A selection sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.SequenceSetting.StringSubSetting</td>
+        
+        <td>string</td>
+        
+        <td>String sub-setting</td>
+        
+        <td>A string sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature1.confml">this-line-is-ignored/Layer1/confml/feature1.confml</a></td>
+        
+        <td>Feature1.StringSetting</td>
+        
+        <td>string</td>
+        
+        <td>String setting</td>
+        
+        <td>A string setting</td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature2.confml">this-line-is-ignored/Layer1/confml/feature2.confml</a></td>
+        
+        <td>Feature2.SequenceSetting</td>
+        
+        <td>sequence</td>
+        
+        <td>Sequence setting</td>
+        
+        <td>A simple sequence setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature2.confml">this-line-is-ignored/Layer1/confml/feature2.confml</a></td>
+        
+        <td>Feature2.SequenceSetting.IntSubSetting</td>
+        
+        <td>int</td>
+        
+        <td>Int sub-setting</td>
+        
+        <td>An int sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/feature2.confml">this-line-is-ignored/Layer1/confml/feature2.confml</a></td>
+        
+        <td>Feature2.SequenceSetting.StringSubSetting</td>
+        
+        <td>string</td>
+        
+        <td>String sub-setting</td>
+        
+        <td>A string sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FileSetting</td>
+        
+        <td>file</td>
+        
+        <td>File setting</td>
+        
+        <td>A file setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FileSetting.localPath</td>
+        
+        <td>string</td>
+        
+        <td>localPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FileSetting.targetPath</td>
+        
+        <td>string</td>
+        
+        <td>targetPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FolderSetting</td>
+        
+        <td>folder</td>
+        
+        <td>Folder setting</td>
+        
+        <td>A folder setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FolderSetting.localPath</td>
+        
+        <td>string</td>
+        
+        <td>localPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/file_folder_test.confml">this-line-is-ignored/Layer1/confml/file_folder_test.confml</a></td>
+        
+        <td>FileFolderTest.FolderSetting.targetPath</td>
+        
+        <td>string</td>
+        
+        <td>targetPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting</td>
+        
+        <td>sequence</td>
+        
+        <td>Sequence setting</td>
+        
+        <td>A sequence setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.BooleanSubSetting</td>
+        
+        <td>boolean</td>
+        
+        <td>Boolean sub-setting</td>
+        
+        <td>A boolean sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FileSubSetting</td>
+        
+        <td>file</td>
+        
+        <td>File sub-setting</td>
+        
+        <td>A file sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FileSubSetting.localPath</td>
+        
+        <td>string</td>
+        
+        <td>localPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FileSubSetting.targetPath</td>
+        
+        <td>string</td>
+        
+        <td>targetPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FolderSubSetting</td>
+        
+        <td>folder</td>
+        
+        <td>Folder sub-setting</td>
+        
+        <td>A folder sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FolderSubSetting.localPath</td>
+        
+        <td>string</td>
+        
+        <td>localPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.FolderSubSetting.targetPath</td>
+        
+        <td>string</td>
+        
+        <td>targetPath</td>
+        
+        <td></td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.IntSubSetting</td>
+        
+        <td>int</td>
+        
+        <td>Int sub-setting</td>
+        
+        <td>An int sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.RealSubSetting</td>
+        
+        <td>real</td>
+        
+        <td>Real sub-setting</td>
+        
+        <td>A real sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.SelectionSubSetting</td>
+        
+        <td>selection</td>
+        
+        <td>Selection sub-setting</td>
+        
+        <td>A selection sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this-line-is-ignored/Layer1/confml/sequence_setting_test.confml">this-line-is-ignored/Layer1/confml/sequence_setting_test.confml</a></td>
+        
+        <td>SequenceSettingTest.SequenceSetting.StringSubSetting</td>
+        
+        <td>string</td>
+        
+        <td>String sub-setting</td>
+        
+        <td>A string sub-setting</td>
+        
+    </tr>
+    
+    
+    
+    
+    
+    <tr>
+        <td><a href="file://this_is_ignored">this_is_ignored</a></td>
+        
+        <td>TimeTypesTest.DateSetting</td>
+        
+        <td>date</td>
+        
+        <td>Date setting</td>
+        
+        <td>A date setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this_is_ignored">this_is_ignored</a></td>
+        
+        <td>TimeTypesTest.DateTimeSetting</td>
+        
+        <td>dateTime</td>
+        
+        <td>Date-time setting</td>
+        
+        <td>A date-time setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this_is_ignored">this_is_ignored</a></td>
+        
+        <td>TimeTypesTest.DurationSetting</td>
+        
+        <td>duration</td>
+        
+        <td>Duration setting</td>
+        
+        <td>A duration setting</td>
+        
+    </tr>
+    
+    
+    
+    <tr>
+        <td><a href="file://this_is_ignored">this_is_ignored</a></td>
+        
+        <td>TimeTypesTest.TimeSetting</td>
+        
+        <td>time</td>
+        
+        <td>Time setting</td>
+        
+        <td>A time setting</td>
+        
+    </tr>
+    
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/content_report.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,177 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Content info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration content files</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Content file</th>
+		<th class="featureName">Actual files (used one last)</th>
+    </tr>
+    
+    <tr>
+        <td>default_file.txt</td>
+		<td>Layer1/content/default_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>layer2_file.txt</td>
+		<td>Layer2/content/layer2_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>override_test.txt</td>
+		<td>Layer1/content/override_test.txt<br/>Layer3/content/override_test.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/def1_file.txt</td>
+		<td>Layer1/content/seq/def1_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/def2_file.txt</td>
+		<td>Layer1/content/seq/def2_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/layer2_file.txt</td>
+		<td>Layer2/content/seq/layer2_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/layer2_file2.txt</td>
+		<td>Layer2/content/seq/layer2_file2.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/layer3_file.txt</td>
+		<td>Layer3/content/seq/layer3_file.txt<br/></td>
+    </tr>
+    
+    <tr>
+        <td>seq/layer4_file.txt</td>
+		<td>Layer4/content/seq/layer4_file.txt<br/></td>
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/impl_report.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,190 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Implementation info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Implementations</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">File</th>
+		<th class="featureName">Index</th>
+		<th class="featureName">Type</th>
+		<th class="featureName">Phase</th>
+		<th class="featureName">Tags</th>
+		<th class="featureName">Refs</th>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/bitmask_test.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>BitmaskTest.Bit0<br/>BitmaskTest.Bit1<br/>BitmaskTest.Bit2<br/>BitmaskTest.Bit3<br/>BitmaskTest.Bit4<br/>BitmaskTest.Bit5<br/></td>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/feature1_1.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>Feature1.IntSetting<br/></td>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/feature1_2.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>Feature1.StringSetting<br/></td>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/feature1_sequence.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>Feature1.SequenceSetting<br/></td>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/feature2.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>Feature2.SequenceSetting<br/></td>
+    </tr>
+    
+    <tr>
+        <td>Layer1/implml/time_types_test.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>TimeTypesTest.DateSetting<br/>TimeTypesTest.TimeSetting<br/>TimeTypesTest.DateTimeSetting<br/>TimeTypesTest.DurationSetting<br/></td>
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/impl_report_with_containers.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,307 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Implementation info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Implementations</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">File</th>
+		<th class="featureName">Index</th>
+		<th class="featureName">Type</th>
+		<th class="featureName">Phase</th>
+		<th class="featureName">Tags</th>
+		<th class="featureName">Refs</th>
+    </tr>
+    
+    <tr>
+        <td>base/implml/multiselection.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>MultiSelectionTest.MultiSelectionSetting<br/></td>
+    </tr>
+    
+    <tr>
+        <td>base/implml/name_id_mapping_test.templateml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>NameIdMappingTestTargetSettings.Selection<br/>NameIdMappingTestTargetSettings.Int<br/>NameIdMappingTestTargetSettings.Real<br/>NameIdMappingTestTargetSettings.Sequence.Selection<br/>NameIdMappingTestTargetSettings.Sequence.Int<br/>NameIdMappingTestTargetSettings.Sequence.Real<br/></td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/conditional_container.implml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>TempFeature.String<br/></td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/conditional_container.implml</td>
+		<td>1</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>TempFeature.String<br/></td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/conditional_container.implml</td>
+		<td>2</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/conditional_container.implml</td>
+		<td>3</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/invocation_phase_test.implml</td>
+		<td>0</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/invocation_phase_test.implml</td>
+		<td>1</td>
+		<td>content</td>
+		<td>post</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/invocation_phase_test.implml</td>
+		<td>2</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/invocation_phase_test.implml</td>
+		<td>3</td>
+		<td>content</td>
+		<td>post</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/missing_file_in_report_test.implml</td>
+		<td>0</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>TempFeatureMissingFile.Test1<br/>TempFeatureMissingFile.Test2<br/></td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/missing_file_in_report_test.implml</td>
+		<td>1</td>
+		<td>ruleml</td>
+		<td>post</td>
+		<td></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/output_override_test.implml</td>
+		<td>0</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/output_override_test.implml</td>
+		<td>1</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/output_override_test.implml</td>
+		<td>2</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/seq_tempvar.implml</td>
+		<td>0</td>
+		<td>ruleml</td>
+		<td>pre</td>
+		<td></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/seq_tempvar.implml</td>
+		<td>1</td>
+		<td>content</td>
+		<td>normal</td>
+		<td>target = ['rofs3']<br/></td>
+		<td>TempFeature2.FilesToCopy.FilePath<br/></td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/simple_tempvars.implml</td>
+		<td>0</td>
+		<td>ruleml</td>
+		<td>pre</td>
+		<td></td>
+		<td>None</td>
+    </tr>
+    
+    <tr>
+        <td>custom/implml/simple_tempvars.implml</td>
+		<td>1</td>
+		<td>templateml</td>
+		<td>normal</td>
+		<td></td>
+		<td>TempFeature.String<br/>TempFeature.Int<br/>TempFeature.Real<br/>TempFeature.Boolean<br/></td>
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,27 @@
+Name,Type,Possible values,product_langpack_01_root.confml,product_langpack_02_root.confml,product_langpack_03_root.confml,
+
+All settings
+Real setting,real,"",3.14,3.14,3.14,
+Int setting,int,"",10,10,10,
+String setting,string,"",string from product (langpack 01) config,string from product (langpack 02) config,string from product (langpack 03) config,
+Boolean setting,boolean,"",True,True,True,
+Selection setting,selection,"Option0
+Option1
+Option2
+Option3
+Option4
+",Option1,Option1,Option1,
+Sequence setting,sequence,"",<sequence data>,<sequence data>,<sequence data>,
+Sequence setting,sequence,"",<sequence data>,<sequence data>,<sequence data>,
+Real setting,real,"",10.5,10.5,10.5,
+Int setting,int,"",1001,1002,1003,
+String setting,string,"",langpack 01 string,langpack 02 string,langpack 03 string,
+Boolean setting,boolean,"",True,True,True,
+Selection setting,selection,"Option0
+Option1
+Option2
+Option3
+Option4
+",Option1,Option1,Option1,
+Sequence setting,sequence,"",<sequence data>,<sequence data>,<sequence data>,
+Sequence setting,sequence,"",<sequence data>,<sequence data>,<sequence data>,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_custom.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,292 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Data value info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration data value info (custom template)</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Ref</th>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        
+        <th class="featureName">product_root.confml</th>
+        
+    </tr>
+    
+    <tr><th colspan="4">All settings</th></tr>
+    
+    <tr>
+        <td>Asset1Feature1.RealSetting</td>
+        <td>Real setting</td>
+        <td>real</td>
+        
+        
+        <td>3.14</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature1.IntSetting</td>
+        <td>Int setting</td>
+        <td>int</td>
+        
+        
+        <td>10</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature1.StringSetting</td>
+        <td>String setting</td>
+        <td>string</td>
+        
+        
+        <td>string from product config</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature1.BooleanSetting</td>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature1.SelectionSetting</td>
+        <td>Selection setting</td>
+        <td>selection</td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature1.SequenceSetting</td>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        
+        
+        <td>SequenceData(columns=[SequenceColumn(ref='RealSubSetting', name='Real sub-setting', type='real'), SequenceColumn(ref='IntSubSetting', name='Int sub-setting', type='int'), SequenceColumn(ref='StringSubSetting', name='String sub-setting', type='string'), SequenceColumn(ref='BooleanSubSetting', name='Boolean sub-setting', type='boolean'), SequenceColumn(ref='SelectionSubSetting', name='Selection sub-setting', type='selection')], rows=[{'RealSubSetting': '1.5', 'IntSubSetting': '256', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'test (product)', 'BooleanSubSetting': 'false'}, {'RealSubSetting': '1.25', 'IntSubSetting': '128', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'def1', 'BooleanSubSetting': 'false'}, {'RealSubSetting': '1.5', 'IntSubSetting': '256', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'def2', 'BooleanSubSetting': 'false'}, {'RealSubSetting': '1.5', 'IntSubSetting': '256', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'test', 'BooleanSubSetting': 'true'}])</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset1Feature2.SequenceSetting</td>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        
+        
+        <td>SequenceData(columns=[SequenceColumn(ref='IntSubSetting', name='Int sub-setting', type='int'), SequenceColumn(ref='StringSubSetting', name='String sub-setting', type='string')], rows=[{'IntSubSetting': '1', 'StringSubSetting': 'default 1'}, {'IntSubSetting': '2', 'StringSubSetting': 'default 2'}])</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.RealSetting</td>
+        <td>Real setting</td>
+        <td>real</td>
+        
+        
+        <td>10.5</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.IntSetting</td>
+        <td>Int setting</td>
+        <td>int</td>
+        
+        
+        <td>1200</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.StringSetting</td>
+        <td>String setting</td>
+        <td>string</td>
+        
+        
+        <td>default string</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.BooleanSetting</td>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.SelectionSetting</td>
+        <td>Selection setting</td>
+        <td>selection</td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature1.SequenceSetting</td>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        
+        
+        <td>SequenceData(columns=[SequenceColumn(ref='RealSubSetting', name='Real sub-setting', type='real'), SequenceColumn(ref='IntSubSetting', name='Int sub-setting', type='int'), SequenceColumn(ref='StringSubSetting', name='String sub-setting', type='string'), SequenceColumn(ref='BooleanSubSetting', name='Boolean sub-setting', type='boolean'), SequenceColumn(ref='SelectionSubSetting', name='Selection sub-setting', type='selection')], rows=[{'RealSubSetting': '1.25', 'IntSubSetting': '128', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'def1', 'BooleanSubSetting': 'false'}, {'RealSubSetting': '1.5', 'IntSubSetting': '256', 'SelectionSubSetting': 'Op1', 'StringSubSetting': 'def2', 'BooleanSubSetting': 'false'}])</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Asset2Feature2.SequenceSetting</td>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        
+        
+        <td>SequenceData(columns=[SequenceColumn(ref='IntSubSetting', name='Int sub-setting', type='int'), SequenceColumn(ref='StringSubSetting', name='String sub-setting', type='string')], rows=[{'IntSubSetting': '1', 'StringSubSetting': 'default 1'}, {'IntSubSetting': '2', 'StringSubSetting': 'default 2'}])</td>
+        
+        
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_langpacks.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,773 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Data value info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration data value info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        <th class="featureName">Possible values</th>
+        
+        <th class="featureName">product_langpack_01_root.confml</th>
+        
+        <th class="featureName">product_langpack_02_root.confml</th>
+        
+        <th class="featureName">product_langpack_03_root.confml</th>
+        
+    </tr>
+    
+    <tr><th colspan="6">All settings</th></tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>3.14</td>
+        
+        <td>3.14</td>
+        
+        <td>3.14</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>10</td>
+        
+        <td>10</td>
+        
+        <td>10</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>string from product (langpack 01) config</td>
+        
+        <td>string from product (langpack 02) config</td>
+        
+        <td>string from product (langpack 03) config</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10001.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10001</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 01)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10002.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10002</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 02)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10003.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10003</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 03)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>10.5</td>
+        
+        <td>10.5</td>
+        
+        <td>10.5</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>1001</td>
+        
+        <td>1002</td>
+        
+        <td>1003</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>langpack 01 string</td>
+        
+        <td>langpack 02 string</td>
+        
+        <td>langpack 03 string</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_multi_mixed.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,925 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Data value info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration data value info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        <th class="featureName">Possible values</th>
+        
+        <th class="featureName">product_root.confml</th>
+        
+        <th class="featureName">product_langpack_01_root.confml</th>
+        
+        <th class="featureName">product_langpack_02_root.confml</th>
+        
+        <th class="featureName">product_langpack_03_root.confml</th>
+        
+    </tr>
+    
+    <tr><th colspan="7">All settings</th></tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>3.14</td>
+        
+        <td>3.14</td>
+        
+        <td>3.14</td>
+        
+        <td>3.14</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>10</td>
+        
+        <td>10</td>
+        
+        <td>10</td>
+        
+        <td>10</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>string from product config</td>
+        
+        <td>string from product (langpack 01) config</td>
+        
+        <td>string from product (langpack 02) config</td>
+        
+        <td>string from product (langpack 03) config</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10001.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10001</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 01)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10002.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10002</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 02)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>10003.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>10003</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product, lang 03)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 5</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>10.5</td>
+        
+        <td>10.5</td>
+        
+        <td>10.5</td>
+        
+        <td>10.5</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>1200</td>
+        
+        <td>1001</td>
+        
+        <td>1002</td>
+        
+        <td>1003</td>
+        
+        
+    </tr>
+    
+    <tr bgcolor="#CCCCFF">
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>default string</td>
+        
+        <td>langpack 01 string</td>
+        
+        <td>langpack 02 string</td>
+        
+        <td>langpack 03 string</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_single.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,424 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Data value info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration data value info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        <th class="featureName">Possible values</th>
+        
+        <th class="featureName">product_root.confml</th>
+        
+    </tr>
+    
+    <tr><th colspan="4">All settings</th></tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>3.14</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>10</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>string from product config</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test (product)</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 3</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 4</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>test</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>true</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>10.5</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>1200</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>default string</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.25</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>128</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def1</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Real sub-setting</b></td>
+                            <td>1.5</td>
+                            </tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>256</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>def2</td>
+                            </tr><tr>
+                            <td><b>Boolean sub-setting</b></td>
+                            <td>false</td>
+                            </tr><tr>
+                            <td><b>Selection sub-setting</b></td>
+                            <td>Op1</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_single_with_view.html	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,280 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
+<html lang="en">
+<head>
+
+<style type="text/css">
+    body {
+        font-family: Nokia Standard Multiscript, Tahoma, Verdana, Arial;
+        font-size: 0.8em;
+        color: #0055B7;
+    }
+
+    h1 {
+        padding: 30px 0 0 0;
+        margin: 0;
+        text-align: left;
+    }
+
+    #date {
+        text-align: center;
+    }
+
+    hr {
+        height: 1px;
+        background-color: cccccc;
+        color: #cccccc;
+    }
+
+    h2 h3 {
+        padding: 10px 0 10px 0;
+        margin: 0;
+    }
+
+    table.report {
+        width: 100%;
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.report th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.report th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.report th.header {
+        background-color: #f9fafd;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 0.8em;
+        border-top: 1px #9d9da1;
+        border-bottom: 1px #9d9da1;
+    }
+
+    table.report td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    table.summary {
+        border: 1px solid #e0dfe3;
+        border-collapse: collapse;
+        color: #333333;
+    }
+
+    table.summary th {
+        text-align: left;
+        padding: 5px;
+        background-color: #f9fafd;
+        color: #595a5f;
+        border-bottom: 1px #999999 solid;
+    }
+
+    table.summary th.featureName {
+        background-color: #f2f2f3;
+        font: #595a5f Tahoma, Verdana, Arial bold;
+        font-size: 1.1em;
+        border-top: 3px #9d9da1;
+        border-top-style: double;
+        border-bottom: 3px #9d9da1;
+        border-bottom-style: double;
+    }
+
+    table.summary td {
+        word-wrap: break-word;
+        border: 1px #EBEBEB;
+        padding: 5px;
+        border-style: solid; 
+        vertical-align: top;
+        font: Tahoma, Verdana, Arial;
+        _font-size: 0.8em;
+    }
+
+    .currentValue {
+        background-color: #e8f2fe;
+    }
+</style>
+<title>Data value info - ConE</title>
+
+</head>
+<body>
+<div id="content">
+    <h1>Configuration data value info</h1><br>
+
+    <table class="report">
+    <tr>
+        <th class="featureName">Name</th>
+        <th class="featureName">Type</th>
+        <th class="featureName">Possible values</th>
+        
+        <th class="featureName">product_root.confml</th>
+        
+    </tr>
+    
+    <tr><th colspan="4">Asset 1 settings</th></tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr><th colspan="4">Asset 1 settings -- Sub-group 1</th></tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>3.14</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>10</td>
+        
+        
+    </tr>
+    
+    <tr><th colspan="4">Asset 1 settings -- Sub-group 2</th></tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>String setting</td>
+        <td>string</td>
+        <td></td>
+        
+        
+        <td>string from product config</td>
+        
+        
+    </tr>
+    
+    <tr><th colspan="4">Asset 2 settings -- Sub-group 1</th></tr>
+    
+    <tr>
+        <td>Real setting</td>
+        <td>real</td>
+        <td></td>
+        
+        
+        <td>10.5</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Int setting</td>
+        <td>int</td>
+        <td></td>
+        
+        
+        <td>1200</td>
+        
+        
+    </tr>
+    
+    <tr><th colspan="4">Asset 2 settings -- Sub-group 2</th></tr>
+    
+    <tr>
+        <td>Selection setting</td>
+        <td>selection</td>
+        <td>Option0<br/>
+        Option1<br/>
+        Option2<br/>
+        Option3<br/>
+        Option4<br/>
+        </td>
+        
+        
+        <td>Option1</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Boolean setting</td>
+        <td>boolean</td>
+        <td></td>
+        
+        
+        <td>True</td>
+        
+        
+    </tr>
+    
+    <tr>
+        <td>Sequence setting</td>
+        <td>sequence</td>
+        <td></td>
+        
+        
+        <td>
+                    <table><tr><td colspan="2"><b>Item 1</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>1</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 1</td>
+                            </tr><tr><td colspan="2"><b>Item 2</b></td></tr><tr>
+                            <td><b>Int sub-setting</b></td>
+                            <td>2</td>
+                            </tr><tr>
+                            <td><b>String sub-setting</b></td>
+                            <td>default 2</td>
+                            </tr></table>
+                </td>
+        
+        
+    </tr>
+    
+    
+    </table>
+</div>
+<div id="footer"></div>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/expected/value_report_special_chars.csv	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+Name,Type,Possible values,csv_test_root.confml,
+
+All settings
+Real setting,real,"",3.14,
+Int setting,int,"",1234,
+String setting,string,"","test, ""test"",
+more test",
+Boolean setting,boolean,"",True,
+Selection setting,selection,"Option0
+Option1
+Option2
+Option3
+Option4
+",Option1,
+Sequence setting,sequence,"",<sequence data>,
+Sequence setting,sequence,"",<sequence data>,
+Real setting,real,"",10.5,
+Int setting,int,"",1234,
+String setting,string,"",カタカナ ÑƒÐ´Ð°Ñ€ÐµÐ½Ð¸Ñ ÎµÎ»Î»Î·Î½Î¹ÎºÎ¬,
+Boolean setting,boolean,"",True,
+Selection setting,selection,"Option0
+Option1
+Option2
+Option3
+Option4
+",Option1,
+Sequence setting,sequence,"",<sequence data>,
+Sequence setting,sequence,"",<sequence data>,
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/include_test_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" name="view_include_test">
+  <xi:include href="test_view.confml" />
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/test_view.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:confml="http://www.s60.com/xml/confml/2">
+  <view id="test_view" name="Test view">
+    <group name="Asset 1 settings">
+        <setting ref="Asset1Feature1/BooleanSetting"/>
+        
+        <group name="Sub-group 1">
+            <setting ref="Asset1Feature1/RealSetting"/>
+            <setting ref="Asset1Feature1/IntSetting"/>
+        </group>
+        <group name="Sub-group 2">
+            <setting ref="Asset1Feature1/SelectionSetting"/>
+            <setting ref="Asset1Feature1/StringSetting"/>
+        </group>
+    </group>
+    <group name="Asset 2 settings">
+        <group name="Sub-group 1">
+            <setting ref="Asset2Feature1/RealSetting"/>
+            <setting ref="Asset2Feature1/IntSetting"/>
+        </group>
+        <group name="Sub-group 2">
+            <setting ref="Asset2Feature1/SelectionSetting"/>
+            <setting ref="Asset2Feature1/BooleanSetting"/>
+            <setting ref="Asset2Feature2/*"/>
+            <!-- Non-existent settings should not make the report generation fail -->
+            <setting ref="Asset2Feature2/NonexistentSetting"/>
+        </group>
+    </group>
+  </view>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/asset1_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/asset2_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset2/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/confml/asset1_feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Asset 1, Feature 1" version="1">
+  <feature ref="Asset1Feature1" name="Asset 1, Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Asset1Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Asset1Feature1>
+  </data>
+  
+  <rfs>
+    <Asset1Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Asset1Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/confml/asset1_feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset1/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="asset1">
+  <xi:include href="confml/asset1_feature1.confml"/>
+  <xi:include href="confml/asset1_feature2.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/confml/asset2_feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Asset 2, Feature 1" version="1">
+  <feature ref="Asset2Feature1" name="Asset 2, Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Asset2Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Asset2Feature1>
+  </data>
+  
+  <rfs>
+    <Asset2Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Asset2Feature1>
+  </rfs>
+</configuration>
Binary file configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/confml/asset2_feature2.confml has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/assets/asset2/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="asset2">
+  <xi:include href="confml/asset2_feature1.confml"/>
+  <xi:include href="confml/asset2_feature2.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>test, "test",
+more test</StringSetting>
+            <IntSetting>1234</IntSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <StringSetting>カタカナ ÑƒÐ´Ð°Ñ€ÐµÐ½Ð¸Ñ ÎµÎ»Î»Î·Î½Î¹ÎºÎ¬</StringSetting>
+            <IntSetting>1234</IntSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="csv_test">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/csv_test_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+  <xi:include href="csv_test/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/family/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from family config</StringSetting>
+            
+            <SequenceSetting extensionPolicy="append">
+                <RealSubSetting>1.5</RealSubSetting>
+                <IntSubSetting>256</IntSubSetting>
+                <StringSubSetting>test</StringSubSetting>
+                <BooleanSubSetting>true</BooleanSubSetting>
+                <SelectionSubSetting>1</SelectionSubSetting>
+            </SequenceSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1000</IntSetting>
+            <RealSetting>10.5</RealSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/family/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="family">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/family_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from product config</StringSetting>
+            
+            <SequenceSetting extensionPolicy="prefix">
+                <RealSubSetting>1.5</RealSubSetting>
+                <IntSubSetting>256</IntSubSetting>
+                <StringSubSetting>test (product)</StringSubSetting>
+                <BooleanSubSetting>false</BooleanSubSetting>
+                <SelectionSubSetting>1</SelectionSubSetting>
+            </SequenceSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1200</IntSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_01/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from product (langpack 01) config</StringSetting>
+            
+            <SequenceSetting extensionPolicy="prefix">
+                <RealSubSetting>10001.5</RealSubSetting>
+                <IntSubSetting>10001</IntSubSetting>
+                <StringSubSetting>test (product, lang 01)</StringSubSetting>
+                <BooleanSubSetting>false</BooleanSubSetting>
+                <SelectionSubSetting>1</SelectionSubSetting>
+            </SequenceSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1001</IntSetting>
+            <StringSetting>langpack 01 string</StringSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_01/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="langpack_01">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_02/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from product (langpack 02) config</StringSetting>
+            
+            <SequenceSetting extensionPolicy="prefix">
+                <RealSubSetting>10002.5</RealSubSetting>
+                <IntSubSetting>10002</IntSubSetting>
+                <StringSubSetting>test (product, lang 02)</StringSubSetting>
+                <BooleanSubSetting>false</BooleanSubSetting>
+                <SelectionSubSetting>1</SelectionSubSetting>
+            </SequenceSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1002</IntSetting>
+            <StringSetting>langpack 02 string</StringSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_02/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="langpack_02">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_03/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from product (langpack 03) config</StringSetting>
+            
+            <SequenceSetting extensionPolicy="prefix">
+                <RealSubSetting>10003.5</RealSubSetting>
+                <IntSubSetting>10003</IntSubSetting>
+                <StringSubSetting>test (product, lang 03)</StringSubSetting>
+                <BooleanSubSetting>false</BooleanSubSetting>
+                <SelectionSubSetting>1</SelectionSubSetting>
+            </SequenceSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1003</IntSetting>
+            <StringSetting>langpack 03 string</StringSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/language/langpack_03/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="langpack_03">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="product">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_01_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+  <xi:include href="product/language/langpack_01/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_02_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+  <xi:include href="product/language/langpack_02/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product_langpack_03_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+  <xi:include href="product/language/langpack_03/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/product_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/variant/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Asset1Feature1>
+            <StringSetting>string from variant config</StringSetting>
+            <IntSetting>1234</IntSetting>
+        </Asset1Feature1>
+        
+        <Asset2Feature1>
+            <IntSetting>1234</IntSetting>
+        </Asset2Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/variant/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="variant">
+  <xi:include href="confml/data.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/info/value_report_project/variant_root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="assets/asset1/root.confml"/>
+  <xi:include href="assets/asset2/root.confml"/>
+  <xi:include href="family/root.confml"/>
+  <xi:include href="product/root.confml"/>
+  <xi:include href="variant/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/log_config.ini	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,28 @@
+[DEFAULT]
+
+[loggers]
+keys=root,cone
+
+[handlers]
+keys=consoleHandler
+
+[formatters]
+keys=consoleFormatter 
+
+[logger_root]
+level=NOTSET
+handlers=consoleHandler
+
+[logger_cone]
+level=NOTSET
+qualname=cone
+handlers=
+
+[handler_consoleHandler]
+class=StreamHandler
+formatter=consoleFormatter
+args=(sys.stdout,)
+level=DEBUG
+
+[formatter_consoleFormatter]
+format=Level:%(levelname)s, Logger:%(name)s, Message:%(message)s
Binary file configurationengine/source/scripts/tests/testdata/merge/assetmerge/data.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/assetmerge/expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/last_layer_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/last_layer_rename_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v1_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v1_v2_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/last_layer_variant_v2_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/multiple_last_layers_expected.zip has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/test_variant_v1.cpf has changed
Binary file configurationengine/source/scripts/tests/testdata/merge/test_variant_v2.cpf has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/expected/both.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,25 @@
+Refs with implementations
+=========================
+
+Ref: Feature1.BooleanSetting
+Impls:
+File = "base\implml\booleansetting_rofs3.templateml", type = "templateml", gen_runs = ['rofs3']
+File = "base\implml\booleansetting_uda.templateml", type = "templateml", gen_runs = ['uda']
+-------------------------------------------------
+Ref: Feature1.IntSetting
+Impls:
+File = "base\implml\intsetting_rofs3.templateml", type = "templateml", gen_runs = ['rofs3']
+-------------------------------------------------
+Ref: Feature1.RealSetting
+Impls:
+File = "base\implml\realsetting_rofs3_uda.templateml", type = "templateml", gen_runs = ['rofs3', 'uda']
+-------------------------------------------------
+Ref: Feature1.StringSetting
+Impls:
+File = "base\implml\stringsetting_uda.templateml", type = "templateml", gen_runs = ['uda']
+
+
+
+Refs with no implementation
+===========================
+Feature1.SelectionSetting
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/expected/rofs3.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+Refs with implementations
+=========================
+
+Ref: Feature1.BooleanSetting
+Impls:
+File = "base\implml\booleansetting_rofs3.templateml", type = "templateml", gen_runs = []
+-------------------------------------------------
+Ref: Feature1.IntSetting
+Impls:
+File = "base\implml\intsetting_rofs3.templateml", type = "templateml", gen_runs = []
+-------------------------------------------------
+Ref: Feature1.RealSetting
+Impls:
+File = "base\implml\realsetting_rofs3_uda.templateml", type = "templateml", gen_runs = []
+
+
+
+Refs with no implementation
+===========================
+Feature1.SelectionSetting
+Feature1.StringSetting
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/expected/uda.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,21 @@
+Refs with implementations
+=========================
+
+Ref: Feature1.BooleanSetting
+Impls:
+File = "base\implml\booleansetting_uda.templateml", type = "templateml", gen_runs = []
+-------------------------------------------------
+Ref: Feature1.RealSetting
+Impls:
+File = "base\implml\realsetting_rofs3_uda.templateml", type = "templateml", gen_runs = []
+-------------------------------------------------
+Ref: Feature1.StringSetting
+Impls:
+File = "base\implml\stringsetting_uda.templateml", type = "templateml", gen_runs = []
+
+
+
+Refs with no implementation
+===========================
+Feature1.IntSetting
+Feature1.SelectionSetting
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/confml/feature1.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,89 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns="http://www.s60.com/xml/confml/1" name="Feature 1" version="1">
+  <feature ref="Feature1" name="Feature 1 (ConfML v1.0)">
+    <desc>Feature with all supported setting types for ConfML v1.0</desc>
+    <setting ref="RealSetting" name="Real setting" type="real">
+      <desc>A real setting</desc>
+    </setting>
+    <setting ref="IntSetting" name="Int setting" type="int">
+      <desc>An int setting</desc>
+    </setting>
+    <setting ref="StringSetting" name="String setting" type="string">
+      <desc>A string setting</desc>
+    </setting>
+    <setting ref="BooleanSetting" name="Boolean setting" type="boolean">
+      <desc>A boolean setting</desc>
+    </setting>
+    <setting ref="SelectionSetting" name="Selection setting" type="selection">
+      <desc>A selection setting</desc>
+      <option name="Option0" value="0"/>
+      <option name="Option1" value="1"/>
+      <option name="Option2" value="2"/>
+      <option name="Option3" value="3"/>
+      <option name="Option4" value="4"/>
+    </setting>
+    <setting ref="SequenceSetting" name="Sequence setting" type="sequence">
+      <desc>A sequence setting</desc>
+      <setting ref="RealSubSetting" name="Real sub-setting" type="real">
+        <desc>A real sub-setting</desc>
+      </setting>
+      <setting ref="IntSubSetting" name="Int sub-setting" type="int">
+        <desc>An int sub-setting</desc>
+      </setting>
+      <setting ref="StringSubSetting" name="String sub-setting" type="string">
+        <desc>A string sub-setting</desc>
+      </setting>
+      <setting ref="BooleanSubSetting" name="Boolean sub-setting" type="boolean">
+        <desc>A boolean sub-setting</desc>
+      </setting>
+      <setting ref="SelectionSubSetting" name="Selection sub-setting" type="selection">
+        <desc>A selection sub-setting</desc>
+        <option name="Op0" value="0"/>
+        <option name="Op1" value="1"/>
+        <option name="Op2" value="2"/>
+        <option name="Op3" value="3"/>
+        <option name="Op4" value="4"/>
+      </setting>
+    </setting>
+  </feature>
+  <data>
+    <Feature1>
+      <RealSetting>3.14</RealSetting>
+      <IntSetting>10</IntSetting>
+      <StringSetting>default string</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>1</SelectionSetting>
+      <SequenceSetting template="true">
+        <RealSubSetting>1.0</RealSubSetting>
+        <IntSubSetting>1</IntSubSetting>
+        <StringSubSetting>template</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>0</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.25</RealSubSetting>
+        <IntSubSetting>128</IntSubSetting>
+        <StringSubSetting>def1</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+      <SequenceSetting>
+        <RealSubSetting>1.5</RealSubSetting>
+        <IntSubSetting>256</IntSubSetting>
+        <StringSubSetting>def2</StringSubSetting>
+        <BooleanSubSetting>false</BooleanSubSetting>
+        <SelectionSubSetting>1</SelectionSubSetting>
+      </SequenceSetting>
+    </Feature1>
+  </data>
+  
+  <rfs>
+    <Feature1>
+      <RealSetting>true</RealSetting>
+      <IntSetting>false</IntSetting>
+      <StringSetting>false</StringSetting>
+      <BooleanSetting>true</BooleanSetting>
+      <SelectionSetting>true</SelectionSetting>
+    </Feature1>
+  </rfs>
+</configuration>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/implml/booleansetting_rofs3.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="rofs3"/>
+    <output file="booleansetting_rofs3.txt" encoding="UTF-8">
+<template>
+Feature1.BooleanSetting: {{ feat_tree.Feature1.BooleanSetting._value }}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/implml/booleansetting_uda.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="uda"/>
+    <output file="booleansetting_uda.txt" encoding="UTF-8">
+<template>
+Feature1.BooleanSetting: {{ feat_tree.Feature1.BooleanSetting._value }}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/implml/intsetting_rofs3.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="rofs3"/>
+    <output file="intsetting_rofs3.txt" encoding="UTF-8">
+<template>
+Feature1.IntSetting: {{ feat_tree.Feature1.IntSetting._value }}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/implml/realsetting_rofs3_uda.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="rofs3"/>
+    <tag name="target" value="uda"/>
+    <output file="realsetting_rofs3_uda.txt" encoding="UTF-8">
+<template>
+Feature1.RealSetting: {{ feat_tree.Feature1.RealSetting._value }}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/implml/stringsetting_uda.templateml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<templateml xmlns="http://www.s60.com/xml/templateml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:implml="http://www.symbianfoundation.org/xml/implml/1">
+    <tag name="target" value="uda"/>
+    <output file="stringsetting_uda.txt" encoding="UTF-8">
+<template>
+Feature1.StringSetting: {{ feat_tree.Feature1.StringSetting._value }}
+</template>
+    </output>
+</templateml>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/base/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Base layer">
+  <xi:include href="confml/feature1.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/data/confml/data.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.s60.com/xml/confml/2" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2" name="data">
+    <data>
+        <Feature1>
+            <RealSetting>5.555</RealSetting>
+            <IntSetting>5555</IntSetting>
+            <StringSetting>Test test</StringSetting>
+            <BooleanSetting>false</BooleanSetting>
+            <SelectionSetting>2</SelectionSetting>
+        </Feature1>
+    </data>
+</configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/data/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/1" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include" name="Data layer">
+  <xi:include href="confml/data.confml"/>
+  <confml:meta/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/project/root.confml	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="ASCII"?>
+<confml:configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:confml="http://www.s60.com/xml/confml/2" xmlns:xi="http://www.w3.org/2001/XInclude" xsi:schemaLocation="http://www.s60.com/xml/confml/2 http://www.s60.com/xml/confml/1#//confml2 http://www.w3.org/2001/XInclude http://www.s60.com/xml/confml/1#//include">
+  <xi:include href="base/root.confml"/>
+  <xi:include href="data/root.confml"/>
+</confml:configuration>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/testdata/report/template.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,19 @@
+Refs with implementations
+=========================
+{% for feat in rep_data.lines -%}
+{% if not loop.first -%}
+-------------------------------------------------
+{%- endif %}
+Ref: {{ feat.ref }}
+Impls:
+{% for impl in feat.impls -%}
+    File = "{{ impl.name }}", type = "{{ impl.type }}", gen_runs = {{impl.generation_runs}}
+{% endfor -%}
+{% endfor %}
+
+
+Refs with no implementation
+===========================
+{% for feat in rep_data.ref_noimpl -%}
+    {{ feat.ref }}
+{% endfor %}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_compare.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,229 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys
+import os
+import shutil
+import subprocess
+import difflib
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from scripttest_common import get_cmd
+
+
+ROOT_PATH       = os.path.dirname(os.path.abspath(__file__))
+TESTDATA_DIR    = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/compare'))
+TEMP_DIR        = os.path.normpath(os.path.join(ROOT_PATH, 'temp/compare'))
+
+from cone.public import api
+
+#import conesub_compare
+class TestCompareAction(BaseTestCase):
+    
+    def setUp(self):
+        if not os.path.exists(TEMP_DIR):
+            os.makedirs(TEMP_DIR)
+    
+    #def test_parse_target_configuration(self):
+    #    act = conesub_compare.CompareAction('','','')
+    #    self.assertEquals(act.parse_target_configuration("root.confml"), ('','root.confml'))
+    #    self.assertEquals(act.parse_target_configuration("x:\foo.cpf;root.confml"), ('x:\foo.cpf','root.confml'))
+    #    self.assertEquals(act.parse_target_configuration("root\project;root.confml"), ('root\project','root.confml'))
+    #    self.assertEquals(act.parse_target_configuration("http://testserver:8000/external;foo/bar/root.confml"), ('http://testserver:8000/external','foo/bar/root.confml'))
+
+    def test_default_compare(self):
+        # Test comparison using default parameters
+        orig_workdir = os.getcwd()
+        os.chdir(os.path.join(TEMP_DIR))
+        try:
+            project = os.path.join(TESTDATA_DIR, "project1.zip")
+            source_conf = "root1.confml"
+            target_conf = "root2.confml"
+            
+            report_file = os.path.join(TEMP_DIR, "data_comparison.html")
+            self.remove_if_exists(report_file)
+            
+            command = '%s -p "%s" -s "%s" -t "%s"' \
+                % (get_cmd('compare'), project, source_conf, target_conf)
+            self.run_command(command)
+            self.assert_exists_and_contains_something(report_file)
+        finally:
+            os.chdir(orig_workdir)
+
+    def test_compare_api_same_root(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root1.confml',
+            template        = 'api_template.txt',
+            report_file     = 'api_p1r1_vs_p1r1.txt',
+            check_against_expected_output = True)
+    
+    def test_compare_data_same_root(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root1.confml',
+            template        = 'data_template.txt',
+            report_file     = 'data_p1r1_vs_p1r1.txt',
+            check_against_expected_output = True)
+    
+    def test_compare_api_same_project_different_root(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root4.confml',
+            template        = 'api_template.txt',
+            report_file     = 'api_p1r1_vs_p1r4.txt',
+            check_against_expected_output = True)
+    
+    def test_compare_data_same_project_different_root(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root4.confml',
+            template        = 'data_template.txt',
+            report_file     = 'data_p1r1_vs_p1r4.txt',
+            check_against_expected_output = True)
+    
+    def test_compare_api_proj1_vs_proj2(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = 'project2.zip',
+            target_conf     = 'root1.confml',
+            template        = 'api_template.txt',
+            report_file     = 'api_p1r1_vs_p2r1.txt',
+            check_against_expected_output = True)
+    
+    def test_compare_data_proj1_vs_proj2(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = 'project2.zip',
+            target_conf     = 'root1.confml',
+            template        = 'data_template.txt',
+            report_file     = 'data_p1r1_vs_p2r1.txt',
+            check_against_expected_output = True)
+    
+    def test_comparison_using_type_api(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root4.confml',
+            report_type     = 'api',
+            report_file     = 'api_p1r1_vs_p1r4.html',
+            check_against_expected_output = False)
+    
+    def test_comparison_using_type_data(self):
+        self._run_comparison_test(
+            source_project  = 'project1.zip',
+            source_conf     = 'root1.confml',
+            target_project  = None,
+            target_conf     = 'root4.confml',
+            report_type     = 'data',
+            report_file     = 'data_p1r1_vs_p1r4.html',
+            check_against_expected_output = False)
+
+    def _run_comparison_test(self, **kwargs):
+        """
+        Run comparison test.
+        
+        @param source_project: The source project, relative to the test data directory or an
+            absolute path.
+        @param source_conf: The source configuration.
+        @param target_project: The target project, relative to the test data directory
+            If not given or None, the source project will be used also for this.
+        @param target_conf: The target configuration.
+        @param template: The template file used for the report, relative to the test data directory.
+        @param report_type: The report type. Should not be used with the 'template' parameter.
+        @param report_file: The location where the report is written. This will also be used as
+            the name of the expected report file against which the actual report is checked.
+        @param impl_filter: Implementation filter to use.
+        @param check_against_expected_output: If True, the actual report is checked against an
+            expected file with the same name. Otherwise it is just checked that the output
+            file has been created and it contains something.
+        """
+        # Get parameters
+        # ---------------
+        def get_project_absdir(project_dir):
+            if os.path.isabs(project_dir):
+                return project_dir
+            else:
+                return os.path.normpath(os.path.join(TESTDATA_DIR, project_dir))
+        
+        source_conf = kwargs['source_conf']
+        target_conf = kwargs['target_conf']
+        source_project = get_project_absdir(kwargs['source_project'])
+        target_project = kwargs.get('target_project', None)
+        
+        if target_project != None:
+            target_project = get_project_absdir(target_project)
+            target_conf = target_project + ';' + target_conf
+        
+        template = kwargs.get('template', None)
+        report_type = kwargs.get('report_type', None)
+        if template and report_type:
+            raise ValueError("Both 'template' and 'report_type' parameters given")
+        elif not template and not report_type:
+            raise ValueError("Neither 'template' not 'report_type' parameter given")
+        elif template:
+            template = os.path.normpath(os.path.join(TESTDATA_DIR, template))
+        
+        report_file = kwargs['report_file']
+        check_against_expected_output = kwargs['check_against_expected_output']
+        actual_report = os.path.normpath(os.path.join(TEMP_DIR, report_file))
+        
+        impl_filter = kwargs.get('impl_filter', None)
+        
+        
+        # Generate output
+        # ----------------
+        if report_type:
+            command = '%s -p "%s" -s "%s" -t "%s" --report-type "%s" --report "%s"' \
+                % (get_cmd('compare'), source_project, source_conf, target_conf, report_type, actual_report)
+        else:
+            command = '%s -p "%s" -s "%s" -t "%s" --template "%s" --report "%s"' \
+                % (get_cmd('compare'), source_project, source_conf, target_conf, template, actual_report)
+        
+        if impl_filter:
+            command += ' --impl-filter "%s"' % impl_filter
+        
+        self.remove_if_exists(actual_report)
+        self.run_command(command)
+        
+        
+        # Check output
+        # -------------
+        if check_against_expected_output:
+            expected_report = os.path.normpath(os.path.join(TESTDATA_DIR, 'expected', report_file))
+            self.assert_file_contents_equal(expected_report, actual_report)
+        else:
+            self.assert_exists_and_contains_something(actual_report)
+        
+        
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_cone.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,102 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys
+import os
+import subprocess
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from scripttest_common import get_cmd
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+
+class TestConeHelp(BaseTestCase):    
+
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('')
+        out = self.run_command(cmd)
+        lines = out.split(os.linesep)
+        self.assertTrue('Available actions ' in lines)
+    
+    def test_verbose_level(self):
+        cmd = '%s info --print-runtime-info --verbose=5' % get_cmd('')
+        out = self.run_command(cmd)
+        # Check that there are debug messages in the output
+        self.assertTrue('DEBUG   : cone' in out)
+        self.assertTrue('sys.path contents:' in out)
+    
+    def test_empty_verbose_level(self):
+        cmd = '%s info --print-runtime-info --verbose=' % get_cmd('')
+        out = self.run_command(cmd)
+        self.assertTrue('Python version: ' in out)
+    
+    def test_runtime_info_logged(self):
+        # This test makes sure that runtime info is always logged
+        # in the log file
+        
+        TEST_DIR = os.path.join(ROOT_PATH, "temp", "log_test")
+        self.recreate_dir(TEST_DIR)
+        
+        orig_workdir = os.getcwd()
+        os.chdir(TEST_DIR)
+        try:
+            cmd = '%s' % get_cmd('info')
+            self.run_command(cmd)
+            
+            # Check that the default log file has been created
+            self.assertTrue(os.path.exists('cone.log'))
+            
+            # Check that it contains the runtime info that should
+            # always be logged
+            f = open('cone.log', 'r')
+            try:        data = f.read()
+            finally:    f.close()
+            self.assertTrue('DEBUG   : cone' in data)
+            self.assertTrue('sys.path contents:' in data)
+            self.assertTrue('PATH:' in data)
+            self.assertTrue('PYTHONPATH:' in data)
+        finally:
+            os.chdir(orig_workdir)
+    
+    def test_logfile_in_custom_location(self):
+        TEST_DIR = os.path.join(ROOT_PATH, "temp", "log_test_custom_file")
+        self.recreate_dir(TEST_DIR)
+        
+        orig_workdir = os.getcwd()
+        os.chdir(TEST_DIR)
+        try:
+            cmd = '%s --log-file foo/bar.log' % get_cmd('info')
+            self.run_command(cmd)
+            
+            self.assertFalse(os.path.exists('cone.log'))
+            self.assertTrue(os.path.exists('foo/bar.log'))
+        finally:
+            os.chdir(orig_workdir)
+    
+    def test_custom_log_config(self):
+        CONF_FILE = os.path.join(ROOT_PATH, 'testdata', 'log_config.ini')
+        cmd = '%s --log-config "%s"' % (get_cmd('info'), CONF_FILE)
+        out = self.run_command(cmd)
+        self.assertTrue("Level:DEBUG, Logger:cone, Message:sys.path contents:" in out, out)
+
+if __name__ == '__main__':
+      unittest.main()
+      
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_export.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,416 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys
+import os
+import subprocess
+import zipfile
+import shutil
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation.unzip_file import unzip_file
+from cone.storage.filestorage import FileStorage
+from cone.storage.zipstorage import ZipStorage
+from scripttest_common import get_cmd
+
+ROOT_PATH   = os.path.dirname(os.path.abspath(__file__))
+
+def abspath(p):
+    return os.path.normpath(os.path.join(ROOT_PATH, p))
+    
+TEST_PROJECT_CPF    = abspath("test_project.cpf")
+TEMP_DIR            = abspath("temp/export")
+EXPORT_TEST_PROJECT = abspath("export_test_project.zip")
+
+class TestExport(BaseTestCase):
+
+    def setUp(self):
+        self.orig_workdir = os.getcwd()
+        os.chdir(ROOT_PATH)
+        
+    def tearDown(self):
+        os.chdir(self.orig_workdir)
+
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('export')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Export options:' in lines)
+
+    def test_export_project(self):
+        remote = os.path.join(TEMP_DIR, 'test1')
+        self.remove_if_exists(remote)
+        
+        self.set_modification_reference_time(TEST_PROJECT_CPF)
+        cmd = '%s -p "%s" -c "root4.confml" -r "%s' % (get_cmd('export'), TEST_PROJECT_CPF, remote)
+        out = self.run_command(cmd)
+        #print out
+        lines = out.split('\r\n')
+        self.assertTrue('Export root4.confml to %s done!' % remote in lines)
+        
+        self.assertEquals(set(os.listdir(remote)),
+            set(["Layer1", "Layer2", "Layer3", "Layer4", ".metadata", "root4.confml"]))
+        def fp(p): # fp = full_path
+            return os.path.join(remote, p)
+        self.assert_exists_and_contains_something(fp("Layer1"))
+        self.assert_exists_and_contains_something(fp("Layer2"))
+        self.assert_exists_and_contains_something(fp("Layer3"))
+        self.assert_exists_and_contains_something(fp("Layer4"))
+        self.assert_exists_and_contains_something(fp("root4.confml"))
+        
+        self.assert_not_modified(TEST_PROJECT_CPF)
+        
+    def test_export_multiple_configurations(self):
+        remote = os.path.join(TEMP_DIR, 'test2')
+        self.remove_if_exists(remote)
+        
+        self.set_modification_reference_time(TEST_PROJECT_CPF)
+        cmd = '%s -p "%s" -c "root2.confml" -c "root3.confml" -c "root5.confml" -r "%s"' % (get_cmd('export'), TEST_PROJECT_CPF, remote)
+        out = self.run_command(cmd)
+        #print out
+        lines = out.split('\r\n')
+        self.assertTrue('Export root2.confml to %s done!' % remote in lines)
+        self.assertTrue('Export root3.confml to %s done!' % remote in lines)
+        self.assertTrue('Export root5.confml to %s done!' % remote in lines)
+        
+        self.assertEquals(set(os.listdir(remote)),
+            set(["Layer1", "Layer2", "Layer3", "Layer4", "Layer5",
+                 ".metadata", "root2.confml", "root3.confml", "root5.confml"]))
+        def fp(p): # fp = full_path
+            return os.path.join(remote, p)
+        self.assert_exists_and_contains_something(fp("Layer1"))
+        self.assert_exists_and_contains_something(fp("Layer2"))
+        self.assert_exists_and_contains_something(fp("Layer3"))
+        self.assert_exists_and_contains_something(fp("Layer4"))
+        self.assert_exists_and_contains_something(fp("Layer5"))
+        self.assert_exists_and_contains_something(fp("root2.confml"))
+        self.assert_exists_and_contains_something(fp("root3.confml"))
+        self.assert_exists_and_contains_something(fp("root5.confml"))
+        
+        self.assert_not_modified(TEST_PROJECT_CPF)
+    
+    def test_export_multiple_configurations_into_cpf(self):
+        remote = os.path.join(TEMP_DIR, 'test3.cpf')
+        self.remove_if_exists(remote)
+        
+        self.set_modification_reference_time(TEST_PROJECT_CPF)
+        cmd = '%s -p "%s" -c "root2.confml" -c "root3.confml" -c "root5.confml" -r "%s"' % (get_cmd('export'), TEST_PROJECT_CPF, remote)
+        out = self.run_command(cmd)
+        #print out
+        lines = out.split('\r\n')
+        self.assertTrue('Export root2.confml to %s done!' % remote in lines)
+        self.assertTrue('Export root3.confml to %s done!' % remote in lines)
+        self.assertTrue('Export root5.confml to %s done!' % remote in lines)
+        
+        self.assert_zip_entry_exists(remote, "root2.confml")
+        self.assert_zip_entry_exists(remote, "root3.confml")
+        self.assert_zip_entry_exists(remote, "root5.confml")
+        
+        self.assert_not_modified(TEST_PROJECT_CPF)
+    
+    def assert_zip_entry_exists(self, zip_file, path):
+        zf = zipfile.ZipFile(zip_file, "r")
+        try:
+            if path not in zf.namelist():
+                self.fail("Entry '%s' not in zip file '%s'." % (path, zipfile))
+        finally:
+            zf.close()
+    
+    
+    def _run_test_export_project_to_project(self,
+        source_project, source_storage_type,
+        target_project, target_storage_type,
+        empty_folders):
+        # Set up the source project
+        # -------------------------
+        source_path = os.path.join(TEMP_DIR, source_project)
+        self.remove_if_exists(source_path)
+        if source_storage_type == 'file':
+            unzip_file(EXPORT_TEST_PROJECT, source_path, delete_if_exists=True)
+        elif source_storage_type == 'zip':
+            self.create_dir_for_file_path(source_path)
+            shutil.copy2(EXPORT_TEST_PROJECT, source_path)
+        else:
+            raise RuntimeError('Invalid storage type %r' % source_storage_type)
+        
+        # Set up the target project
+        # -------------------------
+        target_path = os.path.join(TEMP_DIR, target_project)
+        self.remove_if_exists(target_path)
+        if target_storage_type not in ('file', 'zip'):
+            raise RuntimeError('Invalid storage type %r' % target_storage_type)
+        
+        # Run the command
+        # ---------------
+        if empty_folders:   empty_folder_switch = ''
+        else:               empty_folder_switch = '--exclude-folders'
+        cmd = '%s -p "%s" -c "root5.confml" -r "%s" %s' % \
+            (get_cmd('export'), source_path, target_path, empty_folder_switch)
+        out = self.run_command(cmd)
+        
+        # Check the output
+        # ----------------
+        if target_storage_type == 'file':   storage_class = FileStorage
+        elif target_storage_type == 'zip':  storage_class = ZipStorage
+        
+        storage = storage_class(target_path, 'r')
+        res_list = storage.list_resources("/", recurse=True, empty_folders=True)
+        
+        expected = ['.metadata',
+                    'root5.confml',
+                    'Layer1/root.confml',
+                    'Layer2/root.confml',
+                    'Layer3/root.confml',
+                    'Layer4/root.confml',
+                    'Layer5/root.confml',]
+        for res in expected:
+            self.assertTrue(res in res_list, "%r not in %r" % (res, res_list))
+            self.assertFalse(storage.is_folder(res), "%r is a folder")
+        
+        not_expected = ['Layer1/foo/foo.txt',
+                        'Layer2/foo/layer2_foo.txt',
+                        'Layer3/foo/layer3_foo.txt',
+                        'Layer4/foo/layer4_foo.txt',
+                        'Layer5/foo/layer5_foo.txt',]
+        for res in not_expected:
+            self.assertFalse(res in res_list, "%r in %r" % (res, res_list))
+        
+        # Check empty folders
+        expected = ['Layer1/doc/empty',
+                    'Layer1/content/empty',
+                    'Layer1/implml/empty',
+                    'Layer3/doc/empty',
+                    'Layer3/content/empty',
+                    'Layer3/implml/empty',]
+        not_expected = ['Layer1/foo/empty',
+                        'Layer3/foo/empty']
+        if empty_folders:
+            for res in expected:
+                self.assertTrue(res in res_list, "%r not in %r" % (res, res_list))
+                self.assertTrue(storage.is_folder(res), "%r is not a folder")
+            
+            for res in not_expected:
+                self.assertFalse(res in res_list, "%r in %r" % (res, res_list))
+        else:
+            for res in expected + not_expected:
+                self.assertFalse(res in res_list, "%r in %r" % (res, res_list))
+
+    
+    def test_export_file_to_file(self):
+        self._run_test_export_project_to_project(
+            source_project      = 'f2f/source',
+            source_storage_type = 'file',
+            target_project      = 'f2f/target',
+            target_storage_type = 'file',
+            empty_folders       = False)
+    
+        self._run_test_export_project_to_project(
+            source_project      = 'f2f/source_ef',
+            source_storage_type = 'file',
+            target_project      = 'f2f/target_ef',
+            target_storage_type = 'file',
+            empty_folders       = True)
+    
+    def test_export_zip_to_zip(self):
+        self._run_test_export_project_to_project(
+            source_project      = 'z2z/source.zip',
+            source_storage_type = 'zip',
+            target_project      = 'z2z/target.zip',
+            target_storage_type = 'zip',
+            empty_folders       = False)
+    
+        self._run_test_export_project_to_project(
+            source_project      = 'z2z/source_ef.zip',
+            source_storage_type = 'zip',
+            target_project      = 'z2z/target_ef.zip',
+            target_storage_type = 'zip',
+            empty_folders       = True)
+    
+    def test_export_file_to_zip(self):
+        self._run_test_export_project_to_project(
+            source_project      = 'f2z/source',
+            source_storage_type = 'file',
+            target_project      = 'f2z/target.zip',
+            target_storage_type = 'zip',
+            empty_folders       = False)
+    
+        self._run_test_export_project_to_project(
+            source_project      = 'f2z/source_ef',
+            source_storage_type = 'file',
+            target_project      = 'f2z/target_ef.zip',
+            target_storage_type = 'zip',
+            empty_folders       = True)
+    
+    def test_export_zip_to_file(self):
+        self._run_test_export_project_to_project(
+            source_project      = 'z2f/source.zip',
+            source_storage_type = 'zip',
+            target_project      = 'z2f/target',
+            target_storage_type = 'file',
+            empty_folders       = False)
+    
+        self._run_test_export_project_to_project(
+            source_project      = 'z2f/source_ef.zip',
+            source_storage_type = 'zip',
+            target_project      = 'z2f/target_ef',
+            target_storage_type = 'file',
+            empty_folders       = True)
+    
+    def _run_test_multi_export(self, export_dir, export_format, config_args,
+                               expected_cpfs=None, expected_dirs=None):
+        self.assertFalse(expected_cpfs is None and expected_dirs is None,
+                         "Only one of expected_cpfs or expected_dirs can be specified!")
+        self.assertFalse(expected_cpfs is None and expected_dirs is None,
+                         "Either expected_cpfs or expected_dirs must be specified!")
+        
+        EXPORT_DIR = os.path.join(TEMP_DIR, export_dir)
+        self.remove_if_exists(EXPORT_DIR)
+        
+        self.set_modification_reference_time(TEST_PROJECT_CPF)
+        cmd = '%(cmd)s -p "%(project)s" %(args)s --export-dir "%(export_dir)s" --export-format %(export_format)s' \
+            % {'cmd'            : get_cmd('export'),
+               'project'        : TEST_PROJECT_CPF,
+               'args'           : config_args,
+               'export_dir'     : EXPORT_DIR,
+               'export_format'  : export_format}
+        out = self.run_command(cmd)
+        self.assert_not_modified(TEST_PROJECT_CPF)
+        
+        if expected_cpfs:
+            for cpf_name, config_root in expected_cpfs:
+                path = os.path.join(EXPORT_DIR, cpf_name)
+                self.assert_exists_and_contains_something(path)
+                self.assert_zip_entry_exists(path, config_root)
+        else:
+            for dir_name, config_root in expected_dirs:
+                path = os.path.join(EXPORT_DIR, dir_name)
+                self.assert_exists_and_contains_something(path)
+                self.assert_exists_and_contains_something(os.path.join(path, config_root))
+    
+    def test_export_multiple_cpfs(self):
+        self._run_test_multi_export(
+            export_dir    = 'multiexport/cpfs',
+            export_format = 'cpf',
+            config_args   = '--configuration root1.confml '\
+                            '--configuration root3.confml',
+            expected_cpfs = [('root1.cpf', 'root1.confml'),
+                             ('root3.cpf', 'root3.confml')])
+    
+    def test_export_multiple_dirs(self):
+        self._run_test_multi_export(
+            export_dir    = 'multiexport/dirs',
+            export_format = 'dir',
+            config_args   = '--configuration root1.confml '\
+                            '--configuration root3.confml',
+            expected_dirs = [('root1/', 'root1.confml'),
+                             ('root3/', 'root3.confml')])
+    
+    def test_export_multiple_dirs_with_added_layers(self):
+        self._run_test_multi_export(
+            export_dir    = 'multiexport/dirs_with_added_layers',
+            export_format = 'dir',
+            config_args   = '--configuration root1.confml '\
+                            '--configuration root3.confml '\
+                            '--add new/layer1/root.confml '\
+                            '--add new/layer2/root.confml ',
+            expected_dirs = [('root1/', 'root1.confml'),
+                             ('root3/', 'root3.confml')])
+        # Check that the added layers have really been added to the exported
+        # projects
+        def check(path):
+            path = os.path.join(TEMP_DIR, 'multiexport/dirs_with_added_layers', path)
+            self.assert_exists_and_contains_something(path)
+        check('root1/new/layer1/root.confml')
+        check('root1/new/layer2/root.confml')
+        check('root3/new/layer1/root.confml')
+        check('root3/new/layer2/root.confml')
+        
+        # Check that the configuration root contains the added layers
+        file_path = os.path.join(TEMP_DIR, 'multiexport/dirs_with_added_layers/root1/root1.confml')
+        data = self.read_data_from_file(file_path)
+        self.assertTrue('href="Layer1/root.confml"' in data)
+        self.assertTrue('href="new/layer1/root.confml"' in data)
+        self.assertTrue('href="new/layer2/root.confml"' in data)
+        
+        file_path = os.path.join(TEMP_DIR, 'multiexport/dirs_with_added_layers/root3/root3.confml')
+        data = self.read_data_from_file(file_path)
+        self.assertTrue('href="Layer1/root.confml"' in data)
+        self.assertTrue('href="Layer2/root.confml"' in data)
+        self.assertTrue('href="Layer3/root.confml"' in data)
+        self.assertTrue('href="new/layer1/root.confml"' in data)
+        self.assertTrue('href="new/layer2/root.confml"' in data)
+    
+    def test_export_multiple_cpfs_with_wildcard(self):
+        self._run_test_multi_export(
+            export_dir    = 'multiexport/cpfs_wildcard',
+            export_format = 'cpf',
+            config_args   = '--config-wildcard root*.confml',
+            expected_cpfs = [('root1.cpf', 'root1.confml'),
+                             ('root2.cpf', 'root2.confml'),
+                             ('root3.cpf', 'root3.confml'),
+                             ('root4.cpf', 'root4.confml'),
+                             ('root5.cpf', 'root5.confml')])
+    
+    def test_export_multiple_cpfs_with_regex(self):
+        self._run_test_multi_export(
+            export_dir    = 'multiexport/cpfs_regex',
+            export_format = 'cpf',
+            config_args   = '--config-regex root[14].confml',
+            expected_cpfs = [('root1.cpf', 'root1.confml'),
+                             ('root4.cpf', 'root4.confml')])
+    
+
+class TestExportInvalidArgs(BaseTestCase):
+    
+    def _run_test_invalid_args(self, args, expected_msg):
+        cmd = '%s -p "%s" %s' \
+            % (get_cmd('export'), TEST_PROJECT_CPF, args)
+        # Note: The following run_command() should really expect the
+        #       return code 2, but for some reason when running from the
+        #       standalone test set, the return value is 0
+        out = self.run_command(cmd, expected_return_code = None)
+        self.assertTrue(expected_msg in out,
+                        "Expected message '%s' not in output.\nOutput:\n%s" % (expected_msg, out))
+    
+    def test_export_format_without_export_dir(self):
+        self._run_test_invalid_args(
+            '-c root1.confml --export-format cpf',
+            "error: --export-format can only be used in conjunction with --export-dir")
+    
+    def test_remote_storage_and_export_dir(self):
+        self._run_test_invalid_args(
+            '-c root1.confml --remote jojo.cpf --export-dir test/',
+            "error: --export-dir and --remote cannot be used at the same time")
+    
+    def test_unknown_export_format(self):
+        self._run_test_invalid_args(
+            '-c root1.confml --export-dir test/ --export-format foo',
+            "error: Invalid export format 'foo'")
+    
+    def test_export_dir_but_no_configurations(self):
+        self._run_test_invalid_args(
+            '--export-dir test/',
+            "error: Use of --export-dir requires at least one configuration to be specified")
+    
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_generate.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,277 @@
+# *-* coding: utf-8 *-*
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+## 
+# @author Teemu Rytkonen
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import zip_dir
+from scripttest_common import get_cmd
+
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testproject = os.path.join(ROOT_PATH,'test_project.cpf')
+rootconf = 'root3.confml'
+
+class TestGenerate(BaseTestCase):
+
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('generate')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Generate options:' in lines)
+
+    def test_generate(self):
+        self.set_modification_reference_time(testproject)
+        OUTPUT_DIR = os.path.join(ROOT_PATH, 'temp/gen1/output')
+        self.remove_if_exists(OUTPUT_DIR)
+        cmd = '%s -p "%s" -c "%s" -o "%s"' % (get_cmd('generate'),testproject,rootconf,OUTPUT_DIR)
+        out = self.run_command(cmd)
+        self.assert_exists_and_contains_something(OUTPUT_DIR)
+        
+        self.assert_not_modified(testproject)
+    
+    def test_generate_with_report(self):
+        self.set_modification_reference_time(testproject)
+        OUTPUT_DIR  = os.path.join(ROOT_PATH, 'temp/gen2/output')
+        REPORT_FILE = os.path.join(ROOT_PATH, 'temp/gen2/report.html')
+        self.remove_if_exists([OUTPUT_DIR, REPORT_FILE])
+        cmd = '%s -p "%s" -c "%s" -o "%s" -r "%s"' % (get_cmd('generate'),testproject,rootconf, OUTPUT_DIR, REPORT_FILE)
+        out = self.run_command(cmd)
+        self.assert_exists_and_contains_something(OUTPUT_DIR)
+        self.assert_exists_and_contains_something(REPORT_FILE)
+        
+        self.assert_not_modified(testproject)
+       
+    def test_generate_with_report_using_custom_template(self):
+        self._run_test_generate_with_report_using_custom_template(
+            output_dir    = 'temp/gen3/output',
+            report_file   = 'temp/gen3/report.csv',
+            template_path = 'template.csv')
+    
+    def test_generate_with_report_using_custom_template_in_relative_dir(self):
+        self._run_test_generate_with_report_using_custom_template(
+            output_dir    = 'temp/gen4/output',
+            report_file   = 'temp/gen4/report.csv',
+            template_path = 'test_template/template2.csv')
+        
+    def test_generate_with_report_using_custom_template_in_relative_dir2(self):
+        self._run_test_generate_with_report_using_custom_template(
+            output_dir    = 'temp/gen5/output',
+            report_file   = 'temp/gen5/report.csv',
+            template_path = '../tests/test_template/template2.csv')
+    
+    def test_generate_with_report_using_custom_template_in_absolute_dir(self):
+        self._run_test_generate_with_report_using_custom_template(
+            output_dir    = 'temp/gen6/output',
+            report_file   = 'temp/gen6/report.csv',
+            template_path = os.path.join(ROOT_PATH,'test_template/template2.csv'))
+    
+    def _run_test_generate_with_report_using_custom_template(self,
+        output_dir, report_file, template_path, project=testproject):
+        
+        # Since we are testing also relative paths here, we need
+        # to run the test in the same directory as the script
+        orig_workdir = os.getcwd()
+        os.chdir(ROOT_PATH)
+        try:
+            self.set_modification_reference_time(project)
+            self.remove_if_exists([output_dir, report_file])
+            cmd = '%s -p "%s" -c "%s" -o "%s" -r "%s" -t "%s"' % (get_cmd('generate'),project,rootconf, output_dir, report_file, template_path)
+            out = self.run_command(cmd)
+            self.assert_exists_and_contains_something(output_dir)
+            self.assert_exists_and_contains_something(report_file)
+            self.assert_not_modified(project)
+        finally:
+            os.chdir(orig_workdir)
+    
+    def test_generate_with_report_and_invalid_refs_in_data(self):
+        self._run_test_generate_with_report_using_custom_template(
+            project       = os.path.join(ROOT_PATH, 'testdata/generate/test_project_invalid_data_refs.zip'),
+            output_dir    = 'temp/gen7/output',
+            report_file   = 'temp/gen7/report.csv',
+            template_path = os.path.join(ROOT_PATH,'test_template/template2.csv'))
+
+class TestGenerateAllImplsOnLastLayer(BaseTestCase):
+    
+    def _prepare_workdir(self, workdir):
+        workdir = os.path.join(ROOT_PATH, workdir)
+        self.recreate_dir(workdir)
+        
+        # Any needed extra preparation can be done here
+        
+        return workdir
+    
+    def test_generate_all_impls_on_last_layer_on_file_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "generation_test_project")
+        self.assert_exists_and_contains_something(project_dir)
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll1', project_dir)
+    
+    def test_generate_all_impls_on_last_layer_on_zip_storage(self):
+        project_dir = os.path.join(ROOT_PATH, "generation_test_project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        project_zip = os.path.join(ROOT_PATH, "temp/generation_test_project.zip")
+        self.remove_if_exists(project_zip)
+        zip_dir.zip_dir(project_dir, project_zip, [zip_dir.SVN_IGNORE_PATTERN])
+        self.assert_exists_and_contains_something(project_zip)
+        
+        self._run_test_generate_all_impls_on_last_layer('temp/gen_ll2', project_zip)
+    
+    def test_generate_all_impls_on_last_layer_on_file_storage_with_report(self):
+        project_dir = os.path.join(ROOT_PATH, "generation_test_project")
+        self.assert_exists_and_contains_something(project_dir)
+        
+        # Create a temp workdir and go there to run the test
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir('temp/gen_ll3')
+        os.chdir(workdir)
+        
+        try:
+            cmd = '%s -p "%s" --output output --layer -1 --add-setting-file imaker_variantdir.cfg --report report.html' % (get_cmd('generate'), project_dir)
+            self.run_command(cmd)
+        finally:
+            os.chdir(orig_workdir)
+        
+        ACTUAL_REPORT = os.path.join(ROOT_PATH, 'temp/gen_ll3/report.html')
+        EXPECTED_REPORT = os.path.join(ROOT_PATH, "testdata/generate/expected_report.html")
+        
+        ignores = [
+            r'<tr>\s*<td>Report generated</td>\s*<td>.*</td>\s*</tr>',
+            r'<tr>\s*<td>Generation duration</td>\s*<td>.*</td>\s*</tr>',
+            r'<a href=".*">',
+            r'<tr>\s*<td align="left">Project</td>\s*<td align="left">.*</td>\s*</tr>',
+            r'<tr>\s*<td align="left">Working directory</td>\s*<td align="left">.*</td>\s*</tr>',
+        ]
+        
+        self.assert_file_contents_equal(ACTUAL_REPORT, EXPECTED_REPORT, ignores)
+    
+    def _run_test_generate_all_impls_on_last_layer(self, workdir, project):
+        # Create a temp workdir and go there to run the test
+        orig_workdir = os.getcwd()
+        workdir = self._prepare_workdir(workdir)
+        os.chdir(workdir)
+        
+        try:
+            cmd = '%s -p "%s" --output output --layer -1 --add-setting-file imaker_variantdir.cfg' % (get_cmd('generate'), project)
+            print self.run_command(cmd)
+            
+            EXPECTED_DIR = os.path.join(ROOT_PATH, "testdata/generate/expected")
+            self.assert_dir_contents_equal('output', EXPECTED_DIR, ['.svn'])
+            
+            # Check that output has also been generated to the overridden output root directory
+            self.assert_exists_and_contains_something('overridden_output/output_rootdir_test.txt')
+            self.assert_exists_and_contains_something('overridden_output/test_subdir/output_rootdir_test.txt')
+        finally:
+            os.chdir(orig_workdir)
+
+class TestGenerationImplFilteringByTags(BaseTestCase):
+    
+    def test_no_tag_filtering(self):
+        self._run_tag_filtering_test(
+            name     = 'no_filter',
+            filter   = '',
+            expected = ['none', 't1', 't2', 't3', 't1_t2', 't2_t3', 't1_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1(self):
+        self._run_tag_filtering_test(
+            name     = 't1',
+            filter   = '--impl-tag target:t1',
+            expected = ['t1', 't1_t2', 't1_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t2(self):    
+        self._run_tag_filtering_test(
+            name     = 't2',
+            filter   = '--impl-tag target:t2',
+            expected = ['t2', 't1_t2', 't2_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't3',
+            filter   = '--impl-tag target:t3',
+            expected = ['t3', 't1_t3', 't2_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1_or_t2(self):
+        self._run_tag_filtering_test(
+            name     = 't1_or_t2',
+            filter   = '--impl-tag target:t1 --impl-tag target:t2',
+            expected = ['t1', 't2', 't1_t2', 't2_t3', 't1_t3', 't1_t2_t3'])
+
+    def test_filter_by_t2_or_t3(self):        
+        self._run_tag_filtering_test(
+            name     = 't2_or_t3',
+            filter   = '--impl-tag target:t2 --impl-tag target:t3',
+            expected = ['t2', 't3', 't1_t2', 't2_t3', 't1_t3', 't1_t2_t3'])
+        
+    def test_filter_by_t1_or_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't1_or_t3',
+            filter   = '--impl-tag target:t1 --impl-tag target:t3',
+            expected = ['t1', 't3', 't1_t2', 't2_t3', 't1_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1_or_t2_or_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't1_or_t2_or_t3',
+            filter   = '--impl-tag target:t1 --impl-tag target:t2 --impl-tag target:t3',
+            expected = ['t1', 't2', 't3', 't1_t2', 't2_t3', 't1_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1_and_t2(self):
+        self._run_tag_filtering_test(
+            name     = 't1_and_t2',
+            filter   = '--impl-tag target:t1 --impl-tag target:t2 --impl-tag-policy=AND',
+            expected = ['t1_t2', 't1_t2_t3'])
+    
+    def test_filter_by_t2_and_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't2_and_t3',
+            filter   = '--impl-tag target:t2 --impl-tag target:t3 --impl-tag-policy=AND',
+            expected = ['t2_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1_and_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't1_and_t3',
+            filter   = '--impl-tag target:t1 --impl-tag target:t3 --impl-tag-policy=AND',
+            expected = ['t1_t3', 't1_t2_t3'])
+    
+    def test_filter_by_t1_and_t2_and_t3(self):
+        self._run_tag_filtering_test(
+            name     = 't1_and_t2_and_t3',
+            filter   = '--impl-tag target:t1 --impl-tag target:t2 --impl-tag target:t3 --impl-tag-policy=AND',
+            expected = ['t1_t2_t3'])
+    
+    def _run_tag_filtering_test(self, name, filter, expected):
+        PROJECT = os.path.join(ROOT_PATH, 'tag_filtering_test_project')
+        
+        OUTPUT_ROOT = os.path.join(ROOT_PATH, 'temp/gen_tf/', name)
+        OUTPUT      = os.path.join(OUTPUT_ROOT, 'out')
+        LOG         = os.path.join(OUTPUT_ROOT, 'cone.log')
+        self.remove_if_exists(OUTPUT)
+        
+        cmd = '%s -p "%s" --output "%s" --log-file="%s" %s' % (get_cmd('generate'), PROJECT, OUTPUT, LOG, filter)
+        self.run_command(cmd)
+        
+        self.assert_exists_and_contains_something(OUTPUT)
+        
+        expected_files = sorted([x + '.txt' for x in expected])
+        actual_files = sorted(os.listdir(OUTPUT))
+        
+        self.assertEquals(expected_files, actual_files)
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_info.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,228 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys
+import os
+import subprocess
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from scripttest_common import get_cmd
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+testproject = os.path.join(ROOT_PATH,'test_project.cpf')
+temp_dir    = os.path.join(ROOT_PATH, 'temp/info')
+VALUE_REPORT_PROJECT = os.path.join(ROOT_PATH, 'testdata/info/value_report_project')
+
+class TestInfo(BaseTestCase):
+    
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('info')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Info options:' in lines)
+    
+
+    def test_get_project_info(self):
+        self.set_modification_reference_time(testproject)
+        cmd = '%s -p "%s"' % (get_cmd('info'), testproject)
+        out = self.run_command(cmd)
+        
+        lines = out.split('\r\n')
+        self.assertTrue('Configurations in the project.' in lines)
+        self.assertTrue('root1.confml' in lines)
+        self.assertTrue('root2.confml' in lines)
+        self.assertTrue('root3.confml' in lines)
+        self.assertTrue('root4.confml' in lines)
+        self.assertTrue('root5.confml' in lines)
+        
+        self.assert_not_modified(testproject)
+    
+    def test_api_report(self):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/api_report.html')
+        REPORT_FILE = os.path.join(temp_dir, 'api_report.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" -c root3.confml --report-type api --report "%s"' % (get_cmd('info'), testproject, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        # Ignore the file links, because their value depends on the current directory
+        ignores= [r'<td><a href="file://.*">.*</a></td>']
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE, ignores)
+    
+    def test_impl_report(self):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/impl_report.html')
+        REPORT_FILE = os.path.join(temp_dir, 'impl_report.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" -c root3.confml --report-type impl --report "%s"' % (get_cmd('info'), testproject, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def test_impl_report_with_impl_containers(self):
+        PROJECT = os.path.join(ROOT_PATH, 'generation_test_project')
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/impl_report_with_containers.html')
+        REPORT_FILE = os.path.join(temp_dir, 'impl_report_with_containers.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" -c root.confml --report-type impl --report "%s"' % (get_cmd('info'), PROJECT, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def test_content_report(self):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/content_report.html')
+        REPORT_FILE = os.path.join(temp_dir, 'content_report.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" -c root5.confml --report-type content --report "%s"' % (get_cmd('info'), testproject, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    # --------------------------------------------------
+    # Tests for invalid configuration argument detection
+    # --------------------------------------------------
+    
+    def _run_test_invalid_configuration_args(self, config_args, expected_msg):
+        REPORT_FILE = os.path.join(temp_dir, "dummy_report.html")
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" %s --report "%s"' \
+            % (get_cmd('info'), VALUE_REPORT_PROJECT, config_args, REPORT_FILE)
+        # Note: The following run_command() should really expect the
+        #       return code 2, but for some reason when running from the
+        #       standalone test set, the return value is 0
+        out = self.run_command(cmd, expected_return_code = None)
+        self.assertFalse(os.path.exists(REPORT_FILE))
+        
+        self.assertTrue(expected_msg in out,
+                        "Expected message '%s' not in output ('%s')" % (expected_msg, out))
+    
+    def test_invalid_single_configuration(self):
+        self._run_test_invalid_configuration_args(
+            '--configuration nonexistent_root.confml',
+            "No such configuration: nonexistent_root.confml")
+        
+    def test_invalid_multi_configuration(self):
+        self._run_test_invalid_configuration_args(
+            '--configuration product_root.confml --configuration nonexistent_root.confml',
+            "No such configuration: nonexistent_root.confml")
+    
+    def test_invalid_wildcard_configuration(self):
+        self._run_test_invalid_configuration_args(
+            '--config-wildcard nonexistent*.confml',
+            "No matching configurations for wildcard(s) and/or pattern(s).")
+    
+    def test_invalid_regex_configuration(self):
+        self._run_test_invalid_configuration_args(
+            '--config-regex nonexistent.*\\.confml',
+            "No matching configurations for wildcard(s) and/or pattern(s).")
+    
+    def test_invalid_view_file(self):
+        self._run_test_invalid_configuration_args(
+            '-c product_root.confml --view-file nonexistent.confml',
+            "No such file: nonexistent.confml")
+    
+    
+    # ----------------------
+    # Tests for value report
+    # ----------------------
+    
+    def _run_test_value_report(self, output, expected, args, rep_type='value'):
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/%s' % expected)
+        REPORT_FILE = os.path.join(temp_dir, output)
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" %s --report-type %s --report "%s"' \
+            % (get_cmd('info'), VALUE_REPORT_PROJECT, args, rep_type, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def test_value_report_configs_with_wildcard(self):
+        self._run_test_value_report(
+            output   = 'value_report_langpacks_wildcard.html',
+            expected = 'value_report_langpacks.html',
+            args     = '--config-wildcard product_langpack_*_root.confml')
+    
+    def test_value_report_configs_with_regex(self):
+        self._run_test_value_report(
+            output   = 'value_report_langpacks_regex.html',
+            expected = 'value_report_langpacks.html',
+            args     = '--config-regex product_langpack_\\d{2}_root.confml')
+    
+    def test_value_report_multi_config(self):
+        self._run_test_value_report(
+            output   = 'value_report_langpacks_regex.html',
+            expected = 'value_report_langpacks.html',
+            args     = '-c product_langpack_01_root.confml '\
+                       '-c product_langpack_02_root.confml '\
+                       '-c product_langpack_03_root.confml')
+    
+    def test_value_report_single_config(self):
+        self._run_test_value_report(
+            output   = 'value_report_single.html',
+            expected = 'value_report_single.html',
+            args     = '--configuration product_root.confml')
+    
+    def test_value_report_multi_config_mixed_args(self):
+        self._run_test_value_report(
+            output   = 'value_report_multi_mixed.html',
+            expected = 'value_report_multi_mixed.html',
+            args     = '-c product_root.confml --config-wildcard product_langpack_*_root.confml')
+    
+    def test_value_report_single_config_with_view(self):
+        VIEW_FILE = os.path.join(ROOT_PATH, 'testdata/info/test_view.confml')
+        self._run_test_value_report(
+            output   = 'value_report_single_with_view.html',
+            expected = 'value_report_single_with_view.html',
+            args     = '--configuration product_root.confml --view-file "%s"' % VIEW_FILE)
+    
+    def test_value_report_single_config_with_included_view(self):
+        VIEW_FILE = os.path.join(ROOT_PATH, 'testdata/info/include_test_view.confml')
+        self._run_test_value_report(
+            output   = 'value_report_single_with_included_view.html',
+            expected = 'value_report_single_with_view.html',
+            args     = '--configuration product_root.confml --view-file "%s"' % VIEW_FILE)
+    
+    def test_value_report_csv(self):
+        self._run_test_value_report(
+            output   = 'value_report.csv',
+            expected = 'value_report.csv',
+            args     = '--config-wildcard product_langpack_*_root.confml',
+            rep_type = 'value_csv')
+    
+    def test_value_report_csv_with_special_chars(self):
+        self._run_test_value_report(
+            output   = 'value_report_special_chars.csv',
+            expected = 'value_report_special_chars.csv',
+            args     = '--configuration csv_test_root.confml',
+            rep_type = 'value_csv')
+    
+    def test_value_report_custom_template(self):
+        TEMPLATE_FILE = os.path.join(ROOT_PATH, 'testdata/info/custom_value_report_template.html')
+        EXPECTED_FILE = os.path.join(ROOT_PATH, 'testdata/info/expected/value_report_custom.html')
+        REPORT_FILE = os.path.join(temp_dir, 'value_report_custom.html')
+        self.remove_if_exists(REPORT_FILE)
+        cmd = '%s -p "%s" --template "%s" --report "%s" -c product_root.confml' \
+            % (get_cmd('info'), VALUE_REPORT_PROJECT, TEMPLATE_FILE, REPORT_FILE)
+        out = self.run_command(cmd)
+        
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_merge.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,375 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import os
+import shutil
+import zipfile
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import unzip_file
+from scripttest_common import get_cmd
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+TESTDATA_DIR = os.path.join(ROOT_PATH, 'testdata/merge')
+TEMP_DIR = os.path.join(ROOT_PATH, 'temp/merge')
+TEST_PROJECT_CPF = os.path.join(ROOT_PATH, 'test_project.cpf')
+TEST_VARIANT_CPF = os.path.join(ROOT_PATH, 'test_variant.cpf')
+
+TEST_VARIANT_CPF_V1 = os.path.join(TESTDATA_DIR, 'test_variant_v1.cpf')
+TEST_VARIANT_CPF_V2 = os.path.join(TESTDATA_DIR, 'test_variant_v2.cpf')
+
+
+class TestMerge(BaseTestCase):
+    
+    def _prepare_workdir_with_project(self, workdir, expected_zip=None):
+        """
+        Prepare a working directory for running a test.
+        @param workdir: Sub-directory of the workdir.
+        @param expected_zip: Zip file containing expected data that should
+            be extracted under the workdir, can be None. The path should be
+            relative to testdata/merge.
+        @return: Tuple (test_project_abs, expected_dir_abs). expected_dir_abs
+            will be None if expected_zip was None.
+        """
+        workdir = os.path.join(TEMP_DIR, workdir)
+        self.recreate_dir(workdir)
+        
+        # Unzip the test project
+        test_project_dir = os.path.join(workdir, 'test_project')
+        unzip_file.unzip_file(TEST_PROJECT_CPF, test_project_dir, delete_if_exists=True)
+        
+        # Check that it was unzipped correctly
+        paths = [
+            "Layer1/", "Layer2/","Layer3/", "Layer4/", "Layer5/",
+            "root1.confml", "root2.confml", "root3.confml", "root4.confml", "root5.confml"
+        ]
+        for path in paths:
+            self.assert_exists_and_contains_something(os.path.join(test_project_dir, path))
+        
+        expected_dir = None
+        # Unzip the expected data
+        if expected_zip:
+            expected_zip = os.path.join(TESTDATA_DIR, expected_zip)
+            expected_dir = os.path.join(workdir, 'expected')
+            unzip_file.unzip_file(expected_zip, expected_dir)
+        
+        return test_project_dir, expected_dir
+    
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('merge')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Merge options:' in lines)
+
+    def test_merge_cpf_last_layer_to_project(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('last_layer_from_cpf', 'last_layer_expected.zip')
+        
+        self.set_modification_reference_time(project_dir)
+        self.set_modification_reference_time(TEST_VARIANT_CPF)
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1 -v 5'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF)
+        self.run_command(cmd)
+        
+        self.assert_modified(project_dir)
+        self.assert_not_modified(TEST_VARIANT_CPF)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+    
+    def test_merge_cpf_last_layer_to_project_with_rename(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('last_layer_from_cpf_rename', 'last_layer_rename_expected.zip')
+        
+        self.set_modification_reference_time(project_dir)
+        self.set_modification_reference_time(TEST_VARIANT_CPF)
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1 -v 5 --rename'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF)
+        self.run_command(cmd)
+        
+        self.assert_modified(project_dir)
+        self.assert_not_modified(TEST_VARIANT_CPF)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+    
+    def test_merge_cpf_multiple_last_layers_to_project(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('multiple_last_layers_from_cpf', 'multiple_last_layers_expected.zip')
+        
+        self.set_modification_reference_time(project_dir)
+        self.set_modification_reference_time(TEST_VARIANT_CPF)
+        # Pass the merged layers in random order to check that it doesn't affect
+        # the output
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -3 -l -1 -l -2 -v 5'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF)
+        self.run_command(cmd)
+        
+        self.assert_modified(project_dir)
+        self.assert_not_modified(TEST_VARIANT_CPF)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+        
+    def test_merge_cpf_multiple_mixed_layers_to_project(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('mixed_multiple_last_layers_from_cpf', 'multiple_last_layers_expected.zip')
+        
+        self.set_modification_reference_time(project_dir)
+        self.set_modification_reference_time(TEST_VARIANT_CPF)
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -3 -l -1 -l 4 -l 5 -v 5'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF)
+        self.run_command(cmd)
+        
+        self.assert_modified(project_dir)
+        self.assert_not_modified(TEST_VARIANT_CPF)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+                
+    def test_merge_layer_to_cpf(self):
+        project_cpf = os.path.join(ROOT_PATH, "temp/merge/layer_to_cpf/project.cpf")
+        self.create_dir_for_file_path(project_cpf)
+        shutil.copy2(TEST_PROJECT_CPF, project_cpf)
+        
+        self.set_modification_reference_time(project_cpf)
+        self.set_modification_reference_time(TEST_VARIANT_CPF)
+        
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1 -v 5'  % (get_cmd('merge'), project_cpf, TEST_VARIANT_CPF)
+        self.run_command(cmd)
+        
+        def check(entry):
+            zf = zipfile.ZipFile(project_cpf, "r")
+            try:     self.assertTrue(entry in zf.namelist(), "Entry '%s' not in zip file '%s'" % (entry, project_cpf))
+            finally: zf.close()
+        check('variant/root.confml')
+        check('variant/confml/data.confml')
+        check('variant/content/empty/')
+        
+        self.assertEquals(
+            self.get_xinclude_list(self.read_data_from_zip_file(project_cpf, "root5.confml")),
+            ["Layer1/root.confml",
+             "Layer2/root.confml",
+             "Layer3/root.confml",
+             "Layer4/root.confml",
+             "Layer5/root.confml",
+             "variant/root.confml"])
+        
+        self.assert_modified(project_cpf)
+        self.assert_not_modified(TEST_VARIANT_CPF)
+    
+    def test_merge_cpf_last_layer_two_versions(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('last_layer_two_versions', 'last_layer_variant_v1_v2_expected.zip')
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF_V1)
+        self.run_command(cmd)
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF_V2)
+        self.run_command(cmd)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+    
+    def test_merge_cpf_last_layer_two_versions_overwrite_layer(self):
+        project_dir, expected_dir = self._prepare_workdir_with_project('last_layer_two_versions_overwrite', 'last_layer_variant_v2_expected.zip')
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1 --merge-policy overwrite-layer'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF_V1)
+        self.run_command(cmd)
+        cmd = '%s -p "%s" -r "%s" -c root5.confml -l -1 --merge-policy overwrite-layer'  % (get_cmd('merge'), project_dir, TEST_VARIANT_CPF_V2)
+        self.run_command(cmd)
+        self.assert_dir_contents_equal(expected_dir, project_dir)
+    
+    def get_xinclude_list(self, confml_file_data):
+        """
+        Read the XInlude element list from a ConfML file and assert that.
+        @param confml_file_data: The raw binary data of the ConfML file.
+        """
+        root_elem = ElementTree.fromstring(confml_file_data)
+        
+        # Make sure that we have a ConfML file
+        self.assertTrue(
+            root_elem.tag in ("{http://www.s60.com/xml/confml/1}configuration", "{http://www.s60.com/xml/confml/2}configuration"),
+            "The root element is not a ConfML configuration element (tag is '%s')" % root_elem.tag)
+        
+        # Read the xi:include list
+        result = []
+        for elem in root_elem.findall("{http://www.w3.org/2001/XInclude}include"):
+            result.append(elem.get("href"))
+        
+        return result
+
+# =============================================================================
+
+def run_in_workdir(workdir):
+    """
+    Decorator for running asset merge tests in a specific working directory.
+    """
+    workdir_abs = os.path.join(ROOT_PATH, 'temp/merge/assetmerge', workdir)
+    
+    def decorate(testmethod):
+        def run_test(self):
+            assert isinstance(self, TestAssetMerge)
+            
+            # Prepare the working directory
+            workdir = self.prepare_workdir(workdir_abs)
+            
+            # Go into the working directory to run the test
+            orig_workdir = os.getcwd()
+            os.chdir(workdir)
+            try:
+                # Run the test
+                testmethod(self)
+            finally:
+                # Revert back to the original working directory
+                os.chdir(orig_workdir)
+        return run_test
+    
+    return decorate
+
+class TestAssetMerge(BaseTestCase):
+    """
+    Tests for merging an asset (basically a single configuration layer) into
+    a specific layer in an existing project.
+    """
+    TESTDATA_ZIP = os.path.join(ROOT_PATH, 'testdata/merge/assetmerge/data.zip')
+    EXPECTED_ZIP = os.path.join(ROOT_PATH, 'testdata/merge/assetmerge/expected.zip')
+    
+    def prepare_workdir(self, workdir):
+        """
+        Prepare a working directory with all needed test data into
+        the given sub-dir under the temporary directory.
+        @param workdir: Absolute path to the working directory.
+        """
+        assert os.path.isabs(workdir)
+        
+        # Remove the working directory
+        self.remove_if_exists(workdir)
+        
+        # Extract asset merge test data into the working dir
+        unzip_file.unzip_file(self.TESTDATA_ZIP, workdir)
+        
+        # Extract expected data
+        unzip_file.unzip_file(self.EXPECTED_ZIP, os.path.join(workdir, 'expected'))
+        
+        return workdir
+    
+    def assert_is_expected(self, subdir):
+        """
+        Assert that the current main_project is equal to the expected data.
+        """
+        current_dir = os.path.abspath('main_project')
+        expected_dir = os.path.abspath(os.path.join('expected', subdir))
+        self.assert_exists_and_contains_something(expected_dir)
+        self.assert_dir_contents_equal(current_dir, expected_dir, ['.svn', '.metadata'])
+    
+    @run_in_workdir('merge_asset1')
+    def test_merge_asset1(self):
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('asset1_merged')
+    
+    @run_in_workdir('merge_and_update_asset1')
+    def test_merge_and_update_asset1(self):
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('asset1_merged')
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v2 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('asset1_merged_and_updated')
+    
+    @run_in_workdir('merge_both')
+    def test_merge_both(self):
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset2_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('both_merged')
+    
+    @run_in_workdir('merge_both_and_update')
+    def test_merge_both_and_update(self):
+        
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset2_v1 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('both_merged')
+        
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset1_v2 --sourcelayer root.confml' % get_cmd('merge'))
+        self.run_command('%s -p main_project --targetlayer assets/test/root.confml -r asset2_v2 --sourcelayer root.confml' % get_cmd('merge'))
+        self.assert_is_expected('both_merged_and_updated')
+
+class TestMergeInvalidParameters(BaseTestCase):
+    
+    def _run_test(self, args, expected_msg):
+        if not isinstance(args, basestring):
+            args = ' '.join(args)
+        
+        cmd = get_cmd('merge') + ' ' + args
+        # Note: The following run_command() should really expect the
+        #       return code 2, but for some reason when running from the
+        #       standalone test set, the return value is 0 for some cases
+        #       (specifically, the ones that don't use parser.error() to
+        #       exit the program)
+        out = self.run_command(cmd, expected_return_code = None)
+        
+        self.assertTrue(expected_msg in out,
+                        "Expected message '%s' not in output ('%s')" % (expected_msg, out))
+    
+    def test_no_remote(self):
+        self._run_test('', "Remote project must be given")
+    
+    def test_source_root_and_target_layer(self):
+        self._run_test(
+           "-p x --targetlayer t.confml -r y --sourceconfiguration s.confml",
+           "Cannot merge a configuration into a layer!")
+    
+    def test_source_layer_and_target_root(self):
+        self._run_test(
+           "-p x --configuration t.confml -r y --sourcelayer s.confml",
+           "Merging a layer into a configuration is not supported at the moment!")
+    
+    def test_source_layer_and_layer_indices(self):
+        self._run_test(
+            ["-p x --configuration t.confml",
+             "-r y --sourcelayer s.confml",
+             "--layer -1 --layer -2"],
+            "Specifying layer indices using --layer is not supported when using --sourcelayer or --targetlayer!")
+    
+    def test_target_layer_and_layer_indices(self):
+        self._run_test(
+            ["-p x --targetlayer t.confml",
+             "-r y --sourceconfiguration s.confml",
+             "--layer -1 --layer -2"],
+            "Specifying layer indices using --layer is not supported when using --sourcelayer or --targetlayer!")
+    
+    def test_invalid_source_layer(self):
+        source_dir = os.path.join(TEMP_DIR, 'invalid_source_layer/source_proj')
+        target_dir = os.path.join(TEMP_DIR, 'invalid_source_layer/target_proj')
+        self.recreate_dir(source_dir)
+        self.recreate_dir(target_dir)
+        self._run_test('-p "%s" --targetlayer foo/root.confml -r "%s" --sourcelayer foo/bar/root.confml' % (source_dir, target_dir),
+                       "Could not merge: Layer root 'foo/bar/root.confml' not found in source project")
+    
+    def test_invalid_source_config(self):
+        source_dir = os.path.join(TEMP_DIR, 'invalid_source_root/source_proj')
+        target_dir = os.path.join(TEMP_DIR, 'invalid_source_root/target_proj')
+        self.recreate_dir(source_dir)
+        self.recreate_dir(target_dir)
+        self._run_test('-p "%s" -c foo_root.confml -r "%s" --sourceconfiguration foobar_root.confml' % (source_dir, target_dir),
+                       "Could not merge: Configuration root 'foobar_root.confml' not found in source project")
+    
+    def test_invalid_merge_policy(self):
+        self._run_test('-p x -r y --merge-policy foopolicy',
+                       "Invalid merge policy: foopolicy")
+    
+    def test_invalid_source_layer_root(self):
+        self._run_test('-p x -r y --sourcelayer foobar --targetlayer test/foo.confml',
+                       "Source layer root should be a .confml file")
+    
+    def test_invalid_target_layer_root(self):
+        self._run_test('-p x -r y --sourcelayer test/foo.confml --targetlayer foobar',
+                       "Target layer root should be a .confml file")
+
+if __name__ == '__main__':
+    unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_report.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,107 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, shutil, unittest
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import zip_dir
+from scripttest_common import get_cmd
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+TEMP_DIR     = os.path.normpath(os.path.join(ROOT_PATH, 'temp/report'))
+TESTDATA_DIR = os.path.normpath(os.path.join(ROOT_PATH, 'testdata/report'))
+TEST_PROJECT = os.path.normpath(os.path.join(TESTDATA_DIR, 'project'))
+
+
+class TestReport(BaseTestCase):
+
+    def _test_get_help(self):
+        cmd = '%s -h' % get_cmd('report')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Report options:' in lines)
+    
+    def test_generate_data_files_and_create_reports(self):
+        TEST_DIR = 'test1/'
+        
+        _, datafile_rofs3 = self.generate(TEST_DIR + 'out-rofs3',   TEST_DIR + 'repdata/rofs3.dat', 'rofs3')
+        _, datafile_uda   = self.generate(TEST_DIR + 'out-uda',     TEST_DIR + 'repdata/uda.dat',   'uda')
+        
+        REPORTS_DIR = os.path.join(TEMP_DIR, TEST_DIR + 'reports')
+        self.create_report([datafile_rofs3],                os.path.join(REPORTS_DIR, 'rofs3.txt'))
+        self.create_report([datafile_uda],                  os.path.join(REPORTS_DIR, 'uda.txt'))
+        self.create_report([datafile_rofs3, datafile_uda],  os.path.join(REPORTS_DIR, 'both.txt'))
+
+        EXPECTED_DIR = os.path.join(TESTDATA_DIR, 'expected')
+        self.assert_dir_contents_equal(EXPECTED_DIR, REPORTS_DIR, ['.svn'])
+        
+        # Create by giving the directory as input and check
+        REPORT_FILE = os.path.join(TEMP_DIR, TEST_DIR, 'both_from_dir.txt')
+        EXPECTED_FILE = os.path.join(EXPECTED_DIR, 'both.txt')
+        self.create_report_from_dir(os.path.join(TEMP_DIR, TEST_DIR, 'repdata'), REPORT_FILE)
+        self.assert_file_contents_equal(EXPECTED_FILE, REPORT_FILE)
+    
+    def generate(self, output_dir, report_data_file, target_tag):
+        """
+        Generate output into the given output directory and report data file.
+        @return: Tuple containing the absolute paths to the output directory
+            and report data file.
+        """
+        OUTPUT_DIR = os.path.join(TEMP_DIR, output_dir)
+        REPORT_DATA_FILE = os.path.join(TEMP_DIR, report_data_file)
+        self.remove_if_exists(OUTPUT_DIR)
+        
+        cmd = '%s -p "%s" -o "%s" --report-data-output "%s" --impl-tag target:%s' \
+            % (get_cmd('generate'), TEST_PROJECT, OUTPUT_DIR, REPORT_DATA_FILE, target_tag)
+        self.run_command(cmd)
+        self.assert_exists_and_contains_something(OUTPUT_DIR)
+        self.assert_exists_and_contains_something(REPORT_DATA_FILE)
+        
+        return OUTPUT_DIR, REPORT_DATA_FILE
+    
+    def create_report(self, report_data_files, report_file):
+        """
+        Create a report based on a number of input data files.
+        @return: Absolute path to the created report.
+        """
+        TEMPLATE_FILE = os.path.join(TESTDATA_DIR, 'template.txt')
+        REPORT_FILE = os.path.join(TEMP_DIR, report_file)
+        self.remove_if_exists(REPORT_FILE)
+        
+        cmd = '%s --report "%s" --template "%s" ' % (get_cmd('report'), REPORT_FILE, TEMPLATE_FILE)
+        cmd += ' '.join(['--input-data "%s"' % f for f in report_data_files])
+        self.run_command(cmd)
+        self.assert_exists_and_contains_something(REPORT_FILE)
+        return REPORT_FILE
+    
+    def create_report_from_dir(self, report_data_dir, report_file):
+        """
+        Create a report based on an input data directory.
+        @return: Absolute path to the created report.
+        """
+        TEMPLATE_FILE = os.path.join(TESTDATA_DIR, 'template.txt')
+        REPORT_FILE = os.path.join(TEMP_DIR, report_file)
+        self.remove_if_exists(REPORT_FILE)
+        
+        cmd = '%s --report "%s" --template "%s" --input-data-dir "%s"' \
+            % (get_cmd('report'), REPORT_FILE, TEMPLATE_FILE, report_data_dir)
+        self.run_command(cmd)
+        self.assert_exists_and_contains_something(REPORT_FILE)
+        return REPORT_FILE
+
+if __name__ == '__main__':
+      unittest.main()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/scripts/tests/unittest_update.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,298 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+"""
+Test the configuration
+"""
+import unittest
+import string
+import sys
+import os
+import subprocess
+import shutil
+import __init__
+from testautomation.base_testcase import BaseTestCase
+from testautomation import unzip_file
+from scripttest_common import get_cmd
+from cone.public import api
+
+try:
+    from cElementTree import ElementTree
+except ImportError:
+    try:    
+        from elementtree import ElementTree
+    except ImportError:
+        try:
+            from xml.etree import cElementTree as ElementTree
+        except ImportError:
+            from xml.etree import ElementTree
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+TEMP_DIR  = os.path.join(ROOT_PATH, 'temp/update')
+TEST_PROJECT_CPF = os.path.join(ROOT_PATH, 'test_project.cpf')
+
+class TestUpdate(BaseTestCase):
+
+    def test_get_help(self):
+        cmd = '%s -h' % get_cmd('update')
+        out = self.run_command(cmd)
+        lines = out.split('\r\n')
+        self.assertTrue('Options:' in lines)
+        self.assertTrue('  Update options:' in lines)
+
+    def test_add_and_remove_meta_in_filesystem_project(self):
+        TEST_PROJECT_DIR = os.path.join(ROOT_PATH, 'temp/update/project')
+        unzip_file.unzip_file(TEST_PROJECT_CPF, TEST_PROJECT_DIR, delete_if_exists=True)
+        
+        rootfile = os.path.join(TEST_PROJECT_DIR, "root5.confml")
+        self._run_test_add_and_remove_meta_in_project(
+            project          = TEST_PROJECT_DIR,
+            root_file_reader = lambda: self.read_data_from_file(rootfile))
+
+    def test_add_and_remove_meta_in_cpf(self):
+        cpf = os.path.join(ROOT_PATH, "temp/metadata/project.cpf")
+        self.remove_if_exists(cpf)
+        self.create_dir_for_file_path(cpf)
+        shutil.copy2(TEST_PROJECT_CPF, cpf)
+        
+        self._run_test_add_and_remove_meta_in_project(
+            project          = cpf,
+            root_file_reader = lambda: self.read_data_from_zip_file(cpf, "root5.confml"))
+    
+    def _run_test_add_and_remove_meta_in_project(self, project, root_file_reader):
+        """
+        Run test for adding and removing metadata in a project.
+        
+        @param project: Path to the project that is being modified.
+        @param root_file_reader: Function that will be called to read the raw binary
+            data of the configuration project's root ConfML file.
+        """
+        # -------------------------------------
+        # Step 1: Add metadata and description
+        # -------------------------------------
+        self.set_modification_reference_time(project)
+        cmd = ('%s '\
+            '--project "%s" --configuration root5.confml '\
+            '--add-meta owner="test person" '\
+            '--add-meta product="test product" '\
+            '--add-meta date="2009-05-11" '\
+            '--add-cpf-meta product_type="XYZ-123" '\
+            '--add-cpf-meta platform="Platform X" '\
+            '--add-cpf-meta platform_version="1.0.0" '\
+            '--add-desc "Testing description"') % (get_cmd('update'), project)
+        out = self.run_command(cmd)
+        #print out
+        self.assert_modified(project)
+        
+        
+        # Check that the metadata is correct
+        root_elem = ElementTree.fromstring(root_file_reader())
+        
+        desc_elem = root_elem.find("{http://www.s60.com/xml/confml/2}desc")
+        self.assertEquals(desc_elem.text, "Testing description")
+        
+        meta_elem = root_elem.find("{http://www.s60.com/xml/confml/2}meta")
+        self.assertEquals(self._get_meta_entry(meta_elem, 'owner'), 'test person')
+        self.assertEquals(self._get_meta_entry(meta_elem, 'product'), 'test product')
+        self.assertEquals(self._get_meta_entry(meta_elem, 'date'), '2009-05-11')
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'product_type'), 'XYZ-123')
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'platform'), 'Platform X')
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'platform_version'), '1.0.0')
+        
+        
+        # -----------------------------------------------
+        # Step 2: Remove and modify some of the metadata
+        # -----------------------------------------------
+        self.set_modification_reference_time(project)
+        cmd = ('%s '\
+            '--project "%s" --configuration root5.confml '\
+            '--add-meta product="Prod-1" '\
+            '--remove-meta date '\
+            '--add-cpf-meta platform_version=1.0.1 '\
+            '--remove-meta product_type ') % (get_cmd('update'), project)
+        out = self.run_command(cmd)
+        #print out
+        self.assert_modified(project)
+        
+        # Check that the metadata is correct
+        root_elem = ElementTree.fromstring(root_file_reader())
+        
+        desc_elem = root_elem.find("{http://www.s60.com/xml/confml/2}desc")
+        self.assertEquals(desc_elem.text, "Testing description")
+        
+        meta_elem = root_elem.find("{http://www.s60.com/xml/confml/2}meta")
+        self.assertEquals(self._get_meta_entry(meta_elem, 'owner'), 'test person')
+        self.assertEquals(self._get_meta_entry(meta_elem, 'product'), 'Prod-1')
+        self.assertEquals(self._get_meta_entry(meta_elem, 'date'), None)
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'product_type'), None)
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'platform'), 'Platform X')
+        self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'platform_version'), '1.0.1')
+        
+        
+        # ------------------------------------------------------------
+        # Step 3: Remove the description and the rest of the metadata
+        # ------------------------------------------------------------
+        self.set_modification_reference_time(project)
+        cmd = ('%s '\
+            '--project "%s" --configuration root5.confml '\
+            '--remove-meta owner '\
+            '--remove-meta product '\
+            '--remove-meta platform '\
+            '--remove-meta platform_version '\
+            '--remove-desc ') % (get_cmd('update'), project)
+        out = self.run_command(cmd)
+        #print out
+        self.assert_modified(project)
+        
+        
+        # Check that the metadata is correct
+        root_elem = ElementTree.fromstring(root_file_reader())
+        
+        desc_elem = root_elem.find("{http://www.s60.com/xml/confml/2}desc")
+        self.assertEquals(desc_elem, None)
+        
+        meta_elem = root_elem.find("{http://www.s60.com/xml/confml/2}meta")
+        self.assertEquals(0, len(meta_elem.getchildren()))
+
+    
+    def _get_meta_entry(self, meta_elem, entry_name):
+        elem =  meta_elem.find("{http://www.s60.com/xml/confml/2}%s" % entry_name)
+        if elem != None:    return elem.text
+        else:               return None
+    
+    def _get_cpf_meta_entry(self, meta_elem, entry_name):
+        elem = None
+        for e in meta_elem.findall("{http://www.nokia.com/xml/cpf-id/1}configuration-property"):
+            if e.get('name') == entry_name:
+                elem = e
+                break
+        
+        if elem != None:    return elem.get('value')
+        else:               return None
+    
+    def test_add_data_to_cpf(self):
+        # Copy from the test data
+        cpf = os.path.join(ROOT_PATH, "temp/metadata/add_data_test_project.cpf")
+        self.remove_if_exists(cpf)
+        self.create_dir_for_file_path(cpf)
+        shutil.copy2(TEST_PROJECT_CPF, cpf)
+        
+        CONFIG = 'root3.confml'
+        
+        def get_setting_value(project_location, ref):
+            prj = api.Project(api.Storage.open(project_location, 'r'))
+            try:
+                config = prj.get_configuration(CONFIG)
+                dview = config.get_default_view()
+                feature = dview.get_feature(ref)
+                return feature.get_value()
+            finally:
+                prj.close()
+        
+        self.assertEquals(get_setting_value(cpf, 'Feature1.BooleanSetting'), False)
+        
+        self.set_modification_reference_time(cpf)
+        cmd = '%s -p "%s" -c %s --add-data Feature1.BooleanSetting=true' % (get_cmd('update'), cpf, CONFIG)
+        self.run_command(cmd)
+        self.assert_modified(cpf)
+        
+        self.assertEquals(get_setting_value(cpf, 'Feature1.BooleanSetting'), True)
+    
+    def _run_test_add_meta_to_multiple_roots_in_filesystem_project(self, project, args, updated_configs):
+        TEST_PROJECT_DIR = os.path.join(ROOT_PATH, 'temp/update', project)
+        unzip_file.unzip_file(TEST_PROJECT_CPF, TEST_PROJECT_DIR, delete_if_exists=True)
+        self.assert_exists_and_contains_something(TEST_PROJECT_DIR)
+        
+        self.set_modification_reference_time(TEST_PROJECT_DIR)
+        cmd = ('%(cmd)s '\
+            '--project "%(project)s" %(args)s '\
+            '--add-meta owner="test person" '\
+            '--add-meta product="test product" '\
+            '--add-cpf-meta product_type="XYZ-123" '\
+            '--add-cpf-meta platform="Platform X" '\
+            '--add-desc "Testing description"')\
+            % {'cmd'    : get_cmd('update'),
+               'project': TEST_PROJECT_DIR,
+               'args'   : args}
+        out = self.run_command(cmd)
+        #print out
+        self.assert_modified(TEST_PROJECT_DIR)
+        
+        # Check that the metadata is correct for all roots
+        project = api.Project(api.Storage.open(TEST_PROJECT_DIR, 'r'))
+        for config in project.list_configurations():
+            config_file_path = os.path.join(TEST_PROJECT_DIR, config)
+            root_elem = ElementTree.fromstring(self.read_data_from_file(config_file_path))
+            
+            if config in updated_configs:
+                try:
+                    desc_elem = root_elem.find("{http://www.s60.com/xml/confml/2}desc")
+                    self.assertNotEquals(desc_elem, None)
+                    self.assertEquals(desc_elem.text, "Testing description")
+                    
+                    meta_elem = root_elem.find("{http://www.s60.com/xml/confml/2}meta")
+                    self.assertEquals(self._get_meta_entry(meta_elem, 'owner'), 'test person')
+                    self.assertEquals(self._get_meta_entry(meta_elem, 'product'), 'test product')
+                    self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'product_type'), 'XYZ-123')
+                    self.assertEquals(self._get_cpf_meta_entry(meta_elem, 'platform'), 'Platform X')
+                except AssertionError:
+                    self.fail("Root '%s' was not updated when it should have been!" % config)
+            else:
+                try:
+                    desc_elem = root_elem.find("{http://www.s60.com/xml/confml/2}desc")
+                    self.assertEquals(desc_elem, None)
+                    
+                    meta_elem = root_elem.find("{http://www.s60.com/xml/confml/2}meta")
+                    self.assertEquals(meta_elem, None)
+                except AssertionError:
+                    self.fail("Root '%s' was updated when it should not have been!" % config)
+
+    def test_update_multiple_configurations(self):
+        self._run_test_add_meta_to_multiple_roots_in_filesystem_project(
+            project         = 'multi_project',
+            args            = '-c root2.confml '
+                              '-c root4.confml',
+            updated_configs = ['root2.confml',
+                               'root4.confml'])
+    
+    def test_update_multiple_configurations_with_wildcard(self):
+        self._run_test_add_meta_to_multiple_roots_in_filesystem_project(
+            project         = 'multi_project_wildcard',
+            args            = '--config-wildcard root*.confml',
+            updated_configs = ['root1.confml',
+                               'root2.confml',
+                               'root3.confml',
+                               'root4.confml',
+                               'root5.confml'])
+    
+    def test_update_multiple_configurations_with_regex(self):
+        self._run_test_add_meta_to_multiple_roots_in_filesystem_project(
+            project         = 'multi_project_regex',
+            args            = '--config-regex root[135].confml',
+            updated_configs = ['root1.confml',
+                               'root3.confml',
+                               'root5.confml'])
+    
+    def test_update_multiple_configurations_with_mixed_args(self):
+        self._run_test_add_meta_to_multiple_roots_in_filesystem_project(
+            project         = 'multi_project_mixed_args',
+            args            = '-c root2.confml --config-regex root[13].confml',
+            updated_configs = ['root1.confml',
+                               'root2.confml',
+                               'root3.confml'])
+
+if __name__ == '__main__':
+      unittest.main()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, os.path
+from pkg_resources import require
+require("setuptools")
+from setuptools import setup, find_packages
+from cone import __version__
+
+setup(
+    name = "cone",
+    version = __version__,
+    packages = find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
+    package_data = {'cone.validation': ['confml_xsd/*.xsd', 'implml_xsd/*.xsd']},
+    install_requires = ['Jinja2>=2.1.1', 'simplejson>=2.0.9', 'lxml>=2.2.2'], #FIX THIS: not to try load cone from web
+
+
+    # Project uses reStructuredText, so ensure that the docutils get
+    # installed or upgraded on the target machine
+    #install_requires = ['zipfile'],
+    test_suite = "cone.tests.runtests.collect_suite",
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware", 
+    zip_safe = True
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/setup.cfg	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,2 @@
+[egg_info]
+tag_svn_revision = 1
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from setuptools import setup, find_packages
+
+setup(
+    name = "cone-testautomation",
+    version = "1.0",
+    packages = find_packages(exclude=["*.tests", "*.tests.*", "tests.*", "tests"]),
+
+    # Project uses reStructuredText, so ensure that the docutils get
+    # installed or upgraded on the target machine
+    #install_requires = ['zipfile'],
+    #test_suite = "cone.tests.runtests.collect_suite",
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine test automation module",
+    license = "Eclipse Public License v1.0",
+    keywords = "cone testautomation",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware", 
+	zip_safe = True
+    # could also include long_description, download_url, classifiers, etc.
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/base_testcase.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,363 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import sys, os, re, unittest, shutil, zipfile, filecmp, subprocess
+
+class BaseTestCase(unittest.TestCase):
+    def set_modification_reference_time(self, path):
+        """
+        Set modification reference time for a subsequent call to assert_modified()
+        or assert_not_modified().
+        @param path: The path to use, can be a file or a directory.
+        """
+        if not hasattr(self, '_mod_refs'):
+            self._mod_refs = {}
+        
+        if os.path.isdir(path):
+            self._mod_refs[path] = self._get_dir_modtime_dict(path)
+        elif os.path.isfile(path):
+            self._mod_refs[path] = os.stat(path).st_mtime
+        else:
+            self.fail("'%s' does not exist" % path)
+    
+    def assert_modified(self, path):
+        """
+        Assert that a given file or directory has been modified since the last
+        call to set_modification_reference_time() with the same path.
+        """
+        self._assert_modification(path, assert_not_modified=False)
+    
+    def assert_not_modified(self, path):
+        """
+        Assert that a given file or directory has NOT been modified since the last
+        call to set_modification_reference_time() with the same path.
+        """
+        self._assert_modification(path, assert_not_modified=True)
+    
+    def remove_if_exists(self, path_or_paths):
+        """Remove files or directories if they exist.
+        @param path_or_paths: The path to remove. Can also be a list of paths."""
+        if isinstance(path_or_paths, list):
+            paths = path_or_paths
+        else:
+            paths = [path_or_paths]
+        
+        for path in paths:
+            if os.path.isdir(path):
+                shutil.rmtree(path)
+            elif os.path.isfile(path):
+                os.remove(path)
+    
+    def create_dir(self, path):
+        """Create the given directory if it doesn't exist."""
+        if not os.path.exists(path):
+            os.makedirs(path)
+    
+    def recreate_dir(self, path):
+        """Remove the given directory if it exists, and recreate it."""
+        if os.path.exists(path):
+            shutil.rmtree(path)
+        os.makedirs(path)
+    
+    def create_dir_for_file_path(self, path):
+        """Create the directories for the given file"""
+        dir = os.path.dirname(path)
+        if dir != '' and not os.path.exists(dir):
+            os.makedirs(dir)
+    
+    def assert_exists_and_contains_something(self, path):
+        """
+        Assert that the given path is a file or a directory and contains some data.
+        """
+        if os.path.isdir(path):
+            if len(os.listdir(path)) == 0:
+                self.fail("Path '%s' exists (is a directory) but does not contain anything)" % path)
+        elif os.path.isfile(path):
+            if os.stat(path).st_size == 0:
+                self.fail("Path '%s' exists (is a file) but does not contain anything)" % path)
+        else:
+            self.fail("Path '%s' does not exist" % path)
+    
+    def assert_dir_contents_equal(self, dir1, dir2, ignore=[], custom_comparison_functions={}, current_root_dir=''):
+        """
+        Assert recursively that the contents of two directories are equal.
+        @param ignore: List containing names that should be ignored in the comparison (e.g. '.svn').
+            The entries can either be relative, e.g. 'file.txt', which would ignore 'file.txt'
+            in any directory, or they can be absolute, e.g. '/some/dir/file.txt', which would
+            ignore 'file.txt' only under 'some/dir/', relative to the comparison root.
+        @param custom_comparison_functions: Dictionary containing custom comparison functions
+            for files. Each entry in the dict should contain the following contents:
+                Key: The relative path of the file under the directories, e.g.
+                    'some/path/file.txt'
+                Value: The function used to compare the file contents. The function should
+                    take as parameters the raw binary data of the files, and should return
+                    True if the contents are equal.
+        @param current_root_dir: For internal use.
+        """
+        msg = "Directory contents are not equal ('%s' vs. '%s')\n" % (dir1, dir2)
+        
+        ignore_list = []
+        for entry in ignore:
+            if entry.startswith('/'):
+                dirname, entryname = entry.rsplit('/', 1)
+                dirname = dirname.lstrip('/')
+                #print "dirname = %r" % dirname
+                #print "entryname = %r" % entryname
+                #print "current_root_dir = %r" % current_root_dir
+                if dirname == current_root_dir.rstrip('/'):
+                    ignore_list.append(entryname)
+            else:
+                ignore_list.append(entry)
+
+        # Compare files with the custom comparison functions if necessary
+        for path, func in custom_comparison_functions.iteritems():
+            dirname  = os.path.dirname(path).replace('\\', '/')
+            filename = os.path.basename(path)
+            
+            filepath1 = os.path.join(dir1, filename)
+            filepath2 = os.path.join(dir2, filename)
+            
+            # Compare if the file is in the current path and they both exist
+            if dirname == current_root_dir and \
+                os.path.isfile(filepath1) and \
+                os.path.isfile(filepath2):
+                comp_result = func(
+                    self.read_data_from_file(filepath1),
+                    self.read_data_from_file(filepath2))
+                if not comp_result:
+                    # The files are not equal -> fail
+                    self.fail(msg + "File '%s' differs" % filename)
+                else:
+                    # The files are equal -> ignore from dircmp comparison
+                    ignore_list.append(filename)
+        
+        dcmp = filecmp.dircmp(dir1, dir2, ignore=ignore_list)
+        self.assertEquals(0, len(dcmp.left_only), msg + "Files only on left: %s" % dcmp.left_only)
+        self.assertEquals(0, len(dcmp.right_only), msg + "Files only on right: %s" % dcmp.right_only)
+        self.assertEquals(0, len(dcmp.diff_files), msg + "Differing files: %s" % dcmp.diff_files)
+        self.assertEquals(0, len(dcmp.funny_files), msg + "Funny files: %s" % dcmp.funny_files)
+        # Recurse into sub-directories
+        for d in dcmp.common_dirs:
+            if current_root_dir:    cr = current_root_dir + '/' + d
+            else:                   cr = d
+            self.assert_dir_contents_equal(
+                os.path.join(dir1, d), os.path.join(dir2, d),
+                ignore, custom_comparison_functions, cr)
+    
+    def assert_file_contents_equal(self, file1, file2, ignore_patterns=[]):
+        """
+        Assert the the given two files exist and their contents are equal.
+        @param ignore_patterns: List of regular expressions for portions of the
+            file content to ignore in the comparison. The ignored parts are
+            deleted from the files before actual comparison.
+        """
+        self.assertTrue(os.path.exists(file1), "File '%s' does not exist!" % file1)
+        self.assertTrue(os.path.exists(file2), "File '%s' does not exist!" % file2)
+        
+        data1 = self.read_data_from_file(file1)
+        data2 = self.read_data_from_file(file2)
+        
+        def remove_ignored(data, pattern_list):
+            for i, pattern in enumerate(pattern_list):
+                data = re.sub(pattern, '{{{ignore_%d}}}' % i, data)
+            return data
+        data1 = remove_ignored(data1, ignore_patterns)
+        data2 = remove_ignored(data2, ignore_patterns)
+        
+        if data1 != data2:
+            if len(ignore_patterns) > 0:
+                self.write_data_to_file(file1 + '.comparetemp', data1)
+                self.write_data_to_file(file2 + '.comparetemp', data2)
+                self.fail("Data of the files '%s' and '%s' are not equal\nSee *.comparetemp files for the actual data that was compared." % (file1, file2))
+            else:
+                self.fail("Data of the files '%s' and '%s' are not equal" % (file1, file2))
+    
+    def assert_file_content_equals(self, filepath, expected_data):
+        """
+        Assert that the content of the given file is equals to the given expected data.
+        """
+        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
+        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
+        
+        f = open(filepath, "rb")
+        try:        filedata = f.read()
+        finally:    f.close()
+        
+        if filedata != expected_data:
+            msg = ("The content of the file '%s' is not what was expected!\n" % filepath) +\
+                  ("Expected: %r\nActual: %r" % (expected_data, filedata))
+            self.fail(msg)
+    
+    def assert_file_contains(self, filepath, data, encoding=None):
+        """
+        Assert that the given file contains the given text somewhere in its contents.
+        @param filepath: Path to the file to check.
+        @param data: The data the file is expected to contain.
+        @param encoding: Encoding used to decode the contents of the file.
+            If None, noe decoding is done.
+        """
+        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
+        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
+        
+        f = open(filepath, "rb")
+        try:        filedata = f.read()
+        finally:    f.close()
+        
+        if encoding is not None:
+            filedata = filedata.decode(encoding)
+        
+        if not isinstance(data, list):
+            data = [data]
+        
+        for entry in data:
+            if not filedata.find(entry) != -1:
+                self.fail("The file '%s' does not contain the data '%s'" % (filepath, entry))
+
+    def assert_file_does_not_contain(self, filepath, data, encoding=None):
+        """
+        Assert that the given file doesn't contain the given text somewhere in its contents.
+        @param filepath: Path to the file to check.
+        @param data: The data the file is expected to not contain.
+        @param encoding: Encoding used to decode the contents of the file.
+            If None, noe decoding is done.
+        """
+        self.assertTrue(os.path.exists(filepath), "'%s' does not exist!" % filepath)
+        self.assertTrue(os.path.isfile(filepath), "'%s' is not a file!" % filepath)
+        
+        f = open(filepath, "rb")
+        try:        filedata = f.read()
+        finally:    f.close()
+        
+        if encoding is not None:
+            filedata = filedata.decode(encoding)
+        
+        if not isinstance(data, list):
+            data = [data]
+        
+        for entry in data:
+            if not filedata.find(entry) == -1:
+                self.fail("The file '%s' contains the data '%s'" % (filepath, entry))
+    
+    def read_data_from_file(self, path):
+        """Read the raw binary data from the given file."""
+        f = open(path, "rb")
+        try:        return f.read()
+        finally:    f.close()
+    
+    def read_data_from_zip_file(self, path, entry):
+        """Read the raw binary data from the given ZIP file with the given ZIP entry."""
+        zf = zipfile.ZipFile(path, "r")
+        try:        return zf.read(entry)
+        finally:    zf.close()
+    
+    def write_data_to_file(self, path, data):
+        """Write raw binary data into the given file."""
+        f = open(path, "wb")
+        try:        f.write(data)
+        finally:    f.close()
+    
+    def run_command(self, command, expected_return_code=0):
+        """
+        Run the given command, asserting that it returns the expected value.
+        @param command: The command to run.
+        @param expected_return_code: The expected return code. Can be None if the return
+            code doesn't matter.
+        @return: The command output.
+        """
+        # Using shell=True on windows uses
+        #    cmd.exe /c <command>
+        # to run the actual command, and if cmd.exe sees that the first
+        # character in the command is ", it strips that and a trailing ".
+        # For this reason we add quotes to the command to prevent e.g.
+        #   "C:\some\command.cmd" --some-arg "xyz"
+        # from becoming
+        #   C:\some\command.cmd" --some-arg "xyz
+        if sys.platform == 'win32' and command.startswith('"'):
+            command = '"' + command + '"'
+        
+        p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, shell=True)
+        out, err = p.communicate()
+        if expected_return_code is not None:
+            self.assertTrue(p.returncode == expected_return_code,
+                            "Could not execute command (%s)\n"\
+                            "Return code is not what was expected (expected %d, got %d)\n"\
+                            "Output: \n%s" % (command, expected_return_code, p.returncode, out))
+        return out
+    
+    # =====================================================
+    # Private helper methods
+    # =====================================================
+    
+    def _get_dir_modtime_dict(self, dir_path):
+        """
+        Return a dictionary of all files and directories and their last
+        modification times in a given directory.
+        """
+        refdict = {}
+        for root, dirs, files in os.walk(dir_path):
+            for f in files:
+                path = os.path.join(root, f)
+                refdict[path] = os.stat(path).st_mtime
+            for d in dirs:
+                path = os.path.join(root, d)
+                refdict[path] = os.stat(path).st_mtime
+        return refdict
+    
+    def _assert_modification(self, path, assert_not_modified=True):
+        if os.path.isdir(path):
+            if assert_not_modified:
+                self._assert_dir_not_modified(path)
+            else:
+                self.assert_dir_modified(path)
+        elif os.path.isfile(path):
+            if assert_not_modified:
+                self._assert_file_not_modified(path)
+            else:
+                self._assert_file_modified(path)
+        else:
+            self.fail("'%s' does not exist" % path)
+    
+    def _assert_dir_not_modified(self, dir_path):
+        refdict = self._mod_refs[dir_path]
+        curdict = self._get_dir_modtime_dict(dir_path)
+        
+        # If the keys of the dicts are not the same, the contents of the
+        # dir have been modified (added or removed files/subdirs)
+        self.assertEquals(curdict.keys(), refdict.keys())
+        
+        # Compare manually so that assertion error output shows the specific file/dir
+        for path in curdict.iterkeys():
+            self.assertEquals(curdict[path], refdict[path], "File or dir '%s' modified" % path)
+    
+    def assert_dir_modified(self, dir_path):
+        refdict = self._mod_refs[dir_path]
+        curdict = self._get_dir_modtime_dict(dir_path)
+        
+        self.assertNotEqual(curdict, refdict, "Directory '%s' has not been modified when it was expected to be" % dir_path)
+    
+    def _assert_file_not_modified(self, file_path):
+        time1 = self._mod_refs[file_path]
+        time2 = os.stat(file_path).st_mtime
+        self.assertEquals(time1, time2,
+            ("File '%s' was modified when it should not have been "+\
+            "(mod time %f vs. %f)") % (file_path, time1, time2))
+    
+    def _assert_file_modified(self, file_path):
+        time1 = self._mod_refs[file_path]
+        time2 = os.stat(file_path).st_mtime
+        self.assertNotEqual(time1, time2,
+            ("File '%s' was modified not when it should have been "+\
+            "(mod time %f vs. %f)") % (file_path, time1, time2))
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/compare_xml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,219 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import sys
+import xml.etree.ElementTree as ElementTree
+import unittest
+import traceback
+
+def compare_xml_documents(data1, data2, **kwargs):
+    """
+    Compare two XML documents for equality.
+    @param data1: The raw byte data of the first XML document as a string.
+    @param data2: The raw byte data of the second XML document as a string.
+    
+    Keyword arguments:
+    @param check_encoding: If True, the encoding of the documents is checked to be the same.
+    @param ignore_namespace: If True, XML namespaces are ignored in the comparison.
+    @param ignored_empty_tags: List of tags that will be ignored in the comparison if empty,
+        i.e. if the tags is empty on one side and does not exist on the other.
+    @param debug_stream: If not None, the stream where debug messages are printed.
+    
+    @return: True if the documents are equal, False if not.
+    """
+    
+    check_encoding = kwargs.get('check_encoding', False)
+    ignore_namespaces = kwargs.get('ignore_namespaces', False)
+    debug_stream = kwargs.get('debug_stream', None)
+    ignored_empty_tags = kwargs.get('ignored_empty_tags', [])
+    
+    if data1 == data2:
+        if debug_stream: print >>debug_stream, "Raw byte data equal"
+        return True
+    
+    if check_encoding:
+        enc1 = _get_xml_encoding(data1)
+        enc2 = _get_xml_encoding(data2)
+        if enc1.lower() != enc2.lower():
+            if debug_stream: print >>debug_stream, "XML encoding is not the same (%s vs. %s)" % (repr(enc1), repr(enc2))
+            return False
+    
+    try:
+        et1 = ElementTree.fromstring(data1)
+    except Exception:
+        if debug_stream: print >>debug_stream, "Failure when parsing data1: %s" % traceback.format_exc()
+        return False
+    
+    try:
+        et2 = ElementTree.fromstring(data2)
+    except Exception:
+        if debug_stream: print >>debug_stream, "Failure when parsing data2: %s" % traceback.format_exc()
+        return False
+    
+    return _xml_elements_equal(et1, et2, ignore_namespaces, debug_stream, '', ignored_empty_tags)
+
+def _xml_elements_equal(elem1, elem2, ignore_namespaces, debug_stream, parent_path, ignored_empty_tags):
+    ds = debug_stream
+    
+    elem1_tag = _get_tag(elem1, ignore_namespaces)
+    elem2_tag = _get_tag(elem2, ignore_namespaces)
+    
+    full_path1 = parent_path + '/' + elem1_tag
+    full_path2 = parent_path + '/' + elem2_tag
+    if ds and parent_path == '':
+        print >>ds, "Comparing '%s' vs. '%s'" % (full_path1, full_path2)
+    
+    if elem1_tag != elem2_tag:
+        if ds and parent_path == '':
+            print >>ds, "Tags don't match"
+        return False
+    
+    def strip_string(data):
+        if data == None:    return data
+        else:               return data.strip(' \n\r\t')
+    text1 = strip_string(elem1.text)
+    text2 = strip_string(elem2.text)
+    if text1 != text2:
+        if ds and parent_path == '':
+            print >>ds, "Element text %s does not match %s" % (repr(text1), repr(text2))
+        return False
+    
+    def strip_namespace_attrs(attrib):
+        if not ignore_namespaces:
+            return attrib
+        else:
+            # Strip all attributes with a namespace if namespace are ignored
+            result = {}
+            for key, value in attrib.iteritems():
+                if '{' not in key:
+                    result[key] = value
+            return result
+    attrs1 = strip_namespace_attrs(elem1.attrib)
+    attrs2 = strip_namespace_attrs(elem2.attrib)
+    if attrs1 != attrs2:
+        if ds and parent_path == '':
+            print >>ds, "Element attributes don't match (%s vs. %s)" % (repr(attrs1), repr(attrs2))
+        return False
+    
+    # Remove ignored empty sub-elements before comparing the sub-elems
+    subelems1 = elem1.getchildren()
+    subelems2 = elem2.getchildren()
+    _remove_ignored_empty_subelems(subelems1, elem2.getchildren(), full_path1, ignore_namespaces, ignored_empty_tags, ds)
+    _remove_ignored_empty_subelems(subelems2, elem1.getchildren(), full_path1, ignore_namespaces, ignored_empty_tags, ds)
+    
+    # Compare sub-elements without caring about their document order
+    # NOTE: This approach will not scale well for very large documents
+    len1 = len(elem1.getchildren())
+    len2 = len(elem2.getchildren())
+    if len1 != len2:    return False
+    if len1 == 0:       return True
+    matched_subelems2 = []
+    for subelem1 in subelems1:
+        matched = False
+        for subelem2 in subelems2:
+            # Try to match the sub-element in elem2 only if it
+            # has not been matched yet
+            if id(subelem2) not in matched_subelems2:
+                if _xml_elements_equal(subelem1, subelem2, ignore_namespaces, ds, full_path1, ignored_empty_tags):
+                    matched = True
+                    matched_subelems2.append(id(subelem2))
+                    break
+        if not matched:
+            if ds:
+                print >>ds, "No match found for element '%s' under '%s'." % (subelem1.tag, full_path1)
+                print >>ds, "Element data:"
+                print >>ds, ElementTree.tostring(subelem1)
+            return False
+    
+    # Everything matched
+    return True
+
+def _remove_ignored_empty_subelems(subelems1, subelems2, parent_path, ignore_namespaces, ignored_empty_tags, debug_stream):
+    """Remove ignored empty sub-elements from list subelems1."""
+    ds = debug_stream
+    if ds: print >>ds, "parent_path: %s" % parent_path
+    removed = []
+    for i, subelem1 in enumerate(subelems1):
+        if len(subelem1.getchildren()) > 0:
+            continue
+        
+        # See if the tag should be ignored if it doesn't exist on
+        # the other side
+        is_ignored = False
+        for ignored_tag in ignored_empty_tags:
+            if ds: print >>ds, "ignored_tag = %s, tag = %s" % (ignored_tag, parent_path + "/" + _get_tag(subelem1, ignore_namespaces))
+            if ignored_tag == parent_path + "/" + _get_tag(subelem1, ignore_namespaces):
+                is_ignored = True
+                break
+        if not is_ignored:
+            continue
+        
+        # See if the tag exists on the other side
+        found = False
+        for subelem2 in subelems2:
+            if _get_tag(subelem1, ignore_namespaces) == _get_tag(subelem2, ignore_namespaces):
+                found = True
+                break
+        if not found:
+            removed.append(i)
+    
+    # Sort and reverse the removed list so that deleting starts from the
+    # end and the indices are correct throughout the operation
+    removed.sort()
+    removed = removed[::-1]
+    if len(removed) >= 2:
+        if removed[0] < removed[-1]:
+            raise RuntimeError("Internal error: list in wrong order: %s" % removed)
+    
+    for i in removed:
+        del subelems1[i]
+        
+def _get_tag(elem, ignore_namespaces):
+    tag = elem.tag
+    if ignore_namespaces:
+        pos = tag.find('}')
+        if pos >= 0:
+            tag = tag[pos + 1:]
+    return tag
+
+def _get_xml_encoding(xml_data):
+    encoding = 'UTF-8'
+    if xml_data.startswith('\xFE\xFF') or xml_data.startswith('\xFF\xFE'):
+        encoding = 'UTF-16'
+    
+    # Decode only up to the first 200 bytes (should be enough for the header)
+    decoded_data = xml_data[:200].decode(encoding, 'ignore')
+    if decoded_data.startswith('<?xml'):
+        header = decoded_data[:decoded_data.find('?>') + 2]
+        # E.g header = '<?xml version="1.0" encoding = 'UTF-8'?>'
+        
+        def get_substr(string, sought_data):
+            pos = string.find(sought_data)
+            if pos >= 0:    return string[pos + len(sought_data):]
+            else:           return None
+        
+        x = get_substr(header, "encoding")
+        if not x: return ''
+        # E.g x = ' = 'UTF-8'?>'
+        x = x.replace(' ', '').replace('\t', '')
+        # E.g x = '='UTF-8'?>'
+        sgl_quoted = get_substr(x, "='")
+        dbl_quoted = get_substr(x, '="')
+        # E.g sgl_quoted = 'UTF-8'?>'
+        if sgl_quoted:      return sgl_quoted[:sgl_quoted.find("'")]
+        elif dbl_quoted:    return dbl_quoted[:dbl_quoted.find('"')]
+        
+    return ''
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/copy_dir.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, shutil
+
+def _filter_list(lst, filters):
+    """
+    Filter a list in-place.
+    
+    @param lst: The list to filter.
+    @param ignore_functions: List of functions used to check whether an entry
+        should be filtered or not. Each function is given a list entry and
+        should return True or False.
+    """
+    del_entries = []
+    for entry in lst:
+        for func in filters:
+            if func(entry):
+                del_entries.append(entry)
+                break
+    for entry in del_entries:
+        lst.remove(entry)
+
+def copy_dir(source_dir, target_dir, dir_ignore_functions=[], file_ignore_functions=[]):
+    """
+    Copy a directory tree with the possibility of ignoring certain files or directories.
+    
+    @param source_dir: The source directory to copy.
+    @param target_dir: The target directory. If the directory already exists, already
+        files will be overwritten.
+    @param dir_ignore_functions: List of filter functions applied on dirs.
+    @param file_ignore_functions: List of filter functions applied on files.
+    """
+    if not os.path.exists(source_dir):
+        raise RuntimeError("Source dir '%s' does not exist!!" % source_dir)
+    
+    source_parts_num = len(source_dir.replace('\\', '/').split('/'))
+    target_parts = target_dir.replace('\\', '/').split('/')
+    
+    for root, dirs, files in os.walk(source_dir, topdown=True):
+        _filter_list(dirs, dir_ignore_functions)
+        _filter_list(files, file_ignore_functions)
+        
+        # Form the target root path
+        current_dir_parts = root.replace('\\', '/').split('/')
+        current_dir_parts = current_dir_parts[source_parts_num:]
+        target_root_parts = [x for x in target_parts]
+        target_root_parts.extend(current_dir_parts)
+        
+        # Create the target directory if necessary
+        target_root = '/'.join(target_root_parts)
+        if not os.path.exists(target_root):
+            os.makedirs(target_root)
+        elif not os.path.isdir(target_root):
+            os.remove(target_root)
+            os.makedirs(target_root)
+
+        # Copy files
+        for file in files:
+            src_file = os.path.join(root, file)
+            dst_file = os.path.join(target_root, file)
+            
+            # Remove if exists
+            if os.path.exists(dst_file):
+                if os.path.isdir(dst_file): shutil.rmtree(dst_file)
+                else:                       os.remove(dst_file)
+            
+            shutil.copy2(src_file, dst_file)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/setup.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,43 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+from setuptools import setup, find_packages
+
+setup(
+    name = "cone-tests",
+    version = "1.0",
+    packages = find_packages(),
+    scripts = ['runtests.py'],
+
+    # Project uses reStructuredText, so ensure that the docutils get
+    # installed or upgraded on the target machine
+    #install_requires = ['zipfile'],
+    #test_suite = "cone.tests.runtests.collect_suite",
+
+    package_data = {
+        'configproject': ['*.*'],
+    },
+
+    # metadata for upload to PyPI
+    author = "Teemu Rytkonen",
+    author_email = "teemu.rytkonen@nokia.com",
+    description = "Configuration Engine test module",
+    license = "Symbian Foundation License v1.0",
+    keywords = "cone test",
+    url = "http://developer.symbian.org/wiki/index.php/Software_Configuration_Middleware",
+
+    # could also include long_description, download_url, classifiers, etc.
+)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/testcli.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+
+from optparse import OptionParser, OptionGroup
+import os
+import sys
+import shutil
+import unittest
+
+def run(suite):
+    parser = OptionParser(version="%%prog %s" % 1.0)
+    parser.add_option("-f","--format",\
+                    dest="format",\
+                    help="The output format of the test results, which can be either stdout or xml file [stdout|xml]. Default is stdout",\
+                    metavar="FORMAT",\
+                    default="stdout")
+    parser.add_option("-o","--output",\
+                    dest="output",\
+                    help="The output directory of xml output. Default is test-results",\
+                    metavar="FOLDER",\
+                    default="test-results")
+
+    (options, args) = parser.parse_args()
+    results = None
+    if options.format == "stdout":
+        results = unittest.TextTestRunner(verbosity=2).run(suite)
+    elif options.format == "xml":
+        if not os.path.exists(options.output):
+            os.mkdir(options.output)
+        else:
+            shutil.rmtree(options.output)
+            os.mkdir(options.output)
+        runner = unittest.TextTestRunner(None,options.output)#Add support for xmlrunner
+        results = runner.run(suite)
+        print "Output file created %s" % os.path.join(options.output,runner.filename)
+    else:
+        parser.error("Unrecognized output format %s! See --help." % parser.format)
+    
+    if results.errors > 0 or results.failures > 0:
+        return -1
+    
+    
+  
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/__init__.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import unittest, os, sys
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+sys.path.append(os.path.join(ROOT_PATH,'../..'))
+
+# Find all unittest_*.py files in this folder
+import re
+__all__ = filter(lambda name: re.match(r'^unittest_.*\.py$', name) != None, os.listdir(ROOT_PATH))
+# Strip .py endings
+__all__ = map(lambda name: name[:-3], __all__)
+
+def collect_suite():  
+    suite = unittest.TestSuite()
+    for test_module in __all__:
+        # Load the test module dynamically and add it to the test suite
+        module = __import__(test_module)
+        suite.addTests(unittest.TestLoader().loadTestsFromModule(module))
+    return suite      
+
+def runtests():
+    unittest.TextTestRunner(verbosity=2).run(collect_suite())
+
+if __name__ == '__main__':
+    runtests()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/runtests.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import __init__
+__init__.runtests()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/ignored.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+fdsafda
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/subdir1/subsubdir/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+fdsafda
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/subdir1/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+fdsafda
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/testdata/zip_dir/test/test.txt	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+fdsafda
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/unittest_compare_xml.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,243 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+from testautomation import compare_xml
+
+class TestGetXmlEncoding(unittest.TestCase):
+    def assert_enc_eq(self, encoding, xml_data):
+        self.assertEquals(encoding, compare_xml._get_xml_encoding(xml_data))
+    
+    def test_get_encoding(self):
+        self.assert_enc_eq('ASCII',         u"""<?xml version="1.0" encoding="ASCII"?><root x="\u0084"/>""".encode('ascii', 'xmlcharrefreplace'))
+        self.assert_enc_eq('ISO-8859-1',    u"""<?xml version="1.0" encoding = "ISO-8859-1"?><root x="\u0084"/>""".encode('latin1'))
+        self.assert_enc_eq('utf-8',         u"""<?xml version="1.0" encoding='utf-8'?><root x="\u0084"/>""".encode('utf-8'))
+        self.assert_enc_eq('UTF-16',        u"""<?xml encoding = 'UTF-16' version="1.0"?><root x="\u0084"/>""".encode('utf-16'))
+        self.assert_enc_eq('',              u"""<?xml version="1.0"?><root x="\u0084"/>""".encode('utf-8'))
+        self.assert_enc_eq('',              u"""<root x="\u0084"/>""".encode('utf-8'))
+
+class TestCompareXml(unittest.TestCase):
+    REF_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+    
+    def assert_comparison_result_equals(self, data1, data2, expected_result, msg=None, **kwargs):
+        class DebugStream:
+            def __init__(self):
+                self.messages = []
+            def write(self, data):
+                self.messages.append(data)
+        
+        ds = DebugStream()
+        kwargs['debug_stream'] = ds
+        result = compare_xml.compare_xml_documents(data1, data2, **kwargs)
+        if result != expected_result:
+            d = []
+            if msg != None: d.append(msg + '\n')
+            d.append("Comparison results are not equal (expected %s, got %s)\n" % (expected_result, result))
+            d.append("Debug output:\n")
+            d.extend(ds.messages)
+            self.fail(''.join(d))
+
+    def test_identical(self):
+        self.assert_comparison_result_equals(self.REF_DATA, self.REF_DATA, True)
+    
+    def test_different_whitespace(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+    <rootElem
+    my_attr="jeje">
+<subElem>a sub-element</subElem><subElem>another sub-element</subElem>
+<subElem>yet another sub-element</subElem>
+<subElem
+    attr1="attribute 1"
+    attr2="attribute 2"/>
+    </rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, True)
+
+    def test_attrs_in_different_order(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr2="attribute 2" attr1="attribute 1"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, True)
+    
+    def test_elements_in_different_order(self):
+        REF_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem><x>1</x><y/><z z_attr="1"></z></subElem>
+    <subElem><x>2</x><y/><z z_attr="2"></z></subElem>
+    <subElem><x>3</x><y/><z z_attr="3"></z></subElem>
+    <subElem><x><y></y><z/></x></subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+    <test attr="yeah"/>
+</rootElem>"""
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem attr2="attribute 2" attr1="attribute 1"/>
+    <subElem><z z_attr="3"></z><y/><x>3</x></subElem>
+    <subElem><x>1</x><y/><z z_attr="1"></z></subElem>
+    <test attr="yeah"/>
+    <subElem><x><z/><y/></x></subElem>
+    <subElem><y/><x>2</x><z z_attr="2"></z></subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(REF_DATA, DATA, True)
+    
+    def test_different_root_contents(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+some text content in root
+    <subElem>a sub-element</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, False)
+    
+    def test_different_subelem_contents(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element (with different content)</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, False)
+    
+    def test_different_attrs_in_root(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeh">
+    <subElem>a sub-element (with different content)</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, False)
+    
+    def test_missing_attrs_in_root(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem>
+    <subElem>a sub-element (with different content)</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, False)
+    
+    def test_different_attrs_in_subelem(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element (with different content)</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute I" attr2="attribute II"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, False)
+    
+    def test_different_whitespace_in_subelem_content(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>   a sub-element </subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, True)
+    
+    def test_ignore_root_namespace(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem xmlns:myns="http://my.namespace.com/schema" my_attr="jeje">
+    <subElem>a sub-element</subElem>
+    <subElem>another sub-element</subElem>
+    <subElem>yet another sub-element</subElem>
+    <subElem attr1="attribute 1" attr2="attribute 2"/>
+</rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, True)
+    
+    def test_ignore_namespace(self):
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<myns:rootElem xmlns:myns="http://my.namespace.com/schema" my_attr="jeje">
+    <myns:subElem>a sub-element</myns:subElem>
+    <myns:subElem>another sub-element</myns:subElem>
+    <myns:subElem>yet another sub-element</myns:subElem>
+    <myns:subElem attr1="attribute 1" attr2="attribute 2"/>
+</myns:rootElem>"""
+        self.assert_comparison_result_equals(self.REF_DATA, DATA, True, ignore_namespaces=True)
+    
+    def test_ignore_empty_tags(self):
+        REF_DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element</subElem>
+    <subElem>
+        <subSubElem>1</subSubElem>
+        <subSubElem>2</subSubElem>
+        <emptySubElem/>
+    </subElem>
+    <emptySubElem/>
+</rootElem>"""
+        DATA = """<?xml version="1.0" encoding="UTF-8"?>
+<rootElem my_attr="jeje">
+    <subElem>a sub-element</subElem>
+    <subElem>
+        <subSubElem>1</subSubElem>
+        <subSubElem>2</subSubElem>
+    </subElem>
+</rootElem>"""
+        self.assert_comparison_result_equals(REF_DATA, DATA, False)
+        self.assert_comparison_result_equals(DATA, REF_DATA, False)
+        self.assert_comparison_result_equals(REF_DATA, DATA, False, ignored_empty_tags=['/rootElem/emptySubElem'])
+        self.assert_comparison_result_equals(DATA, REF_DATA, False, ignored_empty_tags=['/rootElem/emptySubElem'])
+        self.assert_comparison_result_equals(REF_DATA, DATA, False, ignored_empty_tags=['/rootElem/subElem/emptySubElem'])
+        self.assert_comparison_result_equals(DATA, REF_DATA, False, ignored_empty_tags=['/rootElem/subElem/emptySubElem'])
+        self.assert_comparison_result_equals(REF_DATA, DATA, True, ignored_empty_tags=['/rootElem/emptySubElem', '/rootElem/subElem/emptySubElem'])
+        self.assert_comparison_result_equals(DATA, REF_DATA, True, ignored_empty_tags=['/rootElem/emptySubElem', '/rootElem/subElem/emptySubElem'])
+        #self.assert_comparison_result_equals(DATA, REF_DATA, True, ignored_empty_tags=['emptySubElem'])
+        #self.assert_comparison_result_equals(REF_DATA, DATA, False, ignored_empty_tags=[('emptySubElem', 1)])
+        #self.assert_comparison_result_equals(DATA, REF_DATA, False, ignored_empty_tags=[('emptySubElem', 1)])
+        #self.assert_comparison_result_equals(REF_DATA, DATA, False, ignored_empty_tags=[('emptySubElem', 2)])
+        #self.assert_comparison_result_equals(DATA, REF_DATA, False, ignored_empty_tags=[('emptySubElem', 2)])
+        #self.assert_comparison_result_equals(REF_DATA, DATA, True, ignored_empty_tags=[('emptySubElem', 1), ('emptySubElem', 2)])
+        #self.assert_comparison_result_equals(DATA, REF_DATA, True, ignored_empty_tags=[('emptySubElem', 1), ('emptySubElem', 2)])
+    
+    def test_check_encoding(self):
+        DATA_DICT = {
+            'ASCII':        u"""<?xml version="1.0" encoding="ASCII"?><root x="\u0084"/>""".encode('ascii', 'xmlcharrefreplace'),
+            'ISO-8859-1':   u"""<?xml version="1.0" encoding = "ISO-8859-1"?><root x="\u0084"/>""".encode('latin1'),
+            'UTF8':         u"""<?xml version="1.0" encoding='UTF-8'?><root x="\u0084"/>""".encode('utf-8'),
+            'UTF-16':       u"""<?xml version="1.0" encoding="UTF-16"?><root x="\u0084"/>""".encode('utf-16'),
+            'None1':        u"""<?xml version="1.0"?><root x="\u0084"/>""".encode('utf-8'),
+            'None2':        u"""<root x="\u0084"/>""".encode('utf-8'),
+        }
+        
+        for key1 in DATA_DICT.keys():
+            for key2 in DATA_DICT.keys():
+                if key1 != key2 and not (key1.startswith('None') or key2.startswith('None')):
+                    self.assert_comparison_result_equals(
+                        DATA_DICT[key1], DATA_DICT[key2],
+                        False, "Encoding check failed for '%s' vs. '%s'" % (key1, key2),
+                        check_encoding=True)
+                    self.assert_comparison_result_equals(
+                        DATA_DICT[key1], DATA_DICT[key2],
+                        True, "Comparison without encoding check failed for '%s' vs. '%s'" % (key1, key2),
+                        check_encoding=False)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/unittest_utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,37 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import unittest
+from testautomation import utils
+
+class TestHexToBinData(unittest.TestCase):
+    def test_hex_to_bindata(self):
+        try:    utils.hex_to_bindata('102')
+        except ValueError: pass
+        
+        try:    utils.hex_to_bindata('asdfgh')
+        except ValueError: pass
+        
+        self.assertEquals(utils.hex_to_bindata('  00 11 22 33 44 55 66 77 88 99 aA bB cC dD eE fF   '),
+                          '\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff')
+        
+        DATA = """
+        00 11 22 33 44 55
+        66 77 88 99
+        aA bB cC dD eE fF
+        """
+        self.assertEquals(utils.hex_to_bindata(DATA),
+                          '\x00\x11\x22\x33\x44\x55\x66\x77\x88\x99\xaa\xbb\xcc\xdd\xee\xff')
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/tests/unittest_zip_dir.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, unittest, zipfile
+from testautomation import zip_dir
+
+ROOT_PATH = os.path.dirname(os.path.abspath(__file__))
+test_data_dir = os.path.join(ROOT_PATH, 'testdata/zip_dir/test')
+temp_dir      = os.path.join(ROOT_PATH, 'temp/zip_dir')
+
+class TestZipDir(unittest.TestCase):
+    def test_zip_dir(self):
+        zip_file = os.path.join(temp_dir, 'test.zip')
+        if os.path.exists(zip_file):
+            os.remove(zip_file)
+        
+        zip_dir.zip_dir(test_data_dir, zip_file, [zip_dir.SVN_IGNORE_PATTERN, r'^ignored.txt$'])
+        
+        self.assertTrue(os.path.isfile(zip_file))
+        
+        zf = zipfile.ZipFile(zip_file, 'r')
+        namelist = zf.namelist()
+        zf.close()
+        
+        expected = [
+            'test.txt',
+            'subdir1/test.txt',
+            'subdir1/empty_dir/',
+            'subdir1/subsubdir/test.txt',
+            'subdir2/empty_dir/',
+        ]
+        self.assertEquals(sorted(expected), sorted(namelist))
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/unzip_file.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,53 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+
+import os, zipfile, shutil
+
+def unzip_file(file, dir, delete_if_exists=False):
+    if os.path.exists(dir):
+        if delete_if_exists == True:
+            shutil.rmtree(dir)
+        else:
+            raise RuntimeError("Directory '%s' already exists" % dir)
+    if not os.path.exists(file):
+        raise RuntimeError("File '%s' does not exist" % file)
+    
+    os.makedirs(dir)
+    zf = zipfile.ZipFile(file)
+    
+    try:
+        for name in zf.namelist():
+            if name.endswith('/'):
+                path = os.path.join(dir, name)
+                if not os.path.exists(path):
+                    os.makedirs(path)
+            else:
+                path = os.path.join(dir, name)
+                dirname = os.path.dirname(path)
+                if dirname != '' and not os.path.exists(dirname):
+                    os.makedirs(dirname)
+                f = open(path, 'wb')
+                try:        f.write(zf.read(name))
+                finally:    f.close()
+    finally:
+        zf.close()
+
+def unzip_file_if_newer(file, dir):
+    if not os.path.exists(file):
+        raise RuntimeError("File '%s' does not exist" % file)
+    
+    if not os.path.exists(dir) or os.stat(file)[8] > os.stat(dir)[8]:
+        unzip_file(file, dir, True)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/utils.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,30 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+def hex_to_bindata(hexdata):
+    hexdata = hexdata.replace(' ', '').replace('\r', '').replace('\n', '').replace('\t', '')
+    if len(hexdata) % 2 != 0:
+        raise ValueError("'%s' is not divisible by 2", hexdata)
+    for c in hexdata:
+        if c not in "0123456789abcdefABCDEF":
+            raise ValueError("'%s' is not a valid hex string", hexdata)
+    
+    temp = []
+    for i in xrange(len(hexdata) / 2):
+        start = i * 2
+        end   = start + 2 
+        temp.append(chr(int(hexdata[start:end], 16)))
+    return ''.join(temp)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/source/testautomation/testautomation/zip_dir.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+import os, re, zipfile
+
+SVN_IGNORE_PATTERN = r'(.*/|.*\\|^)\.svn(/.*|\\.*|$)'
+
+def zip_dir(source_dir, target_file, ignore_patterns=[]):
+    """
+    Archive the contents of a directory into a zip file.
+    """
+    if not os.path.isdir(source_dir):
+        raise RuntimeError("'%s' does not exist or is not a directory" % dir)
+
+    target_dir = os.path.dirname(target_file)
+    if target_dir != '' and not os.path.exists(target_dir):
+        os.makedirs(target_dir)
+    
+    def is_ignored(entry_name):
+        for pat in ignore_patterns:
+            if re.match(pat, entry_name) != None:
+                return True
+        return False
+    
+    zf = zipfile.ZipFile(target_file, 'w', compression=zipfile.ZIP_DEFLATED)
+    try:
+        source_dir = os.path.abspath(source_dir).replace('\\', '/')
+        if not source_dir.endswith('/'): source_dir += '/'
+        
+        empty_dirs = []
+        for root, dirs, files in os.walk(source_dir):
+            # Construct the ZIP entry name of the current directory
+            root_dir_zip_name = root.replace('\\', '/')[len(source_dir):] + '/'
+            
+            if is_ignored(root_dir_zip_name):
+                continue
+            
+            # Create a dictionary of the files that should be written to the
+            # ZIP file
+            filtered_files = {}
+            for fname in files:
+                if root_dir_zip_name == '/':    zip_name = fname
+                else:                           zip_name = root_dir_zip_name + fname
+                if not is_ignored(zip_name):
+                    filtered_files[zip_name] = os.path.join(root, fname)
+            
+            # If the current directory is a sub-directory of an empty directory candidate,
+            # remove the base directory from the sub-directory candidates
+            empty_dirs = filter(lambda n: not root_dir_zip_name.startswith(n), empty_dirs)
+            
+            if len(filtered_files) == 0:
+                # If there are no files, the directory is possibly an empty directory
+                # (though it can still contain sub-directories that contain something)
+                empty_dirs.append(root_dir_zip_name)
+            else:
+                for zip_name, path in filtered_files.iteritems():
+                    zf.write(path, zip_name, zipfile.ZIP_DEFLATED)
+            
+        # Write empty directories
+        for zip_name in empty_dirs:
+            zf.writestr(zip_name, '')
+    finally:
+        zf.close()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/update_svn_revision.py	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,53 @@
+# Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+
+import sys, re
+
+if len(sys.argv) not in (2, 3):
+    print "Expected 1 or 2 arguments: "
+    print "  <target_file> <revision> - Set revision to the supplied value"
+    print "  <target_file>            - Set revision to ''"
+    sys.exit(1)
+
+filename = sys.argv[1]
+
+if len(sys.argv) == 3:
+    svnrevision = sys.argv[2]
+    # Use the revision provided from command line only if it's valid
+    if re.match('^[0-9]+(:[0-9]+)?M?S?$', svnrevision) is None:
+        svnrevision = ''
+else:
+    svnrevision = ''
+
+f = open(filename, "rt")
+lines = f.readlines()
+f.close()
+
+# Replace the line with the svn revision variable
+replaced = False
+for i, line in enumerate(lines):
+    if line.startswith('_svnrevision = "'):
+        lines[i] = '_svnrevision = "%s"' % svnrevision
+        replaced = True
+    else:
+        lines[i] = line.rstrip('\r\n')
+
+if replaced:
+    f = open(filename, "wt")
+    for line in lines:
+        print >>f, line
+    f.close()
+    print "Revision updated to '%s'" % svnrevision
+else:
+    print "Revision not updated: _svnrevision not found"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/configurationengine/windows.properties	Thu Mar 11 17:04:37 2010 +0200
@@ -0,0 +1,1 @@
+os.windows.pythonlocationbase = E:/
\ No newline at end of file